# noinspection PyUnresolvedReferences class Client: """Telethon Client,与 Telegram 互动的主要手段。 参数: session (``str``): 如果给出了字符串(它可以是完整路径)则将会保存 ``.session`` 文件;如果没有,则不会保存会话,并且在程序结束后,您应该调用 `client.log_out()` 。 请注意,如果传递字符串,则文件将保存为当前工作目录下,并且您还可以传递绝对路径。 api_id (``int`` | ``str``): 从 https://my.telegram.org 获取到的 *api_id* 。 api_hash (``str``, *optional*): 从 https://my.telegram.org 获取到的 *api_hash* 。 bot_token (``str``, *可选*): 如果设置了 Bot token,则将直接使用 Bot 身份登录。 app_version (``str``, *可选*): 应用版本号,默认设置为 `telethon.version.__version__` 。 device_model (``str``, *optional*): 设备型号,默认设置为 `·`platform.uname().machine` 。 system_version (``str``, *optional*): 操作系统版本,默认设置为 `platform.uname().release` 。 lang_code (``str``, *optional*): 客户端上使用的 ISO 639-1 标准的语言代码。默认为 “en”。 use_ipv6 (``bool``, *可选*): 如果设置为 `True` ,则将使用 ipv6 连接 Telegram 服务器。默认关闭 (通过 IPv4). proxy (``tuple``, ``str``, ``dict``, *可选*): MTProxy: `('hostname', port, 'secret')` ;socks5: `(socks.SOCKS5, "socks.example.com", 1080)` 获取更多 代理配置详情:https://github.com/Anorov/PySocks#usage-1 timeout (``int``, ``float``, *可选*): 设置链接超时所要等待的秒数。 flood_sleep_threshold (``int``, ``float``, *可选*): 设置当出现 `FloodWaitError` 时自动休眠应用程序的时间。 """ def start(self): """启动客户端(在必要时连接和登录)。 此方法将使客户端连接到 Telegram 服务器,如果是一个新的客户端,会自动进行交互式的授权过程。 返回: :obj:`~telethon.Client`: 启动的 client本身。 Raises: ConnectionError: 如果您尝试启动已启动客户端。 Example: .. code-block:: python :emphasize-lines: 4 from telethon.sync import TelegramClient, events app = Client("my_account", api_id, api_hash) app.start() # Call API methods app.disconnect() """ def disconnect(self): """断开客户端与 Telegram 服务器的连接。 此方法将客户端与 Telegram 服务器断开连接,并停止底层任务。 返回: :obj:`~telethon.Client`: 停止的 client本身。 Raises: OSError: 如果您尝试停止已停止的客户端。 Example: .. code-block:: python :emphasize-lines: 8 from telethon.sync import TelegramClient, events app = Client("my_account", api_id, api_hash) app.start() # Call API methods app.disconnect() """ # Message def send_message(self): """向指定的用户,群组或频道发送消息。 默认文本解析模式与官方应用程序相同(Markdown) 向 bot 发送 start 参数命令 (例如 ``?start=data``) 同样可行,请直接发送 ``/start data`` 。 参数: entity (:obj:`~telethon.tl.types.user` | :obj:`~telethon.tl.types.chat` | :obj:`~telethon.tl.types.channel`): 接收消息的对象 message (``str`` | :obj:`~telethon.tl.types.message`): 要发送的消息或消息对象。 消息的最大长度为 ``35,000`` 字节或 ``4,096`` 个字符。较长的消息不会自动分割,如果要发送的文本长于最大长度,则应手动分割。 reply_to (``int`` | :obj:`~telethon.tl.types.message`, *可选*): 要回复的消息 id 或者消息对象。 parse_mode (``str``, *可选*): 文本格式解析器配置。值支持 `markdown` (`md`), `html` (`htm`), `None`。 link_preview (``bool``, *可选*): 配置是否展示消息预览,默认开启。 buttons (``list``), *可选*): 配置消息按钮,参见示例,仅支持 bot 登录时。 限制: 最多可以有 ``100`` 个按钮(更多将被忽略)。 每行最多可以有 ``8`` 个按钮(更多将被忽略)。 按钮的最大回调数据为 ``64`` 字节。 silent (``bool``, *可选*): 配置是否静默消息,默认关闭。 schedule (``float``, *可选*): 配置是否定时消息,默认不配置。 返回: :obj:`~telethon.tl.types.message`: 成功则将返回已发送的消息。 Example: .. code-block:: python # 默认使用 Markdown 解析器解析文本。 await client.send_message('me', 'Hello **world**!') # 更改客户端的默认解析器。 client.parse_mode = 'html' await client.send_message('me', 'Some bold and italic text') await client.send_message('me', 'An URL') await client.send_message('me', 'Mentions') # 混合解析 client.parse_mode = None # 手动配置单条消息的解析器为 Markdown 。 await client.send_message('me', 'Hello, **world**!', parse_mode='md') # 手动配置单条消息的解析器为 Html 。 await client.send_message('me', 'Hello, world!', parse_mode='html') # 如果使用 Bot 登录,则您可以使用按钮: from telethon import events, Button @client.on(events.CallbackQuery) async def callback(event): await event.edit('感谢点击 {}!'.format(event.data)) # 单个按钮 await client.send_message(chat, '只是一个会回调 "clk1" 的按钮。', buttons=Button.inline('点我', b'clk1')) # 多个按钮 await client.send_message(chat, '选一个吧!', buttons=[ [Button.inline('回调'), Button.inline('这是回调')], [Button.url('访问网站', 'https://example.com')] ]) # 消息需要回复 await client.send_message(chat, '欢迎', buttons=[ Button.text('感谢!', resize=True, single_use=True), Button.request_phone('发送电话号码'), Button.request_location('发送位置') ]) # 强制回复或清除按钮。 await client.send_message(chat, '回复我', buttons=Button.force_reply()) await client.send_message(chat, '清楚按钮', buttons=Button.clear()) # 定时 5 分钟后发送消息 from datetime import timedelta await client.send_message(chat, '你好,未来!', schedule=timedelta(minutes=5)) """ def edit_message(self): """编辑指定消息,更改其文本或媒体文件。 参数: entity (:obj:`~telethon.tl.types.user` | :obj:`~telethon.tl.types.chat` | :obj:`~telethon.tl.types.channel`): 接收消息的对象 text (``str``, *可选*): 要编辑的消息文本。 消息的最大长度为 ``35,000`` 字节或 ``4,096`` 个字符。 message (``int`` | ``str`` | :obj:`~telethon.tl.types.message`, *可选*): 要编辑的消息 id 或者消息对象。 parse_mode (``str``, *可选*): 文本格式解析器配置。值支持 `markdown` (`md`), `html` (`htm`), `None`。 link_preview (``bool``, *可选*): 配置是否展示消息预览,默认开启。 file (``str``, ``bytes``, *可选*): 如果参数为 ``str`` ,则将再此路径下寻找文件(支持相对/绝对路径)。 请注意:如果原消息为纯文本时,配置此项将会报错。 buttons (``list``), *可选*): 配置消息按钮,参见示例,仅支持 bot 登录时。 限制: 最多可以有 ``100`` 个按钮(更多将被忽略)。 每行最多可以有 ``8`` 个按钮(更多将被忽略)。 按钮的最大回调数据为 ``64`` 字节。 schedule (``float``, *可选*): 配置是否定时消息,默认不配置。 Raises: MessageAuthorRequiredError: 如果您不是消息的发送者。 MessageNotModifiedError: 如果要编辑的消息和原消息一样。 MessageIdInvalidError: 如果消息的 ID 无效(消息 ID 本身可能是正确的,但无法编辑此 ID 对应的消息。) Example: .. code-block:: python message = await client.send_message(chat, '你好') await client.edit_message(chat, message, '你好!') # 或者 await client.edit_message(chat, message.id, '你好!!') # 或者 await client.edit_message(message, '你好!!!') """ def delete_messages(self): """删除指定消息。 参数: entity (:obj:`~telethon.tl.types.user` | :obj:`~telethon.tl.types.chat` | :obj:`~telethon.tl.types.channel`): 接收消息的对象 message_ids (``list`` | ``int`` | :obj:`~telethon.tl.types.message`, *可选*): 要删除的消息 id 列表或者单个消息 id 或者消息对象。 Example: .. code-block:: python await client.delete_messages(chat, messages) """ def forward_messages(self): """转发指定消息。 参数: entity (:obj:`~telethon.tl.types.user` | :obj:`~telethon.tl.types.chat` | :obj:`~telethon.tl.types.channel`): 接收消息的对象 message_ids (``list`` | ``int`` | :obj:`~telethon.tl.types.message`, *可选*): 要删除的消息 id 列表或者单个消息 id 或者消息对象。 from_peer (:obj:`~telethon.tl.types.user` | :obj:`~telethon.tl.types.chat` | :obj:`~telethon.tl.types.channel`): 指定转发消息的来源。如果 message_ids 传递的参数是数字。 silent (``bool``, *可选*): 配置是否静默消息,默认关闭。 schedule (``float``, *可选*): 配置是否定时消息,默认不配置。 返回: :obj:`~telethon.tl.types.message`: 成功则将返回已转发的消息。(如果转发的是一组消息,则返回列表) 请注意:批量转发时,如果所有需要转发的消息都无效(即删除)则会抛出 ``MessageIdInvalidError`` 错误; 如果只有一些消息无效,则只是返回的列表中没有这些消息。 Raises: MessageIdInvalidError: 如果消息的 ID 无效 Example: .. code-block:: python # 单条消息 await client.forward_messages(chat, message) # 或者 await client.forward_messages(chat, message_id, from_chat) # 或者 await message.forward_to(chat) # 多条消息 await client.forward_messages(chat, messages) # 作为一个副本发送(不带转发来源) await client.send_message(chat, message) """ def iter_messages(self): """搜索指定对话中的消息。 参数: entity (:obj:`~telethon.tl.types.user` | :obj:`~telethon.tl.types.chat` | :obj:`~telethon.tl.types.channel`): 需要检索的对话的对象 limit (``int`` | ``None``, *可选*): 限制要检索的消息数。由于API的限制,检索超过 ``3000`` 条消息将需要超过半分钟。 配置为 ``None`` ,并不会返回所有历史。 offset_date (``float``, *可选*): 将从此时间之前开始检索消息。 offset_id (``int``, *可选*): 将从此消息 id 之前开始检索消息。 max_id (``int``, *可选*): 配置要检索到的消息的最大 id 值。 min_id (``int``, *可选*): 配置要检索到的消息的最小 id 值。 search (``str``, *可选*): 配置检索的字符串。 filter (``MessagesFilter``, *可选*): 过滤消息类型。 from_user (:obj:`~telethon.tl.types.user`, *可选*) 指定消息发送者。 reverse (``bool``, *可选*): 如果设置为 ``True``,则消息将以相反的顺序返回。这意味着 ``offset_id`` 或者 ``offset_date`` 参数的含义是相反的。 ``min_id`` 等同于 ``offset_id`` 。 reply_to (``int``, *可选*): 返回频道消息的所有评论消息。 此功能只能用于链接了某个频道的*讨论组*。在其他对话中使用它将抛出 ``PeridInValiderror`` 错误。 使用此参数时,``filter`` 和 ``search`` 参数无效,因为 Telegram 的 API 不支持搜索回复中的消息。 Yields: 消息对象 :obj:`~telethon.tl.types.message` Raises: PeridInValiderror: 此对话不是链接了频道的讨论组。 Example: .. code-block:: python # 从最新消息开始检索 async for message in client.iter_messages(chat): print(message.id, message.text) # 从第一条消息开始检索 async for message in client.iter_messages(chat, reverse=True): print(message.id, message.text) # 只返回我发送的消息 async for message in client.iter_messages(chat, from_user='me'): print(message.text) # 通过 Telegram 服务器检索匹配的文本消息 async for message in client.iter_messages(chat, search='hello'): print(message.id) # 检索特定类型的消息(例如:图片) from telethon.tl.types import InputMessagesFilterPhotos async for message in client.iter_messages(chat, filter=InputMessagesFilterPhotos): print(message.photo) # 检索指定频道消息的评论 async for message in client.iter_messages(channel, reply_to=123): print(message.chat.title, message.text) """ def get_messages(self): """ 和 .. automethod:: telethon.Client.iter_messages() 一样,但是返回的是一个 ``List`` 。 Example: .. code-block:: python # 获取对话所有照片数 from telethon.tl.types import InputMessagesFilterPhotos photos = await client.get_messages(chat, None, filter=InputMessagesFilterPhotos) print(photos.total) # 通过消息 id 获取消息 message_1337 = await client.get_messages(chat, ids=1337) """ def pin_message(self): """置顶指定消息 参数: entity (:obj:`~telethon.tl.types.user` | :obj:`~telethon.tl.types.chat` | :obj:`~telethon.tl.types.channel`): 需要置顶的对话的对象。 message (``int`` | ``None`` | :obj:`~telethon.tl.types.message`, *可选*): 要置顶的消息 id 或者消息对象。如果值为 ``None``,则将取消置顶所有消息。 notify (``bool``, *可选*): 配置是否通知群成员。与官方应用程序不同,默认不通知所有成员。 Example: .. code-block:: python # 置顶消息 message = await client.send_message(chat, 'Pinotifying is fun!') await client.pin_message(chat, message, notify=True) """ def unpin_message(self): """取消置顶指定消息 参数: entity (:obj:`~telethon.tl.types.user` | :obj:`~telethon.tl.types.chat` | :obj:`~telethon.tl.types.channel`): 需要取消置顶的对话的对象。 message (``int`` | ``None`` | :obj:`~telethon.tl.types.message`, *可选*): 要置顶的消息 id 或者消息对象。如果值为 ``None``,则将取消置顶所有消息。 Example: .. code-block:: python # 取消置顶所有消息 await client.unpin_message(chat) """ def send_read_acknowledge(self): """将消息标记为已读,可选择是否清除提及提示。 如果不提供消息和 ``max_id`` ,则将标记所有消息为已读。 参数: entity (:obj:`~telethon.tl.types.user` | :obj:`~telethon.tl.types.chat` | :obj:`~telethon.tl.types.channel`): 需要标记已读的对话的对象。 message (``list`` | :obj:`~telethon.tl.types.message`, *可选*): 标记此消息及其之前的所有消息为已读。 max_id (``int``, *可选*): 标记此消息 id 及其之前的所有消息为已读。 clear_mentions (``bool``, *可选*): 配置是否清除提及按钮。 Example: .. code-block:: python # 使用消息对象 await client.send_read_acknowledge(chat, message) # 或者使用消息 id await client.send_read_acknowledge(chat, message_id) # 或者已读所有消息 await client.send_read_acknowledge(chat, messages) """ # Upload def send_file(self): """向指定对话发送文件。 .. note:: 安装 ``hachoir3`` 包(``hachoir`` 模块),它可以被用于获取音频和视频元信息。 安装 ``pillow`` 包,它可以自动调整图片尺寸以支持 Telegram 上传,但是,如果使用 ``InputFile`` 发送图片,则无法完成。 参数: entity (:obj:`~telethon.tl.types.user` | :obj:`~telethon.tl.types.chat` | :obj:`~telethon.tl.types.channel`): 需要发送文件的对话的对象。 file (``str`` | ``bytes`` | ``file`` | ``media``): 支持路径、包含文件的 ``bytes``、网络链接、``file_id``、文件句柄(例如 ``message.media``)。 caption (``str``, *可选*): 配置媒体文件的说明文字。 force_document (``bool``, *可选*): 强制以文件方式发送图片等。 reply_to (``int`` | :obj:`~telethon.tl.types.message`, *可选*): 要回复的消息 id 或者消息对象。 parse_mode (``str``, *可选*): 文本格式解析器配置。值支持 `markdown` (`md`), `html` (`htm`), `None`。 buttons (``list``), *可选*): 配置消息按钮,参见示例,仅支持 bot 登录时。 限制: 最多可以有 ``100`` 个按钮(更多将被忽略)。 每行最多可以有 ``8`` 个按钮(更多将被忽略)。 按钮的最大回调数据为 ``64`` 字节。 silent (``bool``, *可选*): 配置是否静默消息,默认关闭。 schedule (``float``, *可选*): 配置是否定时消息,默认不配置。 返回: :obj:`~telethon.tl.types.message`: 如果成功则返回消息对象。 Example: .. code-block:: python # 图片文件 await client.send_file(chat, '/my/photos/me.jpg', caption="It's me!") # 或者 await client.send_message(chat, "It's me!", file='/my/photos/me.jpg') # 语音文件 await client.send_file(chat, '/my/songs/song.mp3', voice_note=True) await client.send_file(chat, '/my/videos/video.mp4', video_note=True) # 自定义缩略图 await client.send_file(chat, '/my/documents/doc.txt', thumb='photo.jpg') # 文件 await client.send_file(chat, '/my/photos/photo.png', force_document=True) # 图辑 await client.send_file(chat, [ '/my/photos/holiday1.jpg', '/my/photos/holiday2.jpg', '/my/drawings/portrait.png' ]) # 提示上传进度 def callback(current, total): print('Uploaded', current, 'out of', total, 'bytes: {:.2%}'.format(current / total)) await client.send_file(chat, file, progress_callback=callback) # 骰子,包括飞镖和其他动态表情符号 from telethon.tl import types await client.send_file(chat, types.InputMediaDice('')) await client.send_file(chat, types.InputMediaDice('🎯')) # 联系人 await client.send_file(chat, types.InputMediaContact( phone_number='+34 123 456 789', first_name='Example', last_name='', vcard='' )) """ # Download def download_media(self): """下载消息对象包含的媒体文件。 .. note:: 如果下载太慢,则应考虑安装 ``cryptg`` (``pip3 install cryptg``) 参数: entity (:obj:`~telethon.tl.types.user` | :obj:`~telethon.tl.types.chat` | :obj:`~telethon.tl.types.channel`): 需要发送文件的对话的对象。 file (``str`` | ``file``): 输出文件路径,目录或流等对象。如果该路径存在并且是文件,则将覆盖。 返回: None: 如果消息中不存在媒体文件,如果为指定路径则将返回文件路径。 Example: .. code-block:: python path = await client.download_media(message) await client.download_media(message, filename) # 或者 path = await message.download_media() await message.download_media(filename) # 提示下载进度 def callback(current, total): print('Downloaded', current, 'out of', total, 'bytes: {:.2%}'.format(current / total)) await client.download_media(message, progress_callback=callback) """ # Users def get_me(self): """获取当前客户端所登录的用户信息。 返回: :obj:`~telethon.tl.types.user`: 如果成功则返回用户对象。 Example: .. code-block:: python me = await client.get_me() """ def get_entity(self): """获取指定对话信息。 .. note:: 使用此方法解析用户名不会自带缓存,对时间内您一般解析 ``50`` 个用户名就会收到请求过快错误。 推荐优先使用 .. automethod:: telethon.Client.get_input_entity() 来请求缓存的用户名数据。 参数: entity (``str`` | ``int``): 需要获取的对话的对象。 Raise: ValueError: 指定的对话不存在。 Return: :obj:`~telethon.tl.types.user` | :obj:`~telethon.tl.types.chat` | :obj:`~telethon.tl.types.channel`: 如果请求成功。 Example: .. code-block:: python from telethon import utils me = await client.get_entity('me') print(utils.get_display_name(me)) chat = await client.get_input_entity('username') async for message in client.iter_messages(chat): ... # 可以直接使用用户名 async for message in client.iter_messages('username'): ... # 请注意,您的联系人中必须拥有此电话号码才可以请求到数据。 some_id = await client.get_peer_id('+34123456789') """ def get_input_entity(self): """获取指定对话的对象。 参数: entity (``str`` | ``int``): 需要获取的对话的对象。 Raise: ValueError: 指定的对话不存在。 Example: .. code-block:: python user = await client.get_input_entity('username') chat = await client.get_input_entity(-123456789) """