Найти тему
developer from village

Админ-новичок или как написать 🤖 для автоведения Telegram-канала на 🐍 + БОНУС.

Оглавление
#python3  #telegram channel #admin
#python3 #telegram channel #admin

Как завести канал в Telegram, при этом прикладывать к ведению канала абсолютный минимум своих сил и времени.

Мы не будем создавать уникальный контент, потому что сейчас полно каналов, которые публикуют одну и ту же новость, используя один и тот же источник-донор. Для начала заведем два канала: первый для публикаций и второй для отбора контента. А именно напишем бота, который по списку каналов, на которые вы должны быть подписаны, будет присылать новые публикации в ваш скрытый паблик, а вы как администратор, подтвердите/проигнорируете данную публикацию на отправку в ваш публичный канал. Так работает мой канал developer from village, зацените! Постараюсь описать свои действия в некоторой последовательности, чтобы все было очень понятно даже для самых маленьких, потому что все мы учимся и цель статьи не создать свой канал, но прочувствовать весь процесс от идеи до разработки, а также тестированию, разворачиванию и эксплуатации. Поэтому для более опытных пользователей, какие-то моменты будут скучны🤷🏼‍♂️ Как будет строиться статья:

  1. Установка Python
  2. Выбор среды разработки
  3. Установка виртуальной среды
  4. Написания кода и запуск
  5. [ Бонус ] : Завернем в контейнер и запустим на сервере

Установка Python

Заходим на официальный сайт

-2

Скачиваем 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() # эта строка запустит все обработчики

После того как запустим приложение из Телеграмма, придет код подтверджения, который необходимо ввести в терминале.

-3

Если все успешно, то в вашем проекте появится файлик имя_пользователя.session. Файл хранит историю о пользователе, и поэтому при повторном запуске не требуется вводить код подтверждения из Телеграмма.

Теперь создадим функцию пересылки сообщения из каналов-доноров в наш скрытый канал:

-4

Опишем функцию add_post_to_db для учета нового сообщения:

-5

Теперь отслеживаем, что мы дали согласие на отправку поста в наш канал:

-6

Полный код можно найти на 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