Как зарегистрироваться в телеграмме на телефоне без скачивания и через приложение

Собираем сообщения

Ситуация со сбором сообщений идентична сбору сведений о пользователях. Отличия сводятся к трем пунктам:

  1. Вместо клиентского запроса GetParticipantsRequest необходимо отправить GetHistoryRequest со своим набором параметров. Так же, как и в случае со списком участников запрос ограничен сотней записей за один раз.
  2. Для списка сообщений важна их последовательность. Чтобы получать последние сообщения, нужно правильно задать смещение в GetHistoryRequest (с конца).
  3. Чтобы корректно сохранить данные о времени публикации сообщений в JSON-файле, нужно преобразовать формат времени.

Итоговый код:

import configparser import json  from telethon.sync import TelegramClient from telethon import connection  # для корректного переноса времени сообщений в json from datetime import date, datetime  # классы для работы с каналами from telethon.tl.functions.channels import GetParticipantsRequest from telethon.tl.types import ChannelParticipantsSearch  # класс для работы с сообщениями from telethon.tl.functions.messages import GetHistoryRequest  # Считываем учетные данные config = configparser.ConfigParser() config.read("config.ini")  # Присваиваем значения внутренним переменным api_id   = config['Telegram']['api_id'] api_hash = config['Telegram']['api_hash'] username = config['Telegram']['username']  proxy = (proxy_server, proxy_port, proxy_key)  client = TelegramClient(username, api_id, api_hash,     connection=connection.ConnectionTcpMTProxyRandomizedIntermediate,     proxy=proxy)  client.start()   async def dump_all_participants(channel): """Записывает json-файл с информацией о всех участниках канала/чата""" offset_user = 0    # номер участника, с которого начинается считывание limit_user = 100   # максимальное число записей, передаваемых за один раз  all_participants = []   # список всех участников канала filter_user = ChannelParticipantsSearch('')  while True: participants = await client(GetParticipantsRequest(channel, filter_user, offset_user, limit_user, hash=0)) if not participants.users: break all_participants.extend(participants.users) offset_user += len(participants.users)  all_users_details = []   # список словарей с интересующими параметрами участников канала  for participant in all_participants: all_users_details.append({"id": participant.id, "first_name": participant.first_name, "last_name": participant.last_name, "user": participant.username, "phone": participant.phone, "is_bot": participant.bot})  with open('channel_users.json', 'w', encoding='utf8') as outfile: json.dump(all_users_details, outfile, ensure_ascii=False)   async def dump_all_messages(channel): """Записывает json-файл с информацией о всех сообщениях канала/чата""" offset_msg = 0    # номер записи, с которой начинается считывание limit_msg = 100   # максимальное число записей, передаваемых за один раз  all_messages = []   # список всех сообщений total_messages = 0 total_count_limit = 0  # поменяйте это значение, если вам нужны не все сообщения  class DateTimeEncoder(json.JSONEncoder): '''Класс для сериализации записи дат в JSON''' def default(self, o): if isinstance(o, datetime): return o.isoformat() if isinstance(o, bytes): return list(o) return json.JSONEncoder.default(self, o)  while True: history = await client(GetHistoryRequest( peer=channel, offset_id=offset_msg, offset_date=None, add_offset=0, limit=limit_msg, max_id=0, min_id=0, hash=0)) if not history.messages: break messages = history.messages for message in messages: all_messages.append(message.to_dict()) offset_msg = messages[len(messages) - 1].id total_messages = len(all_messages) if total_count_limit != 0 and total_messages >= total_count_limit: break  with open('channel_messages.json', 'w', encoding='utf8') as outfile:  json.dump(all_messages, outfile, ensure_ascii=False, cls=DateTimeEncoder)   async def main(): url = input("Введите ссылку на канал или чат: ") channel = await client.get_entity(url) await dump_all_participants(channel) await dump_all_messages(channel)   with client: client.loop.run_until_complete(main())

Если для анализа сообщений потребуются не все записи, задайте их число в переменной total_count_limit. Если нужна только сборка сообщений канала, достаточно закомментировать вызов await dump_all_participants(channel).

Таким образом, с помощью Python и Telethon мы написали скрипт, собирающий и сохраняющий данные и реплики участников сообществ Telegram.

Сложный вариант — написать своего бота и поставить его на сервер (мы не стали так делать)

Кажет­ся, что если мы — изда­ние про тех­но­ло­гии и у нас есть про­грам­ми­сты и свои вир­ту­аль­ные сер­ве­ры, то про­ще все­го будет напи­сать бота на питоне и отпра­вить на сер­вер. Но на самом деле с таким под­хо­дом есть мно­го сложностей:

  • нуж­но най­ти про­грам­ми­ста на питоне, кото­рый смо­жет напи­сать код;
  • этот код потом нуж­но под­дер­жи­вать, если пона­до­бит­ся доба­вить новые функции;
  • нуж­но под­го­то­вить сер­вер к посто­ян­ной фоно­вой рабо­те python-кода;
  • сле­дить за тем, что­бы бот рабо­тал круг­ло­су­точ­но, а если падал, то сам умел перезапускаться;
  • сле­дить за самим сер­ве­ром и в слу­чае чего — пере­за­пус­кать его и все про­грам­мы на нём.

Всё это тре­бу­ет вни­ма­ния, вре­ме­ни и ква­ли­фи­ка­ции. В ито­ге про­стая зада­ча пре­вра­ща­ет­ся в целый рабо­чий про­цесс с отдель­ным чело­ве­ком, кото­рый отве­ча­ет за бес­пе­ре­бой­ную рабо­ту сер­ве­ра и все­го, что на нём крутится.

👉 Свой бот на сво­ём сер­ве­ре — это пра­виль­ный под­ход, если у вас в ком­па­нии уже настро­ен подоб­ный про­цесс и есть отдель­ная коман­да, кото­рая за это отве­ча­ет. В малень­кой коман­де раз­во­ра­чи­вать всю эту систе­му ради одно­го бота — перебор.

Как узнать свой QR код?

Сканирование QR-кода

  1. Откройте программу «Камера» на экране «Домой», в Пункте управления или на экране блокировки.
  2. Выберите основную камеру. Удерживайте устройство так, чтобы QR-код находился в видоискателе программы «Камера». …
  3. Коснитесь уведомления, чтобы открыть связанную с QR-кодом ссылку.

Логика проекта

  1. Созда­ём ново­го бота и добав­ля­ем его в чат.
  2. Полу­ча­ем нуж­ные пара­мет­ры для настрой­ки бота.
  3. Созда­ём бота в конструкторе.
  4. Настра­и­ва­ем чат для пол­но­цен­ной рабо­ты в редакции.

Сде­ла­ем всё по очереди.

Создаем клиент Telegram

Начнем с импорта библиотек.

import configparser import json  from telethon.sync import TelegramClient from telethon import connection  # для корректного переноса времени сообщений в json from datetime import date, datetime  # классы для работы с каналами from telethon.tl.functions.channels import GetParticipantsRequest from telethon.tl.types import ChannelParticipantsSearch  # класс для работы с сообщениями from telethon.tl.functions.messages import GetHistoryRequest

Встроенные модули configparser и json применяем соответственно для чтения параметров и вывода данных. Из библиотеки Telethon импортируем класс клиента Telegram и класс исключений. Внутренний модуль connection необходим при использовании прокси-сервера. Остальные элементы модуля telethon.tl используются для запросов необходимых нам списков (участников канала/чата и их сообщений).

Теперь считаем учетные данные из config.ini:

# Считываем учетные данные config = configparser.ConfigParser() config.read("config.ini")  # Присваиваем значения внутренним переменным api_id   = config['Telegram']['api_id'] api_hash = config['Telegram']['api_hash'] username = config['Telegram']['username']

Создадим объект клиента Telegram API:

client = TelegramClient(username, api_id, api_hash)

При необходимости прописываем прокси. При использовании протокола MTProxy прокси задается в виде кортежа (сервер, порт, ключ).

proxy = (proxy_server, proxy_port, proxy_key)  client = TelegramClient(username, api_id, api_hash,     connection=connection.ConnectionTcpMTProxyRandomizedIntermediate,     proxy=proxy)

Запускаем клиент:

client.start()

При первом запуске платформа запросит номер телефона, и вслед – код подтверждения. Так же, как если бы вы входили в учетную запись в приложении или браузере.

Для сбора, обработки и сохранения информации мы создадим две функции:

  1. dump_all_participants(сhannel) заберет данные о пользователях администрируемого нами сообщества channel;
  2. dump_all_messages(сhannel)соберет все сообщения. Для этой функции достаточно, чтобы у вас был доступ к сообществу (необязательно быть администратором).

Обе функции будут вызываться в теле функции main, в которой пользователь передаст ссылку на интересующий источник:

url = input("Введите ссылку на канал или чат: ") channel = await client.get_entity(url)

Касательно написания вызова функций стоит оговориться, что Telethon является асинхронной библиотекой. Поэтому в коде используются операторыasync и await. В связи с этим функция main полностью будет выглядеть так:

async def main(): url = input("Введите ссылку на канал или чат: ") channel = await client.get_entity(url) await dump_all_participants(channel) await dump_all_messages(channel)

Заметим, что из-за асинхронности Telethon может некорректно работать в средах, использующих те же подходы (Anaconda, Spyder, Jupyter).

Рекомендуемым способом управления клиентом является менеджер контекстов with. Его мы запустим в конце скрипта после описания вложенных в main функций.

with client: client.loop.run_until_complete(main())

Оцените статью
Рейтинг автора
5
Материал подготовил
Илья Коршунов
Наш эксперт
Написано статей
134
А как считаете Вы?
Напишите в комментариях, что вы думаете – согласны
ли со статьей или есть что добавить?
Добавить комментарий