January 19, 2020

Парсер чатов для телеграма

Для парсинга нам понадобится Python 3 версии.

Для начала переходим на сайт 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('Количество пользователей: {0}\n\n'.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/{0}.txt'.format(chat))
    print('Сбор данных закончен!')

if __name__ == '__main__':
  main()

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

chat = '' # Название чата или его ID

string_format = '' # Формат строки для записи


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


Формат строки - это настройки строки с полученными данными. В скрипт заложены следующие шаблоны.

{id} - ID пользователя

{first_name} - Имя пользователя

{last_name} - Фамилия (Если указана)

{username} - Ник пользователя (Если указан)

{phone_number} - Номер телефона (Если пользователь есть в вашей телефонной книге)

{'status} - Статус пользователя в данном чате (Создатель, Администратор или пользователь)


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


К примеру нужно получить все ID и их имена ID: {id} \n Имя: {first_name}\n\n


В папке chats получаем список с таким содержанием.

Первая строка количество участников, далее запрошенная вами информация.


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


ID: 1234567

Имя: Иван


ID: 1234567

Имя: Максим


и т.д

Данный скрипт парсит до 10000 участников.
Запускать обязательно через VPN. Можно настроить и прокси, если нужно могу сказать как и где указывать.
При первом запуске у вас спросит ваш номер телефона от аккаунта, через который вы будете работать и код, полученный по СМС или в чат уже запущеного клиента.