🎉 Xtaothon - 新的开始

This commit is contained in:
xtaodada 2021-06-11 20:03:48 +08:00
parent 171c126c4a
commit 2e763ce880
No known key found for this signature in database
GPG Key ID: EE4DC37B55E24736
59 changed files with 2298 additions and 0 deletions

1
.gitignore vendored
View File

@ -127,3 +127,4 @@ dmypy.json
# Pyre type checker
.pyre/
.idea/

20
Makefile Normal file
View File

@ -0,0 +1,20 @@
# Minimal makefile for Sphinx documentation
#
# You can set these variables from the command line, and also
# from the environment for the first two.
SPHINXOPTS ?=
SPHINXBUILD ?= sphinx-build
SOURCEDIR = source
BUILDDIR = build
# Put it first so that "make" without argument is like "make help".
help:
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
.PHONY: help Makefile
# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

35
make.bat Normal file
View File

@ -0,0 +1,35 @@
@ECHO OFF
pushd %~dp0
REM Command file for Sphinx documentation
if "%SPHINXBUILD%" == "" (
set SPHINXBUILD=sphinx-build
)
set SOURCEDIR=source
set BUILDDIR=build
if "%1" == "" goto help
%SPHINXBUILD% >NUL 2>NUL
if errorlevel 9009 (
echo.
echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
echo.installed, then set the SPHINXBUILD environment variable to point
echo.to the full path of the 'sphinx-build' executable. Alternatively you
echo.may add the Sphinx directory to PATH.
echo.
echo.If you don't have Sphinx installed, grab it from
echo.http://sphinx-doc.org/
exit /b 1
)
%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
goto end
:help
%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
:end
popd

7
requirements.txt Normal file
View File

@ -0,0 +1,7 @@
sphinx
sphinx_rtd_theme
sphinx_copybutton
sphinx_tabs
pypandoc
requests
sphinx-autobuild

BIN
source/_images/big.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

BIN
source/_images/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
source/_images/xtaothon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

BIN
source/_static/big.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

File diff suppressed because one or more lines are too long

BIN
source/_static/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
source/_static/xtaothon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

View File

@ -0,0 +1,53 @@
:github_url: https://github.com/Xtao-Labs/docs-all
绑定方法
=============
某些 Telethon 类型定义了所谓的绑定方法。绑定方法是指附加到该类实例的类的函数。
.. code-block:: python
:emphasize-lines: 6
from telethon.sync import TelegramClient, events
app = Client("my_account", api_id, api_hash)
async def handler(context):
await context.reply('绑定方法。')
app.add_event_handler(handler, events.NewMessage(**args))
app.run_until_disconnected()
.. contents:: 目录
:backlinks: none
:local:
-----
.. currentmodule:: telethon.tl.types
消息
-------
.. hlist::
:columns: 3
- :meth:`~message.reply`
- :meth:`~message.forward_to`
- :meth:`~message.edit`
- :meth:`~message.delete`
- :meth:`~message.mark_read`
- :meth:`~message.pin`
- :meth:`~message.unpin`
.. toctree::
:hidden:
message.reply <message.reply>
message.forward_to <message.forward_to>
message.edit <message.edit>
message.delete <message.delete>
message.mark_read <message.mark_read>
message.pin <message.pin>
message.unpin <message.unpin>

View File

@ -0,0 +1,4 @@
message.delete()
==================
.. automethod:: telethon.tl.types.message.delete()

View File

@ -0,0 +1,4 @@
message.edit()
================
.. automethod:: telethon.tl.types.message.edit()

View File

@ -0,0 +1,6 @@
:github_url: https://github.com/Xtao-Labs/docs-all
message.forward_to()
=======================
.. automethod:: telethon.tl.types.message.forward_to()

View File

@ -0,0 +1,6 @@
:github_url: https://github.com/Xtao-Labs/docs-all
message.mark_read()
======================
.. automethod:: telethon.tl.types.message.mark_read()

View File

@ -0,0 +1,6 @@
:github_url: https://github.com/Xtao-Labs/docs-all
message.pin()
=================
.. automethod:: telethon.tl.types.message.pin()

View File

@ -0,0 +1,6 @@
:github_url: https://github.com/Xtao-Labs/docs-all
message.reply()
==================
.. automethod:: telethon.tl.types.message.reply()

View File

@ -0,0 +1,6 @@
:github_url: https://github.com/Xtao-Labs/docs-all
message.unpin()
===================
.. automethod:: telethon.tl.types.message.unpin()

29
source/api/client.rst Normal file
View File

@ -0,0 +1,29 @@
:github_url: https://github.com/Xtao-Labs/docs-all
客户端
========
您已进入API参考部分您可以在其中找到有关 Telethon 的 API 的详细信息。
此页面是关于 Client 类的,它公开了一些高级方法,以便更加轻松访问 API 。
.. code-block:: python
:emphasize-lines: 1-3
from telethon.sync import TelegramClient, events
app = Client("my_account", api_id, api_hash)
async def handler(context):
print(context.text)
app.add_event_handler(handler, events.NewMessage(**args))
app.run_until_disconnected()
-----
详细信息
-------------
.. autoclass:: telethon.Client()

45
source/api/handlers.rst Normal file
View File

@ -0,0 +1,45 @@
:github_url: https://github.com/Xtao-Labs/docs-all
消息更新处理器
===============
Handlers 用于告诉 Telethon 处理哪种类型的消息更新。
.. code-block:: python
:emphasize-lines: 8, 10
from telethon.sync import TelegramClient, events
app = Client("my_account", api_id, api_hash)
async def handler(context):
print(context.text)
app.add_event_handler(handler, events.NewMessage(**args))
app.run_until_disconnected()
.. contents:: 目录
:backlinks: none
:depth: 1
:local:
-----
.. currentmodule:: telethon.events
索引
-----
.. hlist::
:columns: 3
- :class:`NewMessage`
-----
详细信息
----------
.. Handlers
.. autoclass:: NewMessage()

View File

@ -0,0 +1,6 @@
:github_url: https://github.com/Xtao-Labs/docs-all
delete_messages()
==================
.. automethod:: telethon.Client.delete_messages()

View File

@ -0,0 +1,6 @@
:github_url: https://github.com/Xtao-Labs/docs-all
disconnect()
==================
.. automethod:: telethon.Client.disconnect()

View File

@ -0,0 +1,6 @@
:github_url: https://github.com/Xtao-Labs/docs-all
download_media()
==================
.. automethod:: telethon.Client.download_media()

View File

@ -0,0 +1,6 @@
:github_url: https://github.com/Xtao-Labs/docs-all
edit_message()
==================
.. automethod:: telethon.Client.edit_message()

View File

@ -0,0 +1,6 @@
:github_url: https://github.com/Xtao-Labs/docs-all
forward_messages()
==================
.. automethod:: telethon.Client.forward_messages()

View File

@ -0,0 +1,6 @@
:github_url: https://github.com/Xtao-Labs/docs-all
get_entity()
==================
.. automethod:: telethon.Client.get_entity()

View File

@ -0,0 +1,6 @@
:github_url: https://github.com/Xtao-Labs/docs-all
get_input_entity()
==================
.. automethod:: telethon.Client.get_input_entity()

View File

@ -0,0 +1,6 @@
:github_url: https://github.com/Xtao-Labs/docs-all
get_me()
==================
.. automethod:: telethon.Client.get_me()

View File

@ -0,0 +1,6 @@
:github_url: https://github.com/Xtao-Labs/docs-all
get_messages()
==================
.. automethod:: telethon.Client.get_messages()

View File

@ -0,0 +1,110 @@
:github_url: https://github.com/Xtao-Labs/docs-all
可用方法
=================
此页面是关于 Telethon 方法的。这里列出的所有方法都绑定到 :class:`~telethon.Client` 类。
.. code-block:: python
:emphasize-lines: 4
from telethon.sync import TelegramClient, events
with TelegramClient('name', api_id, api_hash) as client:
client.send_message('me', 'Hello, myself!')
.. contents:: 目录
:backlinks: none
:local:
-----
.. currentmodule:: telethon.Client
基础
---------
.. autosummary::
:nosignatures:
start <start>
disconnect <disconnect>
.. toctree::
:hidden:
start <start>
disconnect <disconnect>
消息
---------
.. autosummary::
:nosignatures:
send_message <send_message>
edit_message <edit_message>
delete_messages <delete_messages>
forward_messages <forward_messages>
iter_messages <iter_messages>
get_messages <get_messages>
pin_message <pin_message>
unpin_message <unpin_message>
send_read_acknowledge <send_read_acknowledge>
.. toctree::
:hidden:
send_message <send_message>
edit_message <edit_message>
delete_messages <delete_messages>
forward_messages <forward_messages>
iter_messages <iter_messages>
get_messages <get_messages>
pin_message <pin_message>
unpin_message <unpin_message>
send_read_acknowledge <send_read_acknowledge>
上传
---------
.. autosummary::
:nosignatures:
send_file <send_file>
.. toctree::
:hidden:
send_file <send_file>
下载
---------
.. autosummary::
:nosignatures:
download_media <download_media>
.. toctree::
:hidden:
download_media <download_media>
用户
---------
.. autosummary::
:nosignatures:
get_me <get_me>
get_entity <get_entity>
get_input_entity <get_input_entity>
.. toctree::
:hidden:
get_me <get_me>
get_entity <get_entity>
get_input_entity <get_input_entity>

View File

@ -0,0 +1,6 @@
:github_url: https://github.com/Xtao-Labs/docs-all
iter_messages()
==================
.. automethod:: telethon.Client.iter_messages()

View File

@ -0,0 +1,6 @@
:github_url: https://github.com/Xtao-Labs/docs-all
pin_message()
==================
.. automethod:: telethon.Client.pin_message()

View File

@ -0,0 +1,6 @@
:github_url: https://github.com/Xtao-Labs/docs-all
send_file()
==================
.. automethod:: telethon.Client.send_file()

View File

@ -0,0 +1,6 @@
:github_url: https://github.com/Xtao-Labs/docs-all
send_message()
==================
.. automethod:: telethon.Client.send_message()

View File

@ -0,0 +1,6 @@
:github_url: https://github.com/Xtao-Labs/docs-all
send_read_acknowledge()
========================
.. automethod:: telethon.Client.send_read_acknowledge()

View File

@ -0,0 +1,6 @@
:github_url: https://github.com/Xtao-Labs/docs-all
start()
=======
.. automethod:: telethon.Client.start()

View File

@ -0,0 +1,6 @@
:github_url: https://github.com/Xtao-Labs/docs-all
unpin_message()
==================
.. automethod:: telethon.Client.unpin_message()

View File

@ -0,0 +1,6 @@
:github_url: https://github.com/Xtao-Labs/docs-all
Channel()
==================
.. autoclass:: telethon.tl.types.channel()

View File

@ -0,0 +1,6 @@
:github_url: https://github.com/Xtao-Labs/docs-all
Chat()
==================
.. autoclass:: telethon.tl.types.chat()

View File

@ -0,0 +1,33 @@
:github_url: https://github.com/Xtao-Labs/docs-all
可用类型
=================
这是客户端方法或其他模块返回的对象的快速参考。
.. contents:: 目录
:backlinks: none
:local:
-----
.. currentmodule:: telethon.tl.types
消息
---------
.. autosummary::
:nosignatures:
message <message>
user <user>
chat <chat>
channel <channel>
.. toctree::
:hidden:
message <message>
user <user>
chat <chat>
channel <channel>

View File

@ -0,0 +1,6 @@
:github_url: https://github.com/Xtao-Labs/docs-all
Message()
==================
.. autoclass:: telethon.tl.types.message()

View File

@ -0,0 +1,6 @@
:github_url: https://github.com/Xtao-Labs/docs-all
User()
==================
.. autoclass:: telethon.tl.types.user()

112
source/conf.py Normal file
View File

@ -0,0 +1,112 @@
# Configuration file for the Sphinx documentation builder.
#
# This file only contains a selection of the most common options. For a full
# list see the documentation:
# https://www.sphinx-doc.org/en/master/usage/configuration.html
# -- Path setup --------------------------------------------------------------
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#
import os
import sys
from datetime import datetime
from pygments.styles.friendly import FriendlyStyle
sys.path.insert(0, os.path.abspath('.'))
FriendlyStyle.background_color = "#f3f2f1"
# -- Project information -----------------------------------------------------
project = 'xtaothon'
project_copyright = f'2020-{datetime.now().year}, xtao-labs'
author = 'xtao-labs'
# The full version, including alpha/beta/rc tags
release = '1.21.1'
# -- General configuration ---------------------------------------------------
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
"sphinx.ext.autodoc",
"sphinx.ext.napoleon",
"sphinx.ext.autosummary",
"sphinx_copybutton",
"sphinx_tabs.tabs"
]
master_doc = "index"
source_suffix = ".rst"
autodoc_member_order = "bysource"
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = 'zh_CN'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This pattern also affects html_static_path and html_extra_path.
exclude_patterns = []
# -- Options for HTML output -------------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#
html_theme = 'sphinx_rtd_theme'
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
napoleon_use_rtype = False
pygments_style = "friendly"
copybutton_prompt_text = "$ "
html_css_files = [
'css/theme.css',
]
html_title = "Xtaothon Documentation"
html_show_sourcelink = True
html_show_copyright = False
html_theme_options = {
"canonical_url": "https://docs.xtaolabs.com/",
"collapse_navigation": True,
"sticky_navigation": False,
"logo_only": True,
"display_version": True,
"style_external_links": True,
}
napoleon_use_param = False
html_logo = "_images/xtaothon.png"
html_favicon = "_images/favicon.ico"
latex_engine = "xelatex"
latex_logo = "_images/xtaothon.png"
latex_elements = {
"pointsize": "12pt",
"fontpkg": r"""
\setmainfont{Open Sans}
\setsansfont{Bitter}
\setmonofont{Ubuntu Mono}
"""
}

124
source/faq.rst Normal file
View File

@ -0,0 +1,124 @@
:github_url: https://github.com/Xtao-Labs/docs-all
FAQ
============
.. role:: strike
:class: strike
此常见问题解答页面提供了有关 Telethon 的常见问题的答案。
.. contents:: 目录
:backlinks: none
:depth: 1
:local:
-----
为什么什么都不提示?
----------------------------
那么它可能有错误,但你还没有启用日志记录。 要启用日志记录,请在主文件顶部添加以下代码:
.. code-block:: python
import logging
logging.basicConfig(format='[%(levelname) 5s/%(asctime)s] %(name)s: %(message)s',
level=logging.WARNING)
您可以将日志记录级别更改为不同的内容,从较少信息到更多信息:
.. code-block:: python
level=logging.CRITICAL # 不会显示错误(与禁用相同)
level=logging.ERROR # 只会显示你没有处理的错误
level=logging.WARNING # 还将显示中等严重性的消息,例如内部 Telegram 问题
level=logging.INFO # 还将显示信息性消息,例如连接或断开连接
level=logging.DEBUG # 将显示大量输出以帮助调试库中的问题
我怎样才能过滤 FloodWaitError
-----------------------------------------
您可以通过导入 API 中的自定义错误来过滤:
.. code-block:: python
from telethon import errors
try:
await client.send_message(chat, 'Hi')
except errors.FloodWaitError as e:
# e.seconds 是您被限制了多少秒才能重新调用此 API 。
print('Flood for', e.seconds)
使用 Telethon 时我的帐户被删除/限制
------------------------------------------
如果您出于恶意使用 Telethon Telegram 可能会禁止您。
但是,您也可能是某个限制国家/地区的一部分,例如伊朗或俄罗斯。在这种情况下,我们有一个坏消息要告诉你。
Telegram 更有可能禁止这些号码,因为它们经常被用来向其他帐户发送垃圾消息,并且可能是通过使用这样的库。
我们可以给您的最佳建议是不要滥用 API例如非常快速地调用许多请求并且建议您通过官方应用程序注册账户。
我们也收到了来自哈萨克斯坦和中国的报告,在那里会无法连接 Telegram 服务器。要解决这些连接问题,您应该:doc:`使用代理 <topics/proxy>`
Telegram 还可能禁止虚拟 (VoIP) 电话号码,因为它们很可能被用于发送垃圾消息。
如果您想检查您的帐户是否受到限制,只需向 Telegram 官方 Bot ``@SpamBot`` 发送消息即可。
您应该通过收到 ``PeerFloodError`` 之类的错误来注意到这一点,这意味着您受到限制。
sqlite3.OperationalError: database is locked
---------------------------------------------------------
较旧的进程仍在运行并使用相同的 “session” 文件。
当两个或多个客户端使用同一个会话时,会出现此错误:
您有一个使用相同会话文件的旧进程。
您有两个不同的脚本正在运行(交互式会话也算在内)。
您在同一脚本中有两个客户端同时运行。
解决方案是,如果您需要两个客户端,请使用两个会话。如果问题仍然存在并且您使用的是 Linux则可以使用 ``fuser my.session`` 找出锁定文件的进程。
作为最后的手段,您可以重新启动系统。
event.chat or event.sender is None
-----------------------------------------
Telegram 为节省带宽并不总是发送此信息。如果您需要这些信息,您应该自己获取,因为除非您需要,否则库不会做不必要的工作:
.. code-block:: python
async def handler(event):
chat = await event.get_chat()
sender = await event.get_sender()
我想将我的帐户从 DCX 迁移到 DCY 。
---------------------------------------------
首次注册帐户时,由 Telegram 根据电话号码来源决定将在哪个 DC 中创建新用户。
尽管 `Telegram 文档 <https://core.telegram.org/api/datacenter#user-migration>`_ 说明:服务器可能会自动迁移用户,
尽管 Telegram 本身也 `确认 <https://twitter.com/telegram/status/427131446655197184>`_ 存在此机制,但目前无法在任何情况下手动迁移您的帐户。
仅仅是因为该功能曾经计划但尚未实施。
感谢 `@gabriel <https://t.me/AnotherGroup/217699>`_ 确认该功能尚未实现。
为什么我的客户端在超级群组中反应缓慢?
---------------------------------------
此问题仅影响某些超级群组或超级群组中的某些成员。
由于 Telegram 内部的工作方式,您从其他成员接收和发送给其他成员的每条消息都必须通过群组创建者的 DC在最坏的情况下你、创建者和其他成员属于三个不同的
DC其他成员的消息必须从他的 DC 传递到创建者的 DC最后到达您的 DC。这个过程将不可避免地需要时间。
另一个导致响应缓慢的原因是消息是 **按优先级调度** 的。 根据成员身份,一些用户比其他用户更快地接收消息,对于大而繁忙的超级群组,延迟可能会变得
令人注意,特别是如果您属于优先级列表的低端:
1. 创建者。
2. 管理员。
3. Bots。
4. 提及到的用户。
5. 近期在线用户。
6. 其他成员。
感谢 `@Manuel15 <https://t.me/PyrogramChat/76990>`_ 提供优先级列表

53
source/glossary.rst Normal file
View File

@ -0,0 +1,53 @@
:github_url: https://github.com/Xtao-Labs/docs-all
常见短语
=================
此页面包含常见短语列表。
.. contents:: 目录
:backlinks: none
:depth: 1
:local:
-----
列表
-----
.. glossary::
:sorted:
API
应用程序编程接口:一组方法、协议和工具,通过为开发人员提供实用的组件,使程序开发变得更容易。
API key
用于向 Telegram ``验证`` 和/或 ``授权`` 特定应用程序的密码,以便其控制 API 的使用方式,例如,防止滥用 API。
:doc:`API keys <intro/quickstart>`
DC
也称为 *数据中心* ,是一个放置大量计算机系统并一起使用以实现服务的高质量和可用性的地方。
RPC
远程过程调用的首字母缩写词,即在某个远程位置(即 Telegram 服务器)而不是在您的本地机器上执行的函数。
RPCError
由 RPC 引起的错误,必须返回以代替成功的结果,以便让调用者知道出现问题。
Bot API
Telegram Bot API 只能使用 HTTP 作为应用层协议将普通机器人连接到 Telegram并允许执行 Telegram API 。
Userbot
也称为 *user bot* 或简称 *ubot*,是通过第三方 Telegram 库登录的用户 --- 例如
Telethon --- 自动执行某些行为,例如发送消息或对文本命令作出反应或任何其他事件。不要与 *bot* 混淆,即由
`@BotFather <https://t.me/botfather>`_ 创建的普通 Telegram bot 。
Session
也称为 *登录会话* ,是由双方(客户端和服务器)创建和持有的严格个人数据,用于向单个帐户授予权限,而无需从头开始新的授权过程。
Callback
也称为 *回调函数* ,是一个用户定义的通用函数, *可以* 注册到框架,然后在发生特定事件时由框架回调。
Handler
一个环绕回调函数的对象,该函数 *实际上意味着* 要注册到框架中,然后将能够处理特定类型的事件,例如新传入的消息。
:doc:`消息更新处理器 <start/updates>`.

132
source/index.rst Normal file
View File

@ -0,0 +1,132 @@
:github_url: https://github.com/Xtao-Labs/docs-all
欢迎来到 Xtaothon
===================
.. raw:: html
<div align="center">
<a href="/">
<div><img src="_static/xtaothon.png" alt="Xtaothon Logo" width="420"></div>
</a>
</div>
<p align="center">
<b>Telegram MTProto API Framework for Python</b>
<br>
<a href="https://github.com/LonamiWebs/Telethon">
Source Code
</a>
<a href="https://github.com/LonamiWebs/Telethon/releases">
Releases
</a>
<a href="https://t.me/Telethon_CN_Chat">
Community
</a>
</p>
.. code-block:: python
from telethon.sync import TelegramClient, events
with TelegramClient('name', api_id, api_hash) as client:
client.send_message('me', 'Hello, myself!')
print(client.download_profile_photo('me'))
@client.on(events.NewMessage(pattern='(?i).*Hello'))
async def handler(event):
await event.reply('Hey!')
client.run_until_disconnected()
Telegram 是一款十分受欢迎的简洁的即时通讯软件。**Telethon** 旨在使您能够轻松使用 `Python` 编写可以与 Telegram_ 进行交互的 Python 程序。
.. _Telegram: https://telegram.org
快速使用这篇文档
----------------------------------
内容总共被分成几大独立主题,这些主题可以从侧边栏或通过页面下方的 :guilabel:`下一项` 按钮来访问。
下方我们提供了几个常用的主题以供快速访问。
.. admonition :: 云服务器优惠
:class: tip
如果您需要服务器来托管您的程序我们推荐使用 **NSD Cloud**. 通过
`链接 <https://nsdcloud.net/aff.php?aff=2>`_ 注册就可以帮助 Xtaothon 。
出发
^^^^^^^^^^^
.. hlist::
:columns: 2
- :doc:`快速开始 <intro/quickstart>`: 快速使用 Telethon 创建一个应用程序。
- :doc:`调用方法 <start/invoking>`: 快速调用 Telethon 的内置方法来与 Telegram 交互。
- :doc:`处理消息 <start/updates>`: 快速处理来自 Telegram 的新消息。
API
^^^^^^^^^^^^^
.. hlist::
:columns: 2
- :doc:`Telethon Client <api/client>`: Client 类的详细可配置参数。
- :doc:`内置方法 <api/methods/index>`: 可用的高级方法列表。
- :doc:`内置类型 <api/types/index>`: 可用的高级类型列表。
- :doc:`绑定方法 <api/bound-methods/index>`: 方便的绑定方法列表。
更多
^^^^
.. hlist::
:columns: 2
- :doc:`Telethon FAQ <faq>`: Telethon 常见问题。
- :doc:`常见短语 <glossary>`: 一些常见短语的释意。
- :doc:`支持 Xtaothon <support>`: 支持 Xtaothon 的方式。
最后更新于 |today|
.. toctree::
:hidden:
:caption: 简介
intro/quickstart
intro/install
.. toctree::
:hidden:
:caption: 开始
start/auth
start/invoking
start/updates
.. toctree::
:hidden:
:caption: API
api/client
api/methods/index
api/types/index
api/bound-methods/index
api/handlers
.. toctree::
:hidden:
:caption: 主题指南
topics/proxy
topics/text-formatting
.. toctree::
:hidden:
:caption: 更多
faq
glossary
support

51
source/intro/install.rst Normal file
View File

@ -0,0 +1,51 @@
:github_url: https://github.com/Xtao-Labs/docs-all
安装指南
=============
**Telethon** 所需要的 Python 的版本至少为 3.5 。我们推荐您使用最新的 Python 和 pip 版本。
- 从 https://www.python.org/downloads/ 中下载 **Python 3** (或者使用系统包管理器)。
- 从 https://pip.pypa.io/en/latest/installing/ 中安装 **pip**
.. important::
Telethon 仅支持 **Python 3.5+**
.. contents:: 目录
:backlinks: none
:depth: 1
:local:
-----
安装
----------------
- 将 Telethon 安装和升级到其最新稳定版本的最简单方法是使用 **pip**:
.. code-block:: text
$ python3 -m pip install --upgrade telethon
安装开发版本
-------------
如果您希望尝试新功能,则可以运行以下命令安装开发版本:
.. important::
开发版本可能会发生错误,不建议用于生产环境。
.. code-block:: text
$ python3 -m pip install --upgrade https://github.com/LonamiWebs/Telethon/archive/master.zip
验证安装
---------
要验证是否正确安装了 Telethon ,请运行以下命令:(如果没有错误显示即安装成功)
.. code-block:: text
$ python3 -c "import telethon; print(telethon.__version__)"

View File

@ -0,0 +1,44 @@
:github_url: https://github.com/Xtao-Labs/docs-all
快速开始
===========
通过下面的步骤您就可以创建一个 Telethon 应用程序了,快开始吧!
安装 Telethon
----------------------
1. 使用命令 ``pip3 install -U telethon`` 安装 Telethon 。
2. 打开网站 https://my.telegram.org/apps :doc:`申请属于您自己的 Telegram API key <../start/auth>`
3. 打开文本编辑器并粘贴以下内容:
.. code-block:: python
from telethon.sync import TelegramClient, events
api_id = 12345
api_hash = "0123456789abcdef0123456789abcdef"
with TelegramClient('name', api_id, api_hash) as client:
client.send_message('me', 'Hello, myself!')
4. 用您在第二步生成的值替换 *api_id**api_hash*
5. 报错文件名为 ``main.py``
6. 使用命令 ``python3 main.py`` 开始运行。
7. 通过控制台提示进行账户授权。
8. 加入我们的 `交流社区`_.
享受 API
-------------
这只是运行 Telethon 的一个简单例子,在接下来的文档中,我们可以学习使用更加高级的方法。
想要继续学习吗? 你可以点击 :doc:`调用方法 <../start/invoking>` 继续学习。
.. _交流社区: https://t.me/Telethon_CN_Chat

65
source/start/auth.rst Normal file
View File

@ -0,0 +1,65 @@
:github_url: https://github.com/Xtao-Labs/docs-all
授权
=============
本节教程将会教会您如何使用 Telethon 登录 Bot 或者 User 。
.. contents:: 目录
:backlinks: none
:depth: 1
:local:
-----
API key
------------------
:doc:`快速开始 <../intro/quickstart>` 中需要您申请属于您自己的 Telegram API key 。
#. 访问 https://my.telegram.org/apps 并且使用您的 Telegram 账户登录。
#. 填写表格以注册新的 Telegram 应用程序。
#. 完成! API key 由这两个值组成: **api_id****api_hash**.
.. note::
API key 对每个用户是唯一的,并且仅一个值就可以授权多个 User (和 bot 通过 MTProto API 访问 Telegram 数据库。
登录
------------------
为了使用这个 API, Telegram 要求用户通过电话号码授权。
Telethon 将会自动处理此过程,您需要做的只是创建一个实例 :class:`~telethon.Client` 类并且定义一个 ``session_name`` (e.g.: "my_account")
并且调用 :meth:`~telethon.Client.start` 方法:
.. code-block:: python
from telethon import TelegramClient
client = TelegramClient('my_account', api_id, api_hash)
# 使用 Bot token 登录
await client.start(bot_token='bot_token')
# 使用 User 账户登录
await client.start()
# Enter phone number: +86**********
# Please enter the code you received: 12345
# Please enter your password: *******
# (You are now logged in)
# 使用一个 context manager 来登录 (这相当于直接调用 start()):
with client:
pass
这会创建一个交互 Shell 要求您输入 **电话号码** (包括您的 `国家代码`_) 和 **验证码**:
成功登录后,将创建一个名为 ``my_account.session`` 的新文件,允许 Telethon 使用您的登录的账户信息执行 API。
重新启动应用程序时将自动加载此文件只要您的账户登录文件还是可用的Telethon 将不会要求您重新登录。
.. important::
您的 ``*.session`` 文件是私密的并且必须保证安全。
.. _国家代码: https://en.wikipedia.org/wiki/List_of_country_calling_codes

93
source/start/invoking.rst Normal file
View File

@ -0,0 +1,93 @@
:github_url: https://github.com/Xtao-Labs/docs-all
调用方法
===============
此时,我们已成功 :doc:`安装 Telethon <../intro/install>` 并且 :doc:`授权 <auth>` 了我们的帐户。
是时候开始调用 API 与 Telegram 交互了!
.. contents:: 目录
:backlinks: none
:depth: 1
:local:
-----
基础用法
-----------
使用 Telegram 进行 API 方法调用非常简单。下面是我们将逐步讲解的基本示例代码:
.. code-block:: python
from telethon.sync import TelegramClient, events
app = TelegramClient("my_account", api_id, api_hash)
async def main():
await client.send_message('me', 'Hello, myself!')
with app:
app.loop.run_until_complete(main())
逐步讲解
^^^^^^^^^^^^^^^^^^
#. 导入 Client 类:
.. code-block:: python
from telethon.sync import TelegramClient, events
#. 现在实例化一个新的 Client 对象:
.. code-block:: python
app = TelegramClient("my_account", api_id, api_hash)
#. 定义客户端要执行的 main 函数:
.. code-block:: python
async def main():
# 给自己发送 “Hello, myself!”
await client.send_message('me', 'Hello, myself!')
#. ``with`` context manager 是启动,执行和停止客户端的快捷方式:
.. code-block:: python
with app:
#. 现在你可以调用 main 函数:
.. code-block:: python
app.loop.run_until_complete(main())
Context Manager
---------------
``with`` 语句启动一个 context manager ,用作自动调用 :meth:`~telethon.Client.start`
:meth:`~telethon.Client.disconnect`,这是 Telethon 正常工作所需的方法。context manager 也会优雅地停止客户端,
即使您的代码中出现了未处理的异常时也是如此。
异步调用
------------------
.. important::
请注意Telethon 是一个异步库,因此,您应该习惯它并学习一些基本的 asyncio 。这将对您编写应用程序有很大的帮助。
.. code-block:: python
from telethon.sync import TelegramClient, events
app = TelegramClient("my_account", api_id, api_hash)
async def main():
await client.send_message('me', 'Hello, myself!')
with app:
app.loop.run_until_complete(main())

42
source/start/updates.rst Normal file
View File

@ -0,0 +1,42 @@
:github_url: https://github.com/Xtao-Labs/docs-all
处理消息
================
手动调用 :doc:`API 方法 <invoking>` 非常方便,但是如何让程序在新消息到达时做出反应呢?
此页面将告诉您 Telethon 如何处理更新以及如何在 Telethon 中处理此类事件。让我们来看看它们是如何工作的。
.. contents:: 目录
:backlinks: none
:depth: 1
:local:
-----
定义处理程序
----------------
首先您需要在 :doc:`Handlers <../api/handlers>` 中找到需要处理的事件的处理程序。
每个处理程序处理特定事件。支持同一事件注册多个回调函数。
注册处理程序
---------------------
使用 add_handler()
^^^^^^^^^^^^^^^^^^^
使用 :meth:`~pyrogram.client.add_handler` 方法注册新的处理程序:
.. code-block:: python
from telethon.sync import TelegramClient, events
app = Client("my_account", api_id, api_hash)
async def handler(context):
print(context.text)
app.add_event_handler(handler, events.NewMessage(**args))
app.run_until_disconnected()

35
source/support.rst Normal file
View File

@ -0,0 +1,35 @@
:github_url: https://github.com/Xtao-Labs/docs-all
支持 Xtaothon
================
作为开发人员,您可能理解“开源”并不意味着“免费工作”。您的支持意义重大,有助于保持我们更新的动力!
-----
Star
----
Xtaothon 是一个第三方免费开源文档,并且由您的爱和支持驱动!如果您喜欢该项目并发现它很有用,请在 GitHub 上给 Xtaothon 一个 `Star`_.
赞助
------
您可以通过微信/支付宝赞助我们:
.. raw:: html
<form action="https://afdian.net/@xtaodada" method="get" target="_top">
<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif" border="0" name="submit" title="Afadian Donate!" alt="Donate" />
<img alt="" border="0" src="https://www.paypal.com/en_IT/i/scr/pixel.gif" width="1" height="1" />
</form>
-----
云服务器优惠
-------------
如果您需要服务器来托管您的程序我们推荐使用 **NSD Cloud**. 通过
`链接 <https://nsdcloud.net/aff.php?aff=2>`_ 注册就可以帮助 Xtaothon 。
.. _Star on GitHub: https://github.com/Xtao-Labs/docs-all

40
source/topics/proxy.rst Normal file
View File

@ -0,0 +1,40 @@
:github_url: https://github.com/Xtao-Labs/docs-all
SOCKS5 Proxy
============
Telethon 支持带有或者不带有验证的代理。
.. contents:: 目录
:backlinks: none
:depth: 1
:local:
-----
使用
-----
- 您可以使用 Client 类中的 *proxy* 参数来设置代理:
.. code-block:: python
from telethon.sync import TelegramClient
import socks
app = Client(
session_name="example",
proxy=(
socks.SOCKS5,
"socks.example.com",
1080,
username="<your_username>",
password="<your_password>"
)
)
app.start()
...
.. note:: 如果您的代理不需要授权,您可以将 ``username````password`` 的值留空或者直接在参数中删除这两项。

View File

@ -0,0 +1,137 @@
:github_url: https://github.com/Xtao-Labs/docs-all
文本格式
===============
.. role:: strike
:class: strike
.. role:: underline
:class: underline
.. role:: bold-underline
:class: bold-underline
.. role:: strike-italic
:class: strike-italic
Telethon 支持格式化消息为 Markdown 或者 HTML 。
.. contents:: 目录
:backlinks: none
:depth: 1
:local:
-----
基本样式
------------
您可以在 Markdown 样式HTML 样式之间进行选择。以下是 Telethon 目前支持的基本样式列表。
- **bold**
- *italic*
- :strike:`strike`
- :underline:`underline`
- `text URL <https://docs.xtaolabs.com>`_
- `user text mention <https://t.me/mrwangzhe>`_
- `inline fixed-width code`
.. note::
提及用户功能仅适用于您在对话中见过此用户。
Markdown 样式
--------------
:meth:`~telethon.client.send_message` 在消息中使用以下语法:
.. code-block:: text
**bold**
__italic__
--underline--
~~strike~~
[text URL](https://docs.xtaolabs.com/)
[text user mention](tg://user?id=347437156)
`inline fixed-width code`
**Example**:
.. code-block:: python
app.send_message(
"me",
(
"**bold**, "
"__italic__, "
"--underline--, "
"~~strike~~, "
"[mention](tg://user?id=347437156), "
"[URL](https://docs.xtaolabs.com), "
"`code`"
)
)
HTML 样式
----------
:meth:`~telethon.client.send_message` 在消息中使用以下语法:
.. code-block:: text
<b>bold</b>, <strong>bold</strong>
<i>italic</i>, <em>italic</em>
<u>underline</u>
<s>strike</s>, <del>strike</del>, <strike>strike</strike>
<a href="http://docs.xtaolabs.com/">text URL</a>
<a href="tg://user?id=347437156">inline mention</a>
<code>inline fixed-width code</code>
**Example**:
.. code-block:: python
app.send_message(
"haskell",
(
"<b>bold</b>, "
"<i>italic</i>, "
"<u>underline</u>, "
"<s>strike</s>, "
"<a href=\"tg://user?id=347437156\">mention</a>, "
"<a href=\"https://docs.xtaolabs.com/\">URL</a>, "
"<code>code</code>"
),
parse_mode="html"
)
.. note::
所有不属于标签或 HTML 实体的 ``<``, ``>````&`` 符号必须替换为相应的 HTML 实体(
``<`` 替换为 ``&lt;``, ``>`` 替换为 ``&gt;````&`` 替换为 ``&amp;``)。您可以使用此代码段快速转义这些字符:
.. code-block:: python
import html
text = "<my text>"
text = html.escape(text)
print(text)
.. code-block:: text
&lt;my text&gt;

671
telethon/__init__.py Normal file
View File

@ -0,0 +1,671 @@
# 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 <b>bold</b> and <i>italic</i> text')
await client.send_message('me', 'An <a href="https://example.com">URL</a>')
await client.send_message('me', '<a href="tg://user?id=me">Mentions</a>')
# 混合解析
client.parse_mode = None
# 手动配置单条消息的解析器为 Markdown 。
await client.send_message('me', 'Hello, **world**!', parse_mode='md')
# 手动配置单条消息的解析器为 Html 。
await client.send_message('me', 'Hello, <i>world</i>!', 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)
"""

View File

@ -0,0 +1 @@
from .newmessage import NewMessage

View File

@ -0,0 +1,35 @@
class NewMessage:
"""``chats=None, incoming=None, outgoing=None, from_users=None, forwards=None, pattern=None``
消息处理程序类用于处理来自任何对话私聊群组频道的文本媒体消息
它需要与 :meth:`~telethon.Client.add_handler` 一起使用
参数
incoming (``bool````可选``):
如果设置为 ``True`` 则只能处理接收到的消息 ``outgoing`` 相互排斥只能设置一个 ``False``
outgoing (``bool````可选``):
如果设置为 ``True`` 则只能处理此账户通过其他客户端发出的消息 ``incoming`` 相互排斥只能设置一个 ``False``
from_users (:obj:`User```可选``):
不像 ``chats`` 参数此项会筛选出来自此/这些用户的所有消息如果您只想筛选出来自此/这些用户的私聊对话请使用 ``chats`` 参数
forwards (``bool````可选``):
是否处理转发消息默认情况下将处理转发和普通消息如果设置为 ``True``则只处理转发消息如果设置为 ``False``则只处理普通消息
pattern (``str``,``callable``,``Pattern````可选``):
如果设置只有匹配此模式的消息将被处理您可以指定 Regex 字符串或者编译的正则表达式模式如果与消息匹配则将被处理
如果是可调函数返回值为 ``True`` 时消息将被处理
Example
.. code-block:: python
import asyncio
from telethon import events
@client.on(events.NewMessage(pattern='(?i)hello.+'))
async def handler(event):
# Respond whenever someone says "Hello" and something else
await event.reply('Hey!')
@client.on(events.NewMessage(outgoing=True, pattern='!ping'))
async def handler(event):
# Say "!pong" whenever you send "!ping", then delete both messages
m = await event.respond('!pong')
await asyncio.sleep(5)
await client.delete_messages(event.chat_id, [event.id, m.id])
"""

View File

@ -0,0 +1,168 @@
# noinspection PyUnresolvedReferences
class message:
"""一条消息。
参数:
id (``int``):
对话中消息的唯一消息标识符
from_id (``PeerUser`` | ``PeerChat`` | ``PeerChannel``, *可选*):
发送人
peer_id (``PeerUser`` | ``PeerChat`` | ``PeerChannel``, *可选*):
对话信息
text (``str``)
文本
raw_text (``str``)
纯文本
is_reply (``bool``)
如果此消息是回复消息则值为 ``True``
date (``int``)
消息发送时间
"""
def reply(self):
"""快速回复消息。
参见方法 :meth:`~telethon.Client.send_message`
参数 ``entity`` ``reply_to`` 已经自动配置"""
def forward_to(self):
"""快速转发消息。
参见方法 :meth:`~telethon.Client.forward_messages`
参数 ``messages`` ``from_peer`` 已经自动配置"""
def edit(self):
"""快速编辑消息。
参见方法 :meth:`~telethon.Client.edit_message`
参数 ``entity`` ``message`` 已经自动配置"""
def delete(self):
"""快速删除消息。
参见方法 :meth:`~telethon.Client.delete_messages`
参数 ``entity`` ``message_ids`` 已经自动配置"""
def mark_read(self):
"""快速已读消息。
参见方法 :meth:`~telethon.Client.send_read_acknowledge`
参数 ``entity`` ``message`` 已经自动配置"""
def pin(self):
"""快速置顶消息。
参见方法 :meth:`~telethon.Client.pin_message`
参数 ``entity`` ``message`` 已经自动配置"""
def unpin(self):
"""快速取消置顶消息。
参见方法 :meth:`~telethon.Client.unpin_message`
参数 ``entity`` ``message`` 已经自动配置"""
class user:
"""A Telegram user or bot.
参数:
id (``int``):
唯一标识符
is_self (``bool``):
如果是当前客户端登录用户则返回 ``True``
bot (``bool``):
如果是机器人则返回 ``True``
verified (``bool``):
如果是官方认证则返回 ``True``
restricted (``bool``):
如果是收到限制则返回 ``True``
fake (``bool``):
如果是被标记为冒充则返回 ``True``
first_name (``str``):
first name
last_name (``str``, *可选*):
如果未配置则返回 ``None``
username (``str``, *可选*):
如果未配置则返回 ``None``
phone (``str``, *可选*):
如果无法读取则返回 ``None``
lang_code (``str``, *可选*):
如果无法读取则返回 ``None``
"""
class chat:
"""A chat.
参数:
id (``int``):
唯一标识符
title (``str``):
标题
username (``str``, *可选*):
如果未配置则返回 ``None``
participants_count (``int``):
群成员数
date (``int``):
可能是创建日期
slowmode_enabled (``bool``):
是否开启慢速模式如果无法获取则返回 ``None``
creator (``bool``):
如果当前客户端登录用户是创建者则返回 ``True``
kicked (``bool``):
如果当前客户端登录用户被踢出则返回 ``True``
left (``bool``):
如果当前客户端登录用户已退出则返回 ``True``
call_active (``bool``):
如果群语音已激活则返回 ``True``
call_not_empty (``bool``):
如果群语音有成员则返回 ``True``
"""
class channel:
"""A channel.
参数:
id (``int``):
唯一标识符
title (``str``):
标题
username (``str``, *可选*):
如果未配置则返回 ``None``
participants_count (``int``):
成员数如果无法获取则返回 ``None``
date (``int``):
可能是创建日期
creator (``bool``):
如果当前客户端登录用户是创建者则返回 ``True``
left (``bool``):
如果当前客户端登录用户已退出则返回 ``True``
verified (``bool``):
如果是官方认证则返回 ``True``
restricted (``bool``):
如果是收到限制则返回 ``True``
fake (``bool``):
如果是被标记为冒充则返回 ``True``
has_link (``bool``):
如果链接到了一个讨论群则返回 ``True``
has_geo ``bool``):
如果拥有地理位置信息则返回 ``True``
call_active (``bool``):
如果语音已激活则返回 ``True``
call_not_empty (``bool``):
如果语音有成员则返回 ``True``
"""