Python Telegram список пользователей

Для начала переходим на сайт https://my.telegram.org и создаем приложение, запоминаем API ID и API HASH .

pip3 install —upgrade pyrogram
pip3 install —upgrade tgcrypto

Создаем 2 файла: main.py, config.ini
И 2 папки: session и chats (Названия смогут быть любыми, созданы для удобства и порядка)

В config.ini пишем следующие данные

[pyrogram]
api_id = 1234567
api_hash = bf243ef2d7224ebc6effj42718e5bb68

api_id, api_hash получены при регистрации приложения

Переходим к main.py

import time import json from pyrogram import Client from pyrogram.api.errors import FloodWait app = Client(‘session’, workdir=’./session’) # Настройки сессии клиента chat = » # Название чата или его ID string_format = » # Формат строки для записи def parser(id): «»» Функция парсинга пользователей «»» members = [] offset = 0 limit = 200 while True: try: chunk = app.get_chat_members(id, offset) except FloodWait as e: time.sleep(e.x) continue if not chunk.chat_members: break members.extend(chunk.chat_members) offset += len(chunk.chat_members) return members def template(data, template): «»» Функция нормализатора строк «»» data = json.loads(str(data)) data[‘user’].setdefault(‘first_name’, ‘-‘) data[‘user’].setdefault(‘last_name’, ‘-‘) data[‘user’].setdefault(‘username’, ‘-‘) data[‘user’].setdefault(‘phone_number’, ‘-‘) return template.format(id=data[‘user’][‘id’], first_name=data[‘user’][‘first_name’], last_name=data[‘user’][‘last_name’], username=data[‘user’][‘username’], phone_number=data[‘user’][‘phone_number’], status=data[‘status’]) def wfile(data, template_format, path): «»» Функция записи строк в файл «»» with open(path, ‘w’, encoding=’utf8′) as file: file.writelines(‘Количество пользователей: nn’.format(len(data))) file.writelines([template(user, template_format) for user in data]) def main(): with app: data = parser(chat) wfile(data, string_format, ‘./chats/.txt’.format(chat)) print(‘Сбор данных закончен!’) if __name__ == ‘__main__’: main()

Заполняем данные

Пишем TELEGRAM бота с БАЗОЙ ДАННЫХ на Python


chat = » # Название чата или его ID
string_format = » # Формат строки для записи

Заполнять только название или ID чата если известно, без https://t.me/

Формат строки — это настройки строки с полученными данными. В скрипт заложены следующие шаблоны.
— ID пользователя
— Имя пользователя
— Фамилия (Если указана)
— Ник пользователя (Если указан)
— Номер телефона (Если пользователь есть в вашей телефонной книге)
— Статус пользователя в данном чате (Создатель, Администратор или пользователь)

Можно и нужно использовать разделители и перенос строк ( n )

К примеру нужно получить все ID и их имена ID: n Имя: nn

Количество пользователей: 156

ID: 1234567
Имя: Иван

ID: 1234567
Имя: Максим

Python telegram список пользователей

СОЗДАЁМ TELEGRAM БОТА С БАЗОЙ ДАННЫХ | СОХРАНЕНИЕ ПОЛЬЗОВАТЕЛЕЙ | SQLITE3 | PYTHON

Регистрируем в Telegram новое приложение

Для подключения к Telegram API необходимы api_id и api_hash . Эти параметры выдаются при регистрации приложения в инструментах разработчика (при отсутствии доступа используйте VPN). Для авторизации указываем номер телефона, к которому привязан аккаунт Telegram.

Пишем простой граббер для Telegram чатов на Python

Вводим пришедший в Telegram численно-буквенный код и попадаем на страницу регистрации нового приложения. Заполняем форму, достаточно первых двух граф:

Пишем простой граббер для Telegram чатов на Python

В результате попадаем на страницу конфигурации приложения. Находим оба параметра, а также доступные MTProto-сервера и открытые (публичные) ключи.

Избегая проблем с безопасностью, сохраняем учетные данные в отдельном файле config.ini следующей структуры:

[Telegram] api_id = Telegram-API-ID api_hash = Telegram-API-Hash username = Your-Telegram-Username

Поле username далее будет использоваться лишь для автоматического сохранения сессии под именем username.session . Одному клиенту соответствует одна сессия, учтите это в случае запуска нескольких клиентов.

Создаем клиент 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())

Собираем данные об участниках

Telegram не выводит все запрашиваемые данные за один раз, а выдает их в пакетном режиме, по 100 записей за каждый запрос.

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)

Устанавливаем ограничение в 100, начинаем со смещения 0, создаем список всех участников канала all_participants . Внутри бесконечного цикла передаем запрос GetParticipantsRequest .

Проверяем, есть ли у объекта participants свойство users . Если нет, выходим из цикла. В обратном случае добавляем новых членов в список all_participants , а длину полученного списка добавляем к смещению offset_user . Следующий запрос забирает пользователей, начиная с этого смещения. Цикл продолжается до тех пор, пока не соберет всех фолловеров канала.

Самый простой способ сохранить собранные данные в структурированном виде – воспользоваться форматом JSON. Базы данных, такие как MySQL, MongoDB и т. д., стоит рассматривать лишь для очень популярных каналов и большого количества сохраняемой информации. Либо если вы планируете такое расширение в будущем.

В JSON-файле можно хранить и всю информацию о каждом пользователе, но обычно достаточно лишь нескольких параметров. Покажем на примере, как ограничиться набором определенных данных:

all_users_details = [] # список словарей с интересующими параметрами участников канала for participant in all_participants: all_users_details.append() with open(‘channel_users.json’, ‘w’, encoding=’utf8′) as outfile: json.dump(all_users_details, outfile, ensure_ascii=False)

Итак, для каждого пользователя создается свой словарь данных и добавляется в общий список all_user_details , который записывается в JSON-файл.

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

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

  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() 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.

Источник: proglib.tech

Python-сообщество

[RSS Feed]

  • Начало
  • » Python для новичков
  • » Парсинг с выводом в Telegram через бота

#1 Авг. 15, 2020 19:22:39

Парсинг с выводом в Telegram через бота

Добрый день! Недавно приступил к изучение данного языка программирования. Ну и вообще первого в моей жизни
Решил попробовать спарсить события с сайта и отправить их сообщением через телеграм бота.

Столкнулся с такой проблемой. Если принтом вывести переменную answer, то выводится полный список событий.
Однако бот отправляет сообщением только первую строку.
В чём моя ошибка?

#2 Авг. 16, 2020 03:02:19

Парсинг с выводом в Telegram через бота

Alexandr88
Если принтом вывести переменную answer, то выводится полный список событий.

Не вижу у тебя собирания нескольких строк в цикле в список строк.

И для отправки в Telegram не нужен модуль telebot. Достаточно только адрес бота и запрос к методу.

Скрипт отправки сообщения через бота в приват пользователя, в канал или группу.

#3 Авг. 16, 2020 10:24:15

Парсинг с выводом в Telegram через бота

По поводу вашего скрипта. Это для меня пока слишком сложно)
Telebot использую для того чтобы можно было общаться с ботом. Получать список событий по запросу к нему. Возможно потом добавлю что то ещё.
Я попробовал обернуть полученные данные в список вот так:

Еще по теме:  Запуск Telegram при старте Windows

answer.append(event + «|» + desc + «|» + «|» + date) answer1 = answer[-1]
Коряво, но по-другому пока не умею. Если вывести принтом получается вот так:

«Джаз-детям» (онлайн-трансляция)|Нет описания|| 19 августа в 15:00
«Помни имя свое» (онлайн-трансляция)|Нет описания|| сегодня в 20:00
«Будь с Городом!»: Елка, Муся Тотибадзе, IOWA, «Марсель» (онлайн-трансляция)|Нет описания|| 29 августа в 17:00
«Каста»|Ветераны русского хип-хопа, переворачивавшие игру еще в начале века||Галактика развлечений, 25 сентября в 19:00
Cream Soda|Эклектичный хаус-поп от самого модного трио страны||Ozz, 25 сентября в 19:00
«ДДТ»|Душевные герои русского рока||Трактор, 23 апреля 2021 г. в 19:00
XIV фестиваль «Собираем друзей»:«Восходящая звезда Альбиона» (онлайн-трансляция)|Нет описания|| 18 августа в 19:00
Макс Барских|Традиционный поп в трендовой обертке||Дворец спорта «Юность», 25 сентября в 20:00
Niletto|Бро-хаус-артист, взорвавший чаты||Галактика развлечений, 18 ноября в 19:00
«Король и Шут». 20 лет альбому «Кукла Колдуна»: «Княzz»|Сказочный панк от создателя группы «Король и Шут»||World Trade Center, 11 июля 2021 г. в 20:00
Noize MC|Видный герой русского хип-хопа||World Trade Center, 9 октября в 19:00
Баста|Важнейший российский рэпер||Трактор, 31 октября в 20:00
Boulevard Depo|Уникальный флоу от талантливого и необычного рэпера||Галактика развлечений, 10 октября в 19:00
«Пошлая Молли»|Кумиры молодежи и новаторы рейв-рока||Галактика развлечений, 16 сентября в 19:00
Пелагея|Главная звезда российского фолк-рока||World Trade Center, 8 октября в 19:00
Тони Раут >> s = «»»
. «Джаз-детям» (онлайн-трансляция)|Нет описания|| 19 августа в 15:00
. «Помни имя свое» (онлайн-трансляция)|Нет описания|| сегодня в 20:00
. «Будь с Городом!»: Елка, Муся Тотибадзе, IOWA, «Марсель» (онлайн-трансляция)|Нет описания|| 29 августа в 17:00
. «Каста»|Ветераны русского хип-хопа, переворачивавшие игру еще в начале века||Галактика развлечений, 25 сентября в 19:00
. Cream Soda|Эклектичный хаус-поп от самого модного трио страны||Ozz, 25 сентября в 19:00
. «ДДТ»|Душевные герои русского рока||Трактор, 23 апреля 2021 г. в 19:00
. XIV фестиваль «Собираем друзей»:«Восходящая звезда Альбиона» (онлайн-трансляция)|Нет описания|| 18 августа в 19:00
. Макс Барских|Традиционный поп в трендовой обертке||Дворец спорта «Юность», 25 сентября в 20:00
. Niletto|Бро-хаус-артист, взорвавший чаты||Галактика развлечений, 18 ноября в 19:00
. «Король и Шут». 20 лет альбому «Кукла Колдуна»: «Княzz»|Сказочный панк от создателя группы «Король и Шут»||World Trade Center, 11 июля 2021 г. в 20:00
. Noize MC|Видный герой русского хип-хопа||World Trade Center, 9 октября в 19:00
. Баста|Важнейший российский рэпер||Трактор, 31 октября в 20:00
. Boulevard Depo|Уникальный флоу от талантливого и необычного рэпера||Галактика развлечений, 10 октября в 19:00
. «Пошлая Молли»|Кумиры молодежи и новаторы рейв-рока||Галактика развлечений, 16 сентября в 19:00
. Пелагея|Главная звезда российского фолк-рока||World Trade Center, 8 октября в 19:00
. Тони Раут «»
>>>
>>> s
‘«Джаз-детям» (онлайн-трансляция)|Нет описания|| 19 августа в 15:00n«Помни имя свое» (онлайн-трансляция)|Нет описания|| сегодня в 20:00n«Будь с Городом!»: Елка, Муся Тотибадзе, IOWA, «Марсель» (онлайн-трансляция)|Нет описания|| 29 августа в 17:00n«Каста»|Ветераны русского хип-хопа, переворачивавшие игру еще в начале века||Галактика развлечений, 25 сентября в 19:00nCream Soda|Эклектичный хаус-поп от самого модного трио страны||Ozz, 25 сентября в 19:00n«ДДТ»|Душевные герои русского рока||Трактор, 23 апреля 2021 г. в 19:00nXIV фестиваль «Собираем друзей»:«Восходящая звезда Альбиона» (онлайн-трансляция)|Нет описания|| 18 августа в 19:00nМакс Барских|Традиционный поп в трендовой обертке||Дворец спорта «Юность», 25 сентября в 20:00nNiletto|Бро-хаус-артист, взорвавший чаты||Галактика развлечений, 18 ноября в 19:00n«Король и Шут». 20 лет альбому «Кукла Колдуна»: «Княzz»|Сказочный панк от создателя группы «Король и Шут»||World Trade Center, 11 июля 2021 г. в 20:00nNoize MC|Видный герой русского хип-хопа||World Trade Center, 9 октября в 19:00nБаста|Важнейший российский рэпер||Трактор, 31 октября в 20:00nBoulevard Depo|Уникальный флоу от талантливого и необычного рэпера||Галактика развлечений, 10 октября в 19:00n«Пошлая Молли»|Кумиры молодежи и новаторы рейв-рока||Галактика развлечений, 16 сентября в 19:00nПелагея|Главная звезда российского фолк-рока||World Trade Center, 8 октября в 19:00nТони Раут >> len(s)
2183
>>> len(s.encode(‘utf-8’))
3656
>>>

Отредактировано py.user.next (Авг. 16, 2020 11:06:02)

Источник: python.su

Рейтинг
( Пока оценок нет )
Загрузка ...