Библиотека Telethon в Python
KOD
Асинхронная обертка API мессенджера Telegram
Библиотека Telethon предназначена для облегчения разработки программ на Python, которые могут взаимодействовать с платформой Telegram. Представляет собой асинхронную обертку API Telegram, которая делает всю тяжелую и нудную работу, тем самым позволяя сосредоточиться на разработке приложения.
Установка модуля Telethon в виртуальное окружение:
# создаем виртуальное окружение $ python3 -m venv .venv --prompt VirtualEnv # активируем виртуальное окружение $ source .venv/bin/activate # обновляем установщик пакетов python3 -m pip install --upgrade pip # ставим пакет telethon python3 -m pip install --upgrade telethon
Авторизация в Telegram с помощью библиотеки Telethon.
Прежде чем работать с API Telegram, необходимо получить собственный идентификатор и хеш API:
- Необходимо войти в свою учетную запись Telegram, указав номер телефона учетной записи разработчика. Страница https://my.telegram.org "Delete Account or Manage Apps".
- Далее нужно нажать "Инструменты разработки API": появится окно "Создать новое приложение". Заполните данные нового приложения. Нет необходимости вводить какой-либо URL-адрес, позже можно изменить только первые два поля (название приложения и краткое имя).
- В конце нажмите "Создать заявку". Помните, что ваш хэш API является секретным, и Telegram не позволит вам его отозвать. Никуда его не публикуйте!
Примечание. Идентификатор и хэш API используются только приложением, а не номером телефона. Другими словами можно использовать этот идентификатор и хэш с любым номером телефона или даже для учетных записей ботов.
После получения идентификатора и хэша API можно написать код для входа в учетную запись Telegram!
# файл tеst.py
from telethon import TelegramClient
# Подставляем собственные значения из `my.telegram.org`
api_id = 12345
api_hash = '0123456789abcdef0123456789abcdef'
# Первый аргумент - это имя файла `.session` (допускаются абсолютные пути).
with TelegramClient('anon', api_id, api_hash) as client:
client.loop.run_until_complete(client.send_message('me', 'Hello, myself!'))
Важно! Не называйте скриптtelethon.py! Python попытается импортировать клиент изtelethon.py, которого там нет. В итоге сценарий завершится неудачей с ошибкойImportError: cannot import nameTelegramClient ....
В первой строке импортируется имя класса, чтобы создать экземпляр клиента. Затем определяются переменные для удобного хранения идентификатора и хеша API.
Наконец, создается новый экземпляр TelegramClient и называем его client. Теперь можно использовать переменную client для чего угодно, например для отправки сообщения самому себе.
Примечание. Так какTelethonявляется асинхронной библиотекой, то необходимо дождатьсяawaitвыполнения функций сопрограммы (или, в противном случае, запускать цикл до их завершения). В этом примере не создаетсяасинхронное определениеasync def`.
Использование контекстного менеджера with является предпочтительным способом использования библиотеки. Он автоматически запустит клиент TelegramClient.start(), выполнив вход или регистрацию при необходимости.
Если файл .session уже существует и куда нибудь перемещен или переименован, то клиент не сможет снова войти (имейте это в виду)!
Вход в качестве учетной записи бота.
Также можно использовать пакет Telethon для своих ботов (обычных учетных записей ботов, а не пользователей). Для этого все равно понадобится идентификатор и хэш API, но процесс очень похож:
from telethon.sync import TelegramClient
api_id = 12345
api_hash = '0123456789abcdef0123456789abcdef'
bot_token = '12345:0123456789abcdef0123456789abcdef'
# если нам нужен явный токен бота,
# то нужно вручную вызвать `TelegramClient.start()`.
bot = TelegramClient('bot', api_id, api_hash).start(bot_token=bot_token)
# Тогда можем использовать экземпляр клиента как обычно.
with bot as bot_client:
...
Для получения аккаунта бота, необходимо поговорить с @BotFather.
Вход в систему через прокси-сервер.
Для доступа к Telegram через прокси сервер, необходим Python >= 3.6 и установка модуля python-socks[asyncio]. Затем в коде необходимо изменить строку с созданием клиента:
# было
TelegramClient('anon', api_id, api_hash)
# стало (замените протокол, IP и порт на собственные).
proxy=("socks5", '127.0.0.1', 4444)
TelegramClient('anon', api_id, api_hash, proxy=proxy)
Аргумент proxy должен быть словарем (или кортежем для обратной совместимости), состоящим из параметров, как в описании модуля PySocks.
Допустимые значения аргумента proxy_type:
socks.SOCKS5или'socks5'socks.SOCKS4или'socks4'socks.HTTPили'http'python_socks.ProxyType.SOCKS5python_socks.ProxyType.SOCKS4python_socks.ProxyType.HTTP
Пример:
proxy = {
# обязательный протокол
'proxy_type': 'socks5',
# обязательный IP-адрес прокси
'addr': '1.1.1.1',
# обязательный номер порта прокси-сервера
'port': 5555,
# имя пользователя, если прокси требует авторизации (необязательно)
'username': 'foo',
# пароль, если прокси-сервер требует авторизации (необязательно)
'password': 'bar',
# использовать удаленное или локальное разрешение, по умолчанию удаленное (необязательно)
'rdns': True
}
client = TelegramClient('anon', api_id, api_hash, proxy=proxy)
Для обратной совместимости с PySocks возможен следующий формат (но не рекомендуется):
proxy = (socks.SOCKS5, '1.1.1.1', 5555, True, 'foo', 'bar')
client = TelegramClient('anon', api_id, api_hash, proxy=proxy)
Использование прокси-серверов MTProto.
Прокси MTProto - это альтернатива Telegram обычным прокси, работающая немного по-другому. Доступны следующие протоколы:
ConnectionTcpMTProxyAbridged;ConnectionTcpMTProxyIntermediate;ConnectionTcpMTProxyRandomizedIntermediate(предпочтительный).
Если используется прокси-сервер MTProto, то на данный момент необходимо вручную указать эти специальные режимы подключения. В итоге код будет выглядеть следующим образом:
from telethon import TelegramClient, connection
# необходимо изменить соединение
client = TelegramClient(
'anon',
api_id,
api_hash,
# Используем один из доступных режимов подключения.
# Обычно этот вариант работает с большинством прокси.
connection=connection.ConnectionTcpMTProxyRandomizedIntermediate,
# Затем передайте данные прокси в виде кортежа:
# (имя хоста, порт, секрет прокси)
# Если у прокси нет секрета, то вместо него пишем:
# '00000000000000000000000000000000'
proxy=('mtproxy.example.com', 2002, 'secret')
)
В будущих обновлениях команда разработчиков telethon может упростить использование прокси-серверов MTProto (например, убрать аргумент connection).
Короче говоря, тот же код, который выше, но без комментариев, чтобы было понятнее:
from telethon import TelegramClient, connection
client = TelegramClient(
'anon', api_id, api_hash,
connection=connection.ConnectionTcpMTProxyRandomizedIntermediate,
proxy=('mtproxy.example.com', 2002, 'secret')
)
Дружественные методы работы с библиотекой telethon
Рассмотрим более длинный пример, с целью изучения некоторых методов, которые может предложить библиотека telethon. Они известны как "дружественные методы", и их необходимо использовать всегда, если это возможно.
Код ниже показывает, как войти в Telegram, получить информацию о себе, отправить сообщения, файлы, войти в чат, распечатать сообщения и загрузить файлы.
from telethon import TelegramClient
# подставляем собственные значения
api_id = 12345
api_hash = '0123456789abcdef0123456789abcdef'
client = TelegramClient('anon', api_id, api_hash)
async def main():
# Получение информации о себе
me = await client.get_me()
# `me` - это пользовательский объект. Можно красиво напечатать
# любой объект Telegram с помощью метода `.stringify`:
print(me.stringify())
# Можно получить доступ ко всем атрибутам объектов Telegram с помощью
# оператора точки. Например, чтобы получить имя пользователя:
username = me.username
print(username)
print(me.phone)
# Можно распечатать все диалоги/разговоры, в которых вы участвуете:
async for dialog in client.iter_dialogs():
print(dialog.name, 'has ID', dialog.id)
# Можно отправлять сообщения самому себе...
await client.send_message('me', 'Hello, myself!')
# ... к какому-нибудь идентификатору чата
await client.send_message(-100123456, 'Hello, group!')
# ... к каким-то контактам
await client.send_message('+34600123123', 'Hello, friend!')
# ... или даже к любому имени пользователя
await client.send_message('username', 'Testing Telethon!')
# конечно, можно использовать `markdown` в своих сообщениях:
message = await client.send_message(
'me',
'This message has **bold**, `code`, __italics__ and '
'a [nice website](https://example.com)!',
link_preview=False
)
# Отправка сообщения возвращает объект отправленного
# сообщения, который можно использовать повторно
print(message.raw_text)
# можно отвечать на сообщения напрямую, если есть объект сообщения.
await message.reply('Cool!')
# или отправляйте файлы, музыку, документы, альбомы...
await client.send_file('me', '/home/me/Pictures/holidays.jpg')
# можно распечатать историю сообщений любого чата:
async for message in client.iter_messages('me'):
print(message.id, message.text)
# можно также загружать мультимедиа из сообщений!
# Метод вернет путь, по которому был сохранен файл.
if message.photo:
path = await message.download_media()
# печатает после завершения загрузки
print('File saved to', path)
with client:
client.loop.run_until_complete(main())