В настоящее время большинство из нас, вероятно, являются членами нескольких групп 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)

Таким образом, ваш клиент прослушивает ваш чат «Сохраненное сообщение», доступ к которому есть только у вас. И вы хотите попробовать пересылать сообщения кому-то, кого вы знаете, может быть, вашим братьям и сестрам или друзьям, которые не против рассылки спама.

Как только это все будет исправлено, вы можете ввести какое-нибудь сообщение с ключевыми словами, определенными в ваших фильтрах. В моем случае я бы набрал что-то вроде «вторичная физика» или «вторая математика» и т. Д. Когда предполагаемый получатель получил ваш спам, вы знаете, что ваш сценарий работает нормально. Теперь вы можете настроить параметры по своему вкусу. Вы также можете позволить скрипту работать в фоновом режиме, чтобы вы постоянно были в поисках новых сообщений.

В итоге,

Мы рассмотрели следующие моменты:

  1. Настройка среды Python и учетных данных Telegram
  2. Определение фильтров
  3. Определение входных и выходных каналов
  4. Собираем все в рабочий сценарий

Я надеюсь, что это достаточно просто для вас, чтобы начать работу и облегчить себе жизнь.