首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >python中的Telethon第一步

python中的Telethon第一步
EN

Stack Overflow用户
提问于 2020-05-07 12:16:49
回答 1查看 7.1K关注 0票数 2

好的,所以我一直打算用Telethon来用Python实现电报中的一些事情自动化,但我不确定我是否理解它的要点。

首先,您需要一个api_id和一个api_hash。要做到这一点,您可以使用my.telegram和API开发工具。在那里,您被发送到您的电报android手机的代码,并在提交后,您收到一个独特的id/散列。第一个问题,这段代码是为了生成应用程序而发送的吗?

现在,在python中,您可以启动客户机,如下所示。

代码语言:javascript
运行
复制
from telethon import TelegramClient

api_id=12345
api_hash='abcdef12345ghij'

client=TelegramClient('name of the session',api_id,api_hash)

您可以尝试连接客户端,但它可能导致它没有被授权或电话没有注册,所以您可以使用开始,这将决定是登录,还是注册。在开始时可以设置的参数中,有force_sms (bool, optional)强制电报共享通过短信注册和登录所需的代码。我在这里的问题是,如果电话没有注册,还有什么其他方式可以使用电报?我的意思是,他们不能把它发送到移动应用程序,因为那部手机没有一个。

如果没有注册电话是可能的,这是否意味着您获得id/散列的电话与您创建客户端的电话不一定相同?

由于此方法有一个回调,您可以输入发送到您的电话的代码,并连接到电报。

另一种连接客户端的方法是使用StringSession。我找到了一段代码:

代码语言:javascript
运行
复制
from telethon.sync import TelegramClient
from telethon.sessions import StringSession

# Generating a new one
with TelegramClient(StringSession(), api_id, api_hash) as client:
    print(client.session.save())

# Converting SQLite (or any) to StringSession
with TelegramClient(name, api_id, api_hash) as client:
    print(StringSession.save(client.session))

# Usage
string = '1aaNk8EX-YRfwoRsebUkugFvht6DUPi_Q25UOCzOAqzc...'
with TelegramClient(StringSession(string), api_id, api_hash) as client:
    client.loop.run_until_complete(client.send_message('me', 'Hi'))

这本身带来了几个问题。根据文档,这是一种将登录所需的凭据(包括授权密钥和电话)存储在字符串中的方法。

这是如何获得授权密钥的?在另一种方法中,它被发送到你的手机输入,但在这里?如何指定要连接的电话?这是一种你只能使用的方法,还是只有在手机被授予访问权限后才能使用?

在代码中,这有可能吗?

代码语言:javascript
运行
复制
#Obtain an api_id, api_hash from phone 777777777

from telethon import TelegramClient
from telethon.sessions import StringSession

api_id=12345
api_hash='abcdef12345ghij'    
client=TelegramClient('name of the session',api_id,api_hash)

client.start(phone='5555555',force_sms=True,code_callback=True,first_name='John',last_name='Doe')
#Asked to input the code sent to the phone 555555 by sms. Is this code the authentication key?

string = StringSession.save(client.session) #Now I can connect whenever I want using string session.

最后两个问题

对于同一个号码,您能有不止一个会话吗?即使他们不尝试同时连接?例如,不同的api/散列在不同的时间启动相同的电话,或者当第一次会话存储在电报中时,创建第二次访问会切断与第一次电报的链接?

您可以以任何方式跳过用于注册的验证代码吗?

亲切的问候

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-07 16:21:20

这段代码是为了生成应用程序而发送的吗?

是的,就像许多提供API的在线服务一样,您注册您的开发人员帐户,并获得一个令牌(在Telegram的例子中,api_idapi_hash组合),它可以用于访问API (完全或者限制较少)。

您的应用程序绑定到您的用户帐户似乎有点混乱,但这并不意味着它只能在您的帐户中使用。开发人员可以创建应用程序,任何其他用户(甚至bot)都可以使用api_idapi_hash运行应用程序。

例如,当您将Telegram用于Android或Telegram Desktop时,您正在运行他们开发的应用程序,并使用各自开发人员的api_idapi_hash登录,而不是您自己的应用程序。

如果电话没有注册,还有什么其他方式可以使用电报呢?

电报可以发送短信到电话号码或执行电话呼叫。您可以使用https://tl.telethon.dev发现在编写本报告时,发送码返回一个SentCode。这提供了一个SentCodeType,目前可以表明:通过应用程序发送,呼叫,闪存,或短信。

这是否意味着您获得id/散列的电话与您创建客户端的电话不一定相同?

如上所述,api_idapi_hash是面向应用程序的开发人员的,而不是将登录到应用程序的用户。当您开始工作时,这个人通常是同一个人(您,开发人员),但是当您发布应用程序时,任何人都可以登录,而不需要提供他们的api_idapi_hash。当然,您需要保守这些秘密,以尽量减少人们在应用程序中使用您的密钥,尽管这并不是真正可行的。

这是如何获得授权密钥的?

StringSession嵌入生成的授权密钥,用于字符串本身内的加密。下次当你使用客户端时,你所需要的就是这把钥匙,因为电报已经知道你是谁了,因为你之前已经登录了。

如何指定要连接的电话?

不必了。Telegram记得用某个授权密钥登录的帐户。在正式客户端中,您可能会看到哪些设备登录并终止其会话(使其授权密钥无效)以将其注销。

这是一种你只能使用的方法,还是只有在手机被授予访问权限后才能使用?

您也可以使用StringSession登录,只需打印它并在以后重用它。在这种情况下,StringSession将开始为空,Telethon将生成一个授权密钥,您将登录,并且保存会话将产生一些可以重用的内容。

对于同一个号码,您能有不止一个会话吗?即使他们不尝试同时连接?

是的,这就是当你使用诸如Android和Telegram Desktop的电报时所发生的事情。在Telethon中添加第三个并没有什么不同。

您可以以任何方式跳过用于注册的验证代码吗?

不,因为电报需要确认电话的存在和使用。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61657596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档