ТЗ - РЕПОСТОЧНАЯ
Краткое описание:
Проект "репосточная" это сетка каналов, каждый из которых посвящен конкретной тематике, например Маркетинг, Кино, Путешествия.
Наполнятся каналы будут репостами из десятков вручную отобранных каналов соответствующей тематики. (у каждого канала будет примерно 30-100 доноров)
Конечно, если репостить все подряд из десятков каналов получится ерунда, будет слишком много контента низкого качества вперемешку с кучей рекламы.
Моя цель сделать каналы, которые будут собирать сливки контента с лучших телеграм каналов. (Причем без нарушения авторских прав, поэтому контент будет именно репоститься, а не копироваться)
Задача - сделать бот, который будет отбирать посты каналов-доноров по заданным параметрам и репостить отобранные в соответствующий целевой канал-проект.
Фильтр:
Лучший способ отделить качественный контент это показатели реакций+репостов. Чем их больше, тем лучше пост. (не всегда конечно, но лучших параметров нет)
Что бы определить нужно ли делать репост мы должны сравнить реакции+репосты этого поста с предыдущими постами на этом канале.
Также нужно оставаться актуальными, поэтому мы будем снимать статистику реакции+репосты и просмотры ровно через один час (60 минут) после публикации поста(в первый час как правило пост получает 20-30% всех просмотров, этого достаточно для оценки).
Еще есть проблема с тем, что в разное время суток на посте в первый час может быть разное количество просмотров, и значит разное количество реакций+репостов, поэтому мы должны привести это значение к общему знаменателю соотношения реакций+репостов к просмотрам.
Я думал о простом коэффициенте, но для наглядности будет лучше приводить показатель реакции+репосты к 10000 просмотрам.
То есть формула такая - 10000 разделить на количество просмотров за первый час и умножить на количество реакций+репостов за первый час = рейтинг поста.
Например за первый час было 300 просмотров и 25 реакций+репостов, значит рейтинг будет:
Или если за первый час было 2400 просмотров и 87 реакций+репостов, то рейтинг поста:
Думаю в базе данных будут такие столбцы:
Канал|ссылка на пост|просмотры за час|реакций+репостов за час|рейтинг
Либо у каждого канала должны быть своя область в базе данных, которая не будет смешиваться с остальными каналами донорами - дальше по тексту будет ясно почему (из-за алгоритмов и функции выдачи рейтинга).
Алгоритм X
Если рейтинг поста больше, чем у X последних постов на канале-доноре, то бот делает репост.
Число X задается вручную при добавлении каждого канала-донора в бот, потому что есть каналы у которых посты выходят пару раз в неделю, а есть те у которых по 10 постов в день. Это я буду определять сам и вручную задавать этот параметр при добавлении канала.
Как только пост получает рейтинг, этот рейтинг сравнивается с рейтингами X последних постов на этом же канале и если его рейтинг выше, то бот делает репост в целевой канал.
Если идут несколько хороших постов подряд, но рейтинги последующих чуть ниже первого, то алгоритм будет их игнорировать несмотря на то, что они могут быть сильно лучше, чем средний пост на канале.
Алгоритм Y
Мы собираем рейтинг последних 50 постов.
При добавлении канала я буду задавать параметр Y - "лучше, чем топ..." и цифра. Допустим для примера Y=5.
Если наблюдаемый пост получает рейтинг выше, чем пост на 5 месте в рейтинге последних 50 постов, то происходит репост.
Еще раз - при выходе нового поста алгоритм берет 50 последних постов, выстраивает их по рейтингу, находит рейтинг 5-го по рейтингу поста (если в настройке Y "лучше, чем топ..." я поставил цифру 5) и сравнивает его рейтинг с рейтингом вышедшего поста, если рейтинг нового поста выше, то происходит репост, если ниже, то просто запись поста и его рейтинга в базу данных.
И конечно каждый новый пост добавляется в рейтинг и учитывается при оценке следующего поста, таким образом состав последних 50 постов постоянно меняется и рейтинг получается динамический.
Такой подход лучше прошлого потому что если выходит 2 хороших поста подряд, которые попадают под критерии, но второй пост чуть хуже первого,
то старый алгоритм его игнорирует, а вот новый алгоритм делает репост.
1. Если админ будет включать и отключать реакции, то алгоритм начнет сбоить и он начнет либо репостить все подряд, либо игнорировать все подряд.
Поэтому если изменяется статус реакций бот должен прислать уведомление типа "проект "имя проекта", канал "ссылка на канал" отключил/включил реакции", начать собирать данные нового рейтинга пока не соберет данные 50 постов и на это время включить Алгоритм X.
2. Слишком долгий сбор данных, на некоторых каналах 50 постов выходит за 2 месяца и больше. То есть после добавления нового канала иногда придется ждать 2 месяца, что бы он попал в ротацию, а за это время может многое поменяться.
Совмещение алгоритмов.
Я предлагаю сначала использовать алгоритм X, это позволит дать быстрый старт донора в ротацию, а когда бот соберет рейтинг 50 постов автоматически включать работу алгоритма Y.
И плюс включать алгоритм X, когда админ донора включает/отключает реакции, пока не наберется 50 рейтинговых постов в новом статусе.
Такое совмещение нивелирует слабости обоих алгоритмов.
Еще про рейтинг:
На всякий случай уточню - если на канале отключены реакции, то рейтинг постов все равно составляется, просто на основе репостов, то есть в параметре "репосты+реакции" "реакции" будут равны 0 и учитываются только репосты.
Что важно - рейтинги постов сравниваются внутри каждого канала, я намеренно не хочу делать рейтинг постов всех каналов в одной куче, потому что активность аудиторий в разных каналах очень разная и сравнивать ее некорректно.
Еще бот должен игнорировать репосты с других каналов в каналах донорах и не записывать их базу данных. Потому что возможны пересечения, когда канал репостит пост с другого канала, который тоже есть в ротации и один и тот же пост будет зарепощен в проект дважды.
Структура бота
Главное меню и добавление целевых каналов (проектов)
Это целевые каналы (проекты), то есть те, которые в которые будут делаться репосты.
При нажатии "Добавить проект" бот будет спрашивать "Введите название канала", после ввода названия бот отправит "Введите ссылку на канал", после отправки ссылки бот проверит является ли он админом канала, создаст кнопку в главном меню и область в базе данных.
При нажатии "Удалить проект" бот будет запрашивать "отправьте ссылку на удаляемый канал" и удалять проект связанный с ссылкой.
Во всех путях до этого и далее если бот требует дальше что-то вводить должна быть кнопка "назад", которая возвращает в предыдущее меню и отменяет незаконченную операцию.
Настройка целевого канала (проекта)
Такое меню открывается при нажатии на кнопку любого проекта (Маркетинг, Кино и тд)
При каждом открытии бот должен отправлять название проекта в управление которым я зашел, на рисунке это сообщение "Маркетинг" (что бы не путаться и не начать добавлять каналы не в тот проект).
При нажатии бот отправляет запрос "введите ссылку на канал", после отправки ссылки бот запрашивает "введите число X(последние посты)" для алгоритма X (напомню, что это число предыдущих постов с рейтингами которых сравнивается рейтинг целевого поста)
После ввода числа Х бот запрашивает "введите число Y (лучше чем топ...)" для алгоритма Y(напомню, что это номер поста в топе рейтинга последних 50 постов канала-донора с которым мы сравниваем текущий пост. Если рейтинг оцениваемого поста выше, то происходит репост)
После введения бот отправляет сообщение "канал добавлен" и возвращается в меню управления текущим каналом-проектом (рисунок выше). И напомню, что до окончания добавления канала должна быть активна кнопка "назад", которая отменяет незавершенный процесс добавления канала.
Надо избегать дублей. Если я по ошибке захочу добавить канал второй раз, то на этапе ввода ссылки на него бот должен вернуть сообщение "Такой канал уже есть".
При нажатии бот делает запрос "введите ссылку на канал", удаляет соответствующий канал-донор из проекта и из базы данных и отправляет сообщение "канал удален".
По ее нажатии бот будет спрашивать "введите ссылку на канал" и после ввода ссылки "введите новое число Х" и "введите новое число Y"
Мне нужны паузы во времени, когда бот не делает репосты, а только пассивно собирает данные о вышедших постах в базу и присваивает рейтинг.
Во-первых нужна пауза для перерыва ночью, что бы репосты не будили юзеров уведомлениями.
Во-вторых нужны паузы для рекламы, потому что обычное условие рекламных постов это 1-2 часа в топе.
Причем в начале рекламы вообще не будет, а потом когда наберутся подписчики я не знаю сколько будет рекламных слотов в день, 1, 2 или даже 3.
При нажатии бот выдает список действующих пауз и запрашивает "введите время начала паузы в формате 00:00"
после ввода бот делает запрос "введите время конца паузы"
и после ввода бот отправляет сообщение "пауза добавлена" и возвращается в меню проекта.
(ну и напомню про кнопку "назад" активную до завершения операции)
Паузы работают не разово, а бессрочно, пока не будут удалены.
При нажатии бот отправляет список пауз и сообщение "введите номер паузы которую хотите удалить"
после ввода бот отправляет сообщение "пауза удалена" и возвращается в меню проекта.
При нажатии бот запрашивает "введите количество дней за которое вы хотите получить статистику". После ввода числа, например 7, бот отправляет список всех каналов-доноров проекта за последние 7 дней с такими данными о каждом:
Текущий статус алгоритма - X или Y
Сколько постов вышло на канале (за количество дней, который мы ввели, в примере 7)
Сколько нами сделано репостов с этого канала (за количество дней, который мы ввели, в примере 7)
Таким образом кнопка статистики одновременно дает мне список действующих каналов и позволяет оценить есть ли необходимость менять число Х и Y для этого канала.
Мне нужен рейтинг постов для целей продвижения.
От каждого канала-донора в ротации по одному посту с высшим рейтингом за введенный период. Список должен быть отсортирован по рейтингу от высшего к низшему.
При нажатии кнопки бот спрашивает "введите количество дней".
После отправки числа бот выдает рейтинг лучших постов (по одному лучшему с каждого канала) за последние 7 дней в формате:
Возможно когда каналов-доноров будет слишком много(допустим 100) они могут не умещаться в лимиты телеграм для одного поста, в таком случае данные по статистике и рейтингу должны автоматически разбиваться на 2 поста и больше.
Насколько я понимаю можно сделать что бы юзерботов можно было добавлять прямо через интерфейс телеграма, что бы при нажатии кнопки "добавить/заменить юзербот" бот отвечал "убедитесь, что юзербот является администратором канала-проекта и отправьте его номер телефона", я отправляю номер, бот отвечает "введите код, который телеграм отправил в залогиненый аккаунт", в ответ я отправляю код и юзербот добавляется.
При добавлении юзербота бот должен проверять, что юзербот является админом целевого канала-проекта, а также юзербот должен подписаться на все каналы-доноры, которые сейчас в базе что бы получать уведомления о выходе постов. И автоматически подписываться на каналы, которые добавляются в проект уже после добавления юзербота и отписываться от тех, которые удаляются.
Функционирование юзерботов и другие детали
На каждый канал-проект будет один юзербот. (на старте будет 8 каналов-проектов, в каждом по 50 каналов-доноров в среднем, в целом их бы мог обслуживать один юзербот не достигая лимита в 500 каналов, но в будущем каналов-проектов возможно будет 30+, поэтому лучше сразу делать систему 1 канал-проект - 1 юзербот.)
Он будет подписан на все каналы-доноры для целевого канала-проекта. Он должен пассивно фиксировать выход новых постов в каналах-донорах. Когда новый пост выходит в одном из каналов-доноров юзербот должен записать время выхода поста, в каком канале вышел пост и создать отложенную на 60 минут команду снять параметры поста. (или это делается просто средствами telethon, тут я хз, не разбираюсь)
Через 60 минут юзербот заходит в канал, находит пост, который вышел в записанное в базу время (60 минут назад), снимает параметры просмотров, реакций и репостов, подставляет их в формулу, получившееся число рейтинга записывается в базу данных. Потом юзербот смотрит в статусе какого алгоритма - X или Y находится данный канал. И на основе текущего алгоритма принимается решение делать репост или нет.
Да, еще надо подумать о реакции, когда юзербот заходит в канал в заданное время по команде снять параметры поста, а этот пост удален. Если так произойдет запись об этом посте должны быть удалена из базы данных, если она была сделана.
Еще есть момент с тем, что когда я захожу в канал обычно количество просмотров подгружается не сразу, а через некоторое время, обычно до 5 секунд. Я вот хз как с этим у telethon, может ли он снимать параметр "просмотры" мгновенно или тоже нужно ждать пока подгрузится?
Так как есть риски бана юзерботов бот должен будет уведомлять, что юзербот забанен. И важно уведомлять какой именно юзербот забанен, что бы быстро его заменить.
Нашел статью на Хабре, где человек сделал базовый агрегатор, ему хватило одного юзербота на 500 каналов и вроде на баны не жаловался, но перестраховаться стоит https://habr.com/ru/articles/544414/
Есть еще технический момент, что по некоторым источникам юзерботы не умеют пересылать посты в которых есть альбом из фотографий и начинают фотографии пересылать по одной, надо уточнить есть ли такая проблема и если да, то нужно игнорировать такие посты. Делать запись рейтинга в базу, но не репостить. Но вроде бы есть специальная команда в telethon для пересылки альбомов, технических подробностей не знаю.
Надо добавить пару моих аккаунтов как админов бота, и сделать что бы для случайно наткнувшихся на бот он не работал и выглядел просто пустым.
Бот надо будет поставить на мой сервак и настроить автозапуск на случаи сбоев и перезагрузки сервера.
Проект потенциально долгосрочный, так что это ТЗ по сути MVP, думаю доработки неизбежны, но уже после полномасштабных тестов.
Проект для меня серьезный, мне очень важно что бы все работало стабильно, поэтому тесты будут плотные и возможно займут до двух недель, учитывая специфику алгоритмов.