Как завести канал в Telegram, при этом прикладывать к ведению канала абсолютный минимум своих сил и времени.
Мы не будем создавать уникальный контент, потому что сейчас полно каналов, которые публикуют одну и ту же новость, используя один и тот же источник-донор. Для начала заведем два канала: первый для публикаций и второй для отбора контента. А именно напишем бота, который по списку каналов, на которые вы должны быть подписаны, будет присылать новые публикации в ваш скрытый паблик, а вы как администратор, подтвердите/проигнорируете данную публикацию на отправку в ваш публичный канал. Так работает мой канал developer from village, зацените! Постараюсь описать свои действия в некоторой последовательности, чтобы все было очень понятно даже для самых маленьких, потому что все мы учимся и цель статьи не создать свой канал, но прочувствовать весь процесс от идеи до разработки, а также тестированию, разворачиванию и эксплуатации. Поэтому для более опытных пользователей, какие-то моменты будут скучны🤷🏼♂️ Как будет строиться статья:
- Установка Python
- Выбор среды разработки
- Установка виртуальной среды
- Написания кода и запуск
- [ Бонус ] : Завернем в контейнер и запустим на сервере
Установка Python
Заходим на официальный сайт
Скачиваем 3.7 версию Python. Гнаться за крайней версией мы не будем, чтобы быть увереными в совместимости библиотек.
Выбор среды разработки
Выбор огромен, я оставлю эту тему для собственного разбора, да и это вопрос вкуса. Лично я использую Visual Studio Code. Если интересно, чтобы я рассказал о полезных фичах VS Code, гибких настройках и приятных глазу темах, пишите в комметариях и ставьте лайки. Почитать о других средах разработки можно тут.
Установка виртуальной среды
Объясню необходимость. При разработке Python-приложений или использовании решений на Python, созданных другими разработчиками, может возникнуть ряд проблем, связанных с использованием библиотек различных версий. Рассмотрим их более подробно.
Во-первых: различные приложения могут использовать одну и ту же библиотеку, но при этом требуемые версии могут отличаться.
Во-вторых: может возникнуть необходимость в том, чтобы запретить вносить изменения в приложение на уровне библиотек, т.е. вы установили приложение и хотите, чтобы оно работало независимо от того обновляются у вас библиотеки или нет. Как вы понимаете, если оно будет использовать библиотеки из глобального хранилища (/usr/lib/pythonXX/site-packages), то со временем могут возникнуть проблемы.
В-третьих: у вас просто может не быть доступа к каталогу /usr/lib/pythonXX/site-packages.
Для решения данных вопросов используется подход, основанный на построении виртуальных окружений – своего рода песочниц, в рамках которых запускается приложение со своими библиотеками, обновление и изменение которых не затронет другие приложения, использующие те же библиотеки.
Установка virtualenv
Virtualenv можно установить с использованием менеджера pip (ссылка на статью), либо скачать исходные коды проекта и установить приложение вручную.
Установка с использованием pip.
Для установки virtualenv откройте консоль и введите следующую команду:
> pip3 install virtualenv
Создание виртуального окружения
Виртуальное окружение создается следующей командой:
> virtualenv PRG1
PRG1 в данном случае – это имя окружения. Имя выбираете вы самостоятельно.
После выполнения данной команды, в текущем каталоге будет создан новый каталог с именем PRG1. Разберем более подробно его содержимое.
RPG1/bin/ – содержит скрипты для активации/деактивации окружения, интерпретатор Python, используемый в рамках данного окружения, менеджер pip и ещё несколько инструментов, обеспечивающих работу с пакетами Python. В Windows, это каталог PRG1\Scripts
PRG1/include/ и PRG1/lib/ – каталоги, содержащие библиотечные файлы окружения. Новые пакеты будут установлены в каталог PRG1/lib/pythonX.X/site-packages/.
Активация виртуального окружения
Для активации виртуального окружения воспользуйтесь командой (для Linux):
> source PRG1/bin/activate
для Windows команда будет выглядеть так:
> PRG1\Scripts\activate.bat
Деактивация виртуального окружения
Для деактивации виртуального окружения (выхода из него), введите команду deactivate для Linux или deactivate.bat, если вы работаете в Windows.
> deactivate
Написание кода и запуск
Идея: 💡
Для начала еще раз опишу идею. Создаем наш public канал, в который будем постить. Также создаем второй канал со специфичным именем, чтобы его было сложенее найти в поиске (например: skf42bsjt). Нашему боту потребуется api_id, api_hash, номер телефона и ваше имя пользователя. При появлении нового сообщения в одном из каналов, которые мы передали боту, бот перешлет в наш скрытый паблик и целочисленный номер поста. Зачем нужно это число? Допустим нам понравился пост, за которым следует номер 5. Мы пишем в наш скрытый чат 5+, бот понимает, что это мы прислали: и что за номером 5 стоит пост, который нам понравился, тогда пересылает в наш открытый канал без указания автора.
Получаем необходимые credentials: 😎
Создаем каналы. Пусть скрытый канал будет называться skf42bsjt, а открытый канал hello_world. Мы будем использовать библиотеку Pyrogram. Для корректной работы необходимо зарегистрировать и получить собственные api_id и api_hash на my.telegram.org. Устанавливаем в виртуальном окружении необходимые модули:
pip3 install pyrogram
pip3 install TgCrypto
Теперь для того, чтобы хранить информацию о постах будем использовать модуль shelve. Для работы с бинарными файлами в Python может применяться модуль shelve. Он сохраняет объекты в файл с определенным ключом. Затем по этому ключу может извлечь ранее сохраненный объект из файла. Процесс работы с данными через модуль shelve напоминает работу со словарями, которые также используют ключи для сохранения и извлечения объектов. Обратите внимание, shelve поддеживает только строковые ключи. Итак, начнем. Для начала заведем все переменные и подключим модули, заведем клиента. Запустим следующий код:
from pyrogram import Client, filters # телеграм клиент
import apis
import shelve # файловая база данных
db = shelve.open('data', writeback=True)
API_ID = apis.API_ID
API_HASH = apis.API_HASH
PRIVATE_PUBLIC = 'skf42bsjt' # скрытый паблик для управления ботом
PUBLIC_PUBLIC = 'hello_world' # паблик куда будем репостить
# список пабликов-доноров, откуда бот будет пересылать посты
SOURCE_PUBLICS = [
'habr_com',
'Reddit'
]
PHONE_NUMBER = '+7...' # номер зарегистрованный в телеге
# создаем клиент телеграм
app = Client("ИМЯ_ПОЛЬЗОВАТЕЛЯ", api_id=API_ID, api_hash=API_HASH,
phone_number=PHONE_NUMBER)
if __name__ == '__main__':
print('Bot started!')
app.run() # эта строка запустит все обработчики
После того как запустим приложение из Телеграмма, придет код подтверджения, который необходимо ввести в терминале.
Если все успешно, то в вашем проекте появится файлик имя_пользователя.session. Файл хранит историю о пользователе, и поэтому при повторном запуске не требуется вводить код подтверждения из Телеграмма.
Теперь создадим функцию пересылки сообщения из каналов-доноров в наш скрытый канал:
Опишем функцию add_post_to_db для учета нового сообщения:
Теперь отслеживаем, что мы дали согласие на отправку поста в наш канал:
Полный код можно найти на github. Кажется на этом уже практически все, осталось запустить.
Подсказка 😏
Скорей всего сообщения, приходящие вам в скрытый канал, будут приходить без уведомления, а это риск пропустить важные и полезные публикации. Для этого я добавил чат для обсуждения в скрытый канал, теперь каждый пост в скрытый канал дублируется в чат, для остальных каналов можно отключить уведомления.
Мысли по улучшению 🤯
Для тех, кто хочет быть в тренде, то можно добавить методы машинного обучения. Например, классификатор для публикаций и определять рекламные публикации на этапе их пересылки в скрытый чат. Также можно добавить интеллектуальный анализ текста для определения темы публикации, тональности, да и вообще дальше все зависит от вашей фантазии. Жду ваших идей в комментариях👇
Бонус 🌟
Для тех, кто не хочет, чтобы бот запускался на рабочей машине, можно запустить на виртуальной или у кого есть арендованный сервер, можно закинуть туда. Для этого потребуется предустановленный Docker. А чтобы собрать образ потребуется Dockefile. Для тех кому что-то не понятно, просто пишите в комментариях и я подробнее опишу, и вообще не стесняйтесь задавать вопросы, так мы можем узнать много нового. Но также не забывайте, самая лучшая мотивация делать новые публикации это ваша реакция. Dockerfile простой:
FROM python:3.7
COPY . .
RUN pip install -r requirements.txt
CMD [ "python3", "./tgcontent.py" ]
Создать обрать потребуется следующими командами:
docker build папка_с_Dockerfile/. -t tgcontentmaker
После этого запускать контейнер с данным образом:
docker run -d tgcontentmaker:latest