Библиотека Telethon в Python

Библиотека 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:

  1. Необходимо войти в свою учетную запись Telegram, указав номер телефона учетной записи разработчика. Страница https://my.telegram.org "Delete Account or Manage Apps".
  2. Далее нужно нажать "Инструменты разработки API": появится окно "Создать новое приложение". Заполните данные нового приложения. Нет необходимости вводить какой-либо URL-адрес, позже можно изменить только первые два поля (название приложения и краткое имя).
  3. В конце нажмите "Создать заявку". Помните, что ваш хэш 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 name TelegramClient ....

В первой строке импортируется имя класса, чтобы создать экземпляр клиента. Затем определяются переменные для удобного хранения идентификатора и хеша 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.SOCKS5
  • python_socks.ProxyType.SOCKS4
  • python_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())


Report Page