在 python 中 Telethon 的第一步

pup*_*pet 1 api python-3.x telegram telethon

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

首先,您需要一个 api_id 和一个 api_hash。为此,您转到my.telegram并转到 API 开发工具。在那里你会收到一个代码到你的电报安卓手机,提交后,你会收到一个唯一的 id/hash。第一个问题,您发送此代码是为了生成一个需要的应用程序吗?

现在在python中,您可以按如下方式启动客户端。

from telethon import TelegramClient

api_id=12345
api_hash='abcdef12345ghij'

client=TelegramClient('name of the session',api_id,api_hash)
Run Code Online (Sandbox Code Playgroud)

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

如果电话未注册是可能的,这是否意味着您获得 ID/哈希的电话不一定与您创建客户端的电话相同?

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

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

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'))
Run Code Online (Sandbox Code Playgroud)

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

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

在代码中,这是可能的吗?

#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.
Run Code Online (Sandbox Code Playgroud)

最后两个问题

即使他们不尝试同时连接,您是否可以为同一个号码进行多个会话?例如,不同的 api/hash 在不同时间启动同一部手机,或者当第一个会话存储在电报中时,创建第二个会破坏第一个电报的链接?

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

亲切的问候

Lon*_*ami 7

发送此代码是为了生成不再需要的应用程序吗?

是的,就像许多提供 API 的在线服务一样,您注册您的开发者帐户并获得一个令牌(在 Telegram 的情况下,api_id以及api_hash组合)可用于访问 API(完全或有较少限制)。

您的应用程序绑定到您的用户帐户似乎有点令人困惑,但这并不意味着它只能在您的帐户中使用。您,开发人员,创建一个应用程序,任何其他用户(甚至机器人)都可以使用您的api_id和运行您的应用程序api_hash

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

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

Telegram 可能会向电话号码发送短信或拨打电话。您可以使用https://tl.telethon.dev发现发送代码在撰写本文时返回一个SentCode. 这带有一个SentCodeType当前可以指示:通过应用程序发送、呼叫、闪现呼叫或短信发送。

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

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

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

StringSession将生成的用于加密的授权密钥嵌入到字符串本身中。下次您使用客户端时,您只需要这个密钥,因为 Telegram 已经知道您是谁,因为您之前登录过。

如何指定要连接的手机?

没有必要。Telegram 会记住使用特定授权密钥登录的帐户。在官方客户端中,您可能会看到哪些设备已登录并终止它们的会话(使它们的授权密钥无效)以将它们注销。

这是您只能使用的方法,还是只能在手机获得访问权限后才能使用?

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

即使他们不尝试同时连接,您是否可以为同一个号码进行多个会话?

是的,这就是您使用 Telegram for Android 和 Telegram Desktop 时发生的情况。使用 Telethon 添加三分之一并没有什么不同。

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

不可以,因为 Telegram 需要验证电话是否存在并且正在使用中。