Как написать свой парсер telegram
Здарова, чуваки. Сегодня я расскажу историю одного проекта, который я закончил буквально на днях. Суть его заключалась в следующем: было четыре сайта, с которых нужно было парсить информацию, формировать их в пост, и отправлять через бота в telegram канал. Пообщавшись с заказчиком, я изложил свое видение проекта: для управления постами решили использовать админку Django, парсер и бот, естественно, на Python. Для развертывания будем использовать хостинг Договорившись с заказчиком, мы пожали руки и я приступил к работе.
Часть первая. Модели Django
В общем, тут ничего сложного:
MAGAZIN_CHOICES — это список источников, с которых парсится информация. Их тут пять, но парсить мы будем только четыре из них. (потому что пятый в контексте проекта нормально спарсить не получится, с заказчиком сошлись на том, что он будет его вручную постить)
date_string — это идентификационное поле. В нем будет содержаться эксклюзивная для поста информация, по которой можно будет определить — старый это пост, или новый
base_url — ссылка на источник, с которого были собраны данные. Заказчик попросил для удобства
message_id, chat_id — поля, в которых хранится техническая информация о посте. Чуть позже расскажу, для чего.
datetime_post — время, когда нужно вкинуть пост на канал
magazine_type — ну тут понятно, поле показывающее к какому источнику относится пост
is_posted — поле, которое показывает, находится ли пост уже на канале, или еще нет
date_created — поле, показывающее время создания поста в базе данных, используется для сортировки
Модель Image хранит ссылку на пост и ссылку на изображение.
Часть вторая. Функционал бота
Обратившись в поддержку хостера в поисках каких нибудь штатных средств обхода блокировки мне ответили, что им принципиально пофиг на блокировку, но вот их провайдеру очень даже не пофиг, потому сказали, что ничем помочь не могут.
В голове сразу начали крутиться варианты решения проблемы: сказать клиенту, что нужно заказать другой хостинг? Нет, деньги уже потрачены. Заюзать бесплатные прокси и постоянно их менять? Бред. Купить прокси? Не вариант. Тогда мне в голову пришла следующая идея: можно написать небольшое django приложение, которое будет в роли ретранслятора. Т.е. принимать запросы от моего приложения, перенаправлять их к telegram api, принимать на него ответ и отправлять его моему приложению. Разместить его конечно нужно там, откуда есть доступ к telegram api.
Внимание! Это костыль, и за такое решение у нас в провинции бьют ногами в лицо, поэтому очень не рекомендую повторять это в своих проектах. У меня, благодаря моей врожденной глупости, не осталось выбора. Это был единственный вариант, который не раздувал бюджет. К тому же, посты через бота отправлялись четыре раза в неделю, поэтому этот костыль никак не сыграет на производительности.
В общем, получилось нечто такое:
Немного поясню. Я решил не заморачиваться и для общения с telegram api заюзал библиотеку telepot .
Далее мы отвечаем ответом, который мы получили на запрос sendMessage , благодаря чему мы получили message_id и chat_id — идентификационные данные поста, с помощью которых мы можешь его редактировать.
EditPostView выглядит очень просто. Мы получаем из запроса message_id и chat_id , и используем их для редактирования текста в посте. Ответ пересылаем обратно.
Все это дело я по быстрому залил на heroku и протестировал. Работает идеально:
Допиливаем основное приложение
Пришло время реализовать основной функционал в нашем приложении
В наш Topic добавим три функции: is_post , posted и save
is_post скажет нам, готов ли пост по времени к отправке на канал
posted запостит его на канал
save — это переопределение метода сохранения модели. Переопределяем мы его для того, чтобы в случае, если пост уже на канале — отредактировать его не только в модели но и в телеграмме, отправив соответствующий запрос:
Для указанных задач будет использоваться Python не ниже версии 3.5, а также высокоуровневая библиотека для работы с Telegram API – Telethon. Установить библиотеку можно с помощью менеджера пакетов pip :
Регистрируем в Telegram новое приложение
Для подключения к Telegram API необходимы api_id и api_hash . Эти параметры выдаются при регистрации приложения в инструментах разработчика (при отсутствии доступа используйте VPN). Для авторизации указываем номер телефона, к которому привязан аккаунт Telegram.
Вводим пришедший в Telegram численно-буквенный код и попадаем на страницу регистрации нового приложения. Заполняем форму, достаточно первых двух граф:
В результате попадаем на страницу конфигурации приложения. Находим оба параметра, а также доступные MTProto-сервера и открытые (публичные) ключи.
Избегая проблем с безопасностью, сохраняем учетные данные в отдельном файле config.ini следующей структуры:
Поле username далее будет использоваться лишь для автоматического сохранения сессии под именем username.session . Одному клиенту соответствует одна сессия, учтите это в случае запуска нескольких клиентов.
Создаем клиент Telegram
Начнем с импорта библиотек.
Теперь считаем учетные данные из config.ini :
Создадим объект клиента Telegram API:
При необходимости прописываем прокси. При использовании протокола MTProxy прокси задается в виде кортежа (сервер, порт, ключ) .
При первом запуске платформа запросит номер телефона, и вслед – код подтверждения. Так же, как если бы вы входили в учетную запись в приложении или браузере.
Для сбора, обработки и сохранения информации мы создадим две функции:
Обе функции будут вызываться в теле функции main , в которой пользователь передаст ссылку на интересующий источник:
Касательно написания вызова функций стоит оговориться, что Telethon является асинхронной библиотекой. Поэтому в коде используются операторы async и await. В связи с этим функция main полностью будет выглядеть так:
Заметим, что из-за асинхронности Telethon может некорректно работать в средах, использующих те же подходы (Anaconda, Spyder, Jupyter).
Рекомендуемым способом управления клиентом является менеджер контекстов with . Его мы запустим в конце скрипта после описания вложенных в main функций.
Собираем данные об участниках
Telegram не выводит все запрашиваемые данные за один раз, а выдает их в пакетном режиме, по 100 записей за каждый запрос.
Устанавливаем ограничение в 100, начинаем со смещения 0, создаем список всех участников канала all_participants . Внутри бесконечного цикла передаем запрос GetParticipantsRequest .
Проверяем, есть ли у объекта participants свойство users . Если нет, выходим из цикла. В обратном случае добавляем новых членов в список all_participants , а длину полученного списка добавляем к смещению offset_user . Следующий запрос забирает пользователей, начиная с этого смещения. Цикл продолжается до тех пор, пока не соберет всех фолловеров канала.
Самый простой способ сохранить собранные данные в структурированном виде – воспользоваться форматом JSON. Базы данных, такие как MySQL, MongoDB и т. д., стоит рассматривать лишь для очень популярных каналов и большого количества сохраняемой информации. Либо если вы планируете такое расширение в будущем.
В JSON-файле можно хранить и всю информацию о каждом пользователе, но обычно достаточно лишь нескольких параметров. Покажем на примере, как ограничиться набором определенных данных:
Итак, для каждого пользователя создается свой словарь данных и добавляется в общий список all_user_details , который записывается в JSON-файл.
Таким образом, с помощью Python и Telethon мы написали скрипт, собирающий и сохраняющий данные и реплики участников сообществ Telegram.
Здесь остановимся только на установке под Windows, как на самой популярной ОС. В источнике вы также найдете мануалы по установке под Linux и Termux.
Short name: указываем рандомно (LolzDemo)
Настройка конфигурации
Далее мы настраиваем конфигурацию и проходим аутентификацию для сохранения нашей сессии.
Использование
После того как все настроено, можно приступать к использованию.
Во время первого запуска, нужно будет указать код для продолжения корректной работы скрипта.
Парсим участников чата
Инвайтер в чат
- В дириктории со скриптами, прописываем команду:
- Далее нужно выбрать чат, в который мы будем приглашать наших пользователей с файлика members.csv
- По итогу получаем пользователей в чат.
Лимиты Telegram
Ограничения для 1 аккаунта Telegram:
Сохранить аккаунт вы сможете скорее всего сможете только при соблюдении ряда условий:
Возможные ошибки и их решения
1) В случае инвайта, если вы получаете ошибку, в теле которой есть информация:
[IMG]
Вам нужно выбрать тип инвайта по ID (select 1), а не по Username:
[IMG]
2) Во время парсинга, вам нужно выбрать цифру из списка существующих чатов, а не указывать цифру сколько именно парсить.
[IMG]
3) Ошибка связанная с Invalid Mode Selected: смотрите какие методы и аргументы вы выбираете, в случае если их нету в списке и вы их не видите визуально, вы получите ошибку.
Парсинг ленты со своего канала в Telegram с помощью бота Journalist и php-скриптов.
Парсим посты с Telegram на свой сайт с помощью бота Journalist
Инструкция о том, как подключить ленту со своей "Телеги" на сайт.
Шаг 1. Создаем публичный Telegram-канал
В мобильном официальном приложении Telegram, в меню, нажимаем кнопку "Создать канал" , после чего вводим "Имя канала" и его "описание".
Тут следует учесть, что по ключевым словам и фразам присутствующим в данных полях будет происходит поиск вашего канала.
Не забывайте про релевантность заголовка тематике материала публикуемого в вашем канале.
Не забудьте загрузить картинку для канала.
Укажите тип аккаунта: "Публичный". Если указан будет "Частный канал", то на него можно будет попасть только по приглашению.
После завершения создания напишите свой первый пост.
При необходимости информацию можно отредактировать в настройках канала:
Шаг 2. Подключаем бота Journalist к своему чату
Необходимо добавить бота "Journalist" к себе в чаты.
Далее перейти в мобильной версии в свой канал, щелкнуть по названию канала, далее нажать шестеренку для входа в настройки.
Выбираем пункт "Администраторы" и нажимаем "Добавить администратора", далее вводим в поиск идентификатор бота: @JournalistBot и добавляем его в администраторы своего чата.
Затем переходим в чат с ботом "Журналист", где вводим команду: /start
Выскочить меню, где выбираем пункт "Настройки":
После этого создаем ключ:
Переходим в свой чат и вставляем одноразовый ключ в формате: /join ******************************
Шаг 3. Размещаем скрипт на своем сайте
Бот рекомендует следующее:
Код для вставки трансляции на сайт:
Код для вставки виджета трансляции на сайт:
Вставляем это на сайт в нужном нам месте.
Последняя цифра в названии файла -*.js -означает количество постов отображаемых в ленте.
Шаг 4. Модифицируем скрипт Journalist
Создаем папку broadcasts в корне сайта.
Скрипт парсер JS файлов
Создаем php-скрипт с произвольным названием, к примеру downloadjs.php с таким содержимом:
Кеширование отдельного скрипта в .htacess
Задаем специальное кеширование скрипта на 6 часов в .htaccess:
Обновление скрипта по CRON
Ставим выполнение обновления скрипта на крон (раз в час).
Если используется хостинг Таймвеб, то Выбираем тип " Скрипт PHP X.X", указываем путь до php-скрипта и задаем время:
После этих манипуляций меняем путь к скрипту при его подключении - заменяем домен journali.st на свой домен!
Вывод
Создание ленты публикаций на основе Телеграм-канала интересное занятие.
Результат работы скрипта виден в боковой панели или в внизу (в мобильной версии).
Читайте также:
- Можно ли оплатить коммунальные услуги кредитной картой тинькофф через приложение
- Какие кодеки поддерживает приложение ajax
- Как отключить ненужные приложения на андроиде
- Как подключить камеру через приложение carecampro
- Для работы с приложением требуются сервисы google play они не поддерживаются на вашем устройстве