В настоящее время большинство из нас, вероятно, являются членами нескольких групп Telegram, которые обычно транслируют объявления о вакансиях, предложениях на еду, праздники, новости и т. Д. Обычно я ленив или просто не имею времени просматривать тонны сообщений в поисках чего-то, что мне нужно.
Поэтому я решил, что мне нужен бот или приложение, которое могло бы все «слушать» и предупреждать меня только тогда, когда они обнаруживают интересующие сообщения. Я провел небольшое исследование в Интернете, чтобы выяснить, какой способ работы с Python является наиболее простым и эффективным. В конце концов, я остановился на Telethon, который оказался довольно простым.
Телемарафон
Как указано на их целевой странице, Telethon - это оболочка, которая позволяет вам сосредоточиться на создании приложений с помощью Python, не беспокоясь о том, что находится под капотом. Не стесняйтесь заходить на их веб-сайт, если хотите узнать больше! Но по настройке продолжим.
Установка
Версия Python в моей среде была 3.7.4, и я использую Macbook Pro. Другие версии Python и Windows / Linux также должны работать. Активируйте среду conda в терминале:
$ conda activate <your_conda_environment_name> $ pip3 install -U telethon --user # Run the following to check your telethon version: $ python3 -c "import telethon; print(telethon.__version__)"
На этом установка!
Идентификатор API и хеш
Затем вам понадобятся ваш API-идентификатор и хеш, привязанные к вашей учетной записи Telegram.
- Перейдите на https: //my.telegram.or g
- Введите свой номер телефона и код подтверждения.
- Нажмите "Инструменты разработки API".
- Прямо в разделе «Конфигурация приложения» вы должны увидеть свои «App api_id» и «App api_hash» - скопируйте их и не делитесь ими с другими!
Пример использования - Прослушивание списков вакансий за обучение
Прежде чем продолжить, я хочу использовать свой пример, чтобы проиллюстрировать, чего я достиг с помощью Telethon. Я являюсь участником канала местного агентства по обучению в Telegram, которое регулярно публикует задания по обучению. Эти объявления о вакансиях охватывают все виды предметов и уровней, например, английский в начальной школе, математику в средней школе или даже университетскую физику и т. Д.
Предположим, я репетитор физики / математики и хочу получать уведомления только об объявлениях о вакансиях, связанных с физикой и математикой. Кроме того, я хочу обучать только учеников старше и младше определенного класса / возраста. Например. только учащиеся средней школы и младших классов колледжа (старшей школы).
При наличии почти сотен сообщений, относящихся к разным темам и уровням, медленно и отнимает много времени медленно отбирать нужную вам рекламу. Будет еще хуже, если вы подключитесь к другим аналогичным каналам.
Итак, для моего случая я специально разработал 2 фильтра:
subjectFilter = ['physics', 'mathematics', 'maths', 'math'] levelFilter = ['sec', 'secondary', 'junior college', 'jc']
Требуется только 1 скрипт
Давайте посмотрим на структуру скрипта:
Импорт
import configparser import json import re from telethon.errors import SessionPasswordNeededError from telethon import TelegramClient, events, sync from telethon.tl.functions.messages import (GetHistoryRequest) from telethon.tl.types import ( PeerChannel )
Ваш api_id и api_hash
api_id = <your_api_id> api_hash = <your_api_hash>
Входной канал и фильтры
# Here you define the target channel that you want to listen to: user_input_channel = 'https://t.me/<channel_name>' subjectFilter = ['physics', 'mathematics', 'maths', 'math'] levelFilter = ['sec', 'secondary', 'junior college', 'jc']
Главный соус
Вот несколько моментов, которые нужно понять:
- Функция async прослушивает событие, исходящее из целевого канала.
- newMessage считывает текст сообщения из параметра события - это фактическое содержание каждого сообщения / сообщения в канале.
- Для моего случая использования я хочу сначала отфильтровать предметы с помощью Regex.
- Если сообщение действительно содержит соответствующие тематические тексты (определенные в subjectFilter, мы ищем соответствующий уровень дальше.
- Наконец, если два уровня фильтрации что-то возвращают, клиент пересылает все сообщение (event.message) получателю, указанному с помощью параметра сущность. В противном случае ничего не происходит.
Обратите внимание, что этот клиент позволяет вам «слушать» ваши обычные чаты с друзьями или семьей и т. Д. Он не ограничивается только каналом. Все, что вам нужно, это название канала / ссылка и имя пользователя, то есть «@ username_123». Кроме того, «я» определяется как ваша личная учетная запись.
Собираем все вместе
Предполагая, что вы скопировали и вставили все в правильном порядке, вы можете в ближайшее время сохранить и запустить свой скрипт. Откройте свой терминал и введите следующий код:
# Activate your conda environment, if you haven't done so $ conda activate <your_conda_environment> # Run the script to begin listening $ python main.py
Как узнать, работает ли он?
Если вы определили канал в качестве целевого канала, вам может потребоваться некоторое время для тестирования вашего скрипта, потому что вам нужно дождаться прихода сообщений.
Вместо этого вы можете сделать следующее.
- Настройте свой целевой канал, чтобы быть самим собой
- Настройте объект для пересылки сообщения от имени другого лица
# Outside the cient: user_input_channel = 'me' # Within the client: await client.forward_messages(entity='@username', messages=event.message)
Таким образом, ваш клиент прослушивает ваш чат «Сохраненное сообщение», доступ к которому есть только у вас. И вы хотите попробовать пересылать сообщения кому-то, кого вы знаете, может быть, вашим братьям и сестрам или друзьям, которые не против рассылки спама.
Как только это все будет исправлено, вы можете ввести какое-нибудь сообщение с ключевыми словами, определенными в ваших фильтрах. В моем случае я бы набрал что-то вроде «вторичная физика» или «вторая математика» и т. Д. Когда предполагаемый получатель получил ваш спам, вы знаете, что ваш сценарий работает нормально. Теперь вы можете настроить параметры по своему вкусу. Вы также можете позволить скрипту работать в фоновом режиме, чтобы вы постоянно были в поисках новых сообщений.
В итоге,
Мы рассмотрели следующие моменты:
- Настройка среды Python и учетных данных Telegram
- Определение фильтров
- Определение входных и выходных каналов
- Собираем все в рабочий сценарий
Я надеюсь, что это достаточно просто для вас, чтобы начать работу и облегчить себе жизнь.