Реакции — отличный индикатор вовлеченности аудитории. А еще наличие реакций под постом привлекает к нему новых читателей — ведь если 100500 человек отреагировали на пост, значит, он достоин внимания. И многие авторы этим пользуются, заказывая накрутку либо проставляя реакции вручную. Мы же решили этот процесс автоматизировать и в сегодняшнем материале расскажем, как создать собственный Telegram-бот для простановки реакций. Спешим обрадовать — это гораздо легче, чем кажется! Однако обо всем по порядку.
Какие задачи решает бот для простановки реакций
Естественно, главная задача бота для простановки реакций — автоматизация накрутки реакций. И в первую очередь это нужно для подогрева интереса к постам. Однако помимо этого, бот для простановки реакций позволяет:
Выделять нужные посты — ставя конкретные реакции на конкретные посты можно нативно формировать нужный вайб у подписчиков.
Стимулировать живые реакции — современные интернет-юзеры весьма избалованы и редко делают что-то сами. Совсем другое дело, если под постом уже есть реакции — нужно просто один раз тапнуть по нужной, а не искать ее самому в списке. А если реакции под постом позитивные, но хочется высказать свое «фи» — тут никакая лень не остановит. Все это положительно влияет на стату канала.
Ставить «какахи» конкурентам — мелочь, а приятно. Не то чтобы мы такое поддерживаем, но вы наверняка хотели сделать что-то такое, когда видели их под своими постами. С нашим ботом это становится возможным! :D
Но шутки в сторону — перейдем к алгоритму.
Принцип работы бота для простановки реакций
А алгоритм у бота для простановки реакции довольно простой:
- Считывание авторизационных реквизитов аккаунтов, которые будут использоваться для накрутки реакций.
- Прохождение авторизации.
- Считывание файла со списком постов, на которые нужно проставить реакции.
- Получение списка доступных реакций для каждого канала (они бывают разными).
- Уточнение, какие именно реакции вы хотите поставить (если задать только 1 — будет только она, если несколько, то они будут ставиться случайным образом).
- Непосредственно простановка реакций.
- Повтор для каждого аккаунта и каждого поста.
Как видите, все просто.
Пошаговая инструкция «Как создать бот для простановки реакций»
Технически бот для простановки реакций — это не бот, а автоматизация функционала юзер-api, который позволяет осуществлять простановку реакций без вашего участия. Однако для каждого аккаунта придется получать вручную api_id и api_hash.
Для их получения:
- Заходим на страницу разработчиков веб-версии.
- Переходим в «API development tools», вводим нужные данные.
- Получаем api_id и api_hash, сохраняем их.
- Повторяем шаги 1–4 для каждого аккаунта (увы, без этого никак).
Затем настраиваем сервер. Подробнее о его развертывании в этой статье. Ну, или просто арендуете любой хостинг для работы с Python. Но метод из статьи — бесплатный.
- Пишем в консоли сервера:
pip install asyncio
pip install telethon - Создаем на сервере любой .py файл и добавляем в него:
from telethon import TelegramClient
from telethon.errors import SessionPasswordNeededError
from telethon.tl.functions.messages import SendReactionRequest
from telethon.tl.functions.channels import GetFullChannelRequest
from telethon.tl.types import InputPeerChannel, ReactionEmoji
import asyncio
import random
def create_client(api_id, api_hash, phone_number):
session_name = f'session_{phone_number}'
return TelegramClient(session_name, api_id, api_hash)
def load_accounts(filename='accounts.txt'):
accounts = []
with open(filename, 'r') as f:
for line in f:
api_id, api_hash, phone_number = line.strip().split()
accounts.append((int(api_id), api_hash, phone_number))
return accounts
def load_links(filename='links.txt'):
with open(filename, 'r') as f:
return [line.strip() for line in f if line.strip()]
async def get_available_reactions(client, channel_name):
try:
await client.connect()
channel = await client.get_entity(channel_name)
full_chat = await client(GetFullChannelRequest(channel))
available_reactions = full_chat.full_chat.available_reactions
if available_reactions:
if hasattr(available_reactions, 'reactions'):
emoji_list = [reaction.emoticon for reaction in available_reactions.reactions]
return emoji_list
else:
emoji_list = ["👍", "❤️", "😂", "😮", "😢", "🔥"]
return emoji_list
else:
print(f"Нет доступных реакций для канала {channel_name}.")
return []
except Exception as e:
print(f"Error while getting available reactions: {e}")
return []
finally:
await client.disconnect()
async def send_reaction(client, phone_number, post_url, emoji):
channel_name = post_url.split('/')[3]
message_id = int(post_url.split('/')[-1])
try:
await client.connect()
if not await client.is_user_authorized():
await client.sign_in(phone_number)
print(f"Введите код для {phone_number}: ")
code = input('> ')
try:
await client.sign_in(phone_number, code)
except SessionPasswordNeededError:
password = input("Введите пароль двухфакторной аутентификации: ")
await client.sign_in(password=password)
channel = await client.get_entity(channel_name)
result = await client(SendReactionRequest(
peer=InputPeerChannel(channel.id, channel.access_hash),
msg_id=message_id,
big=True,
add_to_recent=True,
reaction=[ReactionEmoji(emoticon=emoji)]
))
except Exception as e:
print(f"Error with {client.session.filename}: {e}")
finally:
await client.disconnect()
def get_reaction_choices(emoji_list):
while True:
print(f"Доступные реакции для канала: {emoji_list}")
choices = input("Введите номера смайлов через запятую (например, 1,4,5): ")
choices = choices.split(',')
try:
chosen_indices = [int(choice.strip()) - 1 for choice in choices]
if all(0 <= index < len(emoji_list) for index in chosen_indices):
return chosen_indices
else:
print("Некоторые номера не существуют. Пожалуйста, попробуйте снова.")
except ValueError:
print("Некорректный ввод. Убедитесь, что вы ввели числа.")
async def main():
accounts = load_accounts()
links = load_links()
channel_reactions = {}
for post_url in links:
channel_name = post_url.split('/')[3]
if channel_name not in channel_reactions:
first_api_id, first_api_hash, first_phone_number = accounts[0]
first_client = create_client(first_api_id, first_api_hash, first_phone_number)
emoji_list = await get_available_reactions(first_client, channel_name)
if emoji_list:
chosen_indices = get_reaction_choices(emoji_list)
if len(chosen_indices) == 0:
print("Вы должны выбрать хотя бы одну реакцию.")
return
channel_reactions[channel_name] = chosen_indices, emoji_list
else:
print(f"Не удалось получить реакции для канала {channel_name}. Пропускаем.")
continue
tasks = []
for api_id, api_hash, phone_number in accounts:
client = create_client(api_id, api_hash, phone_number)
chosen_indices, emoji_list = channel_reactions[channel_name]
emoji = random.choice([emoji_list[index] for index in chosen_indices])
tasks.append(send_reaction(client, phone_number, post_url, emoji))
await asyncio.gather(*tasks)
asyncio.run(main()) - Сохраняем.
- Создаем файл accounts.txt, добавляем в него 'ВАШ API_ID', 'ВАШ API_HASH' и 'ВАШ НОМЕР' в следующем виде: API_ID API_HASH НОМЕР. Для добавления нескольких аккаунтов пишем с новой строки. После последнего аккаунта перенос строки не нужен (это важно!).
- Создаем файл links.txt, добавляем в него ссылки на посты, к которым хотим добавить реакции (в любой последовательности — бот сам их сгруппирует в себя в «голове»).
- Запускаем бот командой python bot.py.
- Выбираем реакции для каждого канала.
- Проверяем работоспособность.
! Важное уточнение: теоретически при копировании кода из браузера у вас может слететь кодировка. Это приведет к тому, что блок emoji_list = ["👍", "❤️", "😂", "😮", "😢", "🔥"] скопируется некорректно, и для каналов, где доступны все реакции, будет выпадать ошибка. В этом случае просто перепишите эту строку вручную, скопировав нужные вам смайлики непосредственно из самой Телеги. Увы, в API нет нужного инструмента для таких случаев.
Демонстрация работы
Для демонстрации мы взяли 3 тестовых канала — по 3 поста в каждом, и 5 аккаунтов.
Как видите из консоли, для первых двух каналов мы выбрали реакции №1 — палец вверх и обезьянку с закрытыми глазами. Для третьего ради разнообразия выбрали реакцию №2 — сердечко.
Однако ставить одну и ту же реакцию везде — не трастово, правда же? Поэтому давайте использовать рандом по указанным реакциям. В целом можно указать хоть все — но зачем?
Как видите из консоли, в этот раз на первом канале будет чертик, приведение, единорог и птичка. На втором — все три обезьянки. А на третьем, для демонстрации того, что бот не смешивает каналы, только одна реакция — огонечки.
Как видите по скриншотам — реакции соответствующие и рандомизированы по количеству. Далее просто масштабируете. Также можно добавить фичу, чтобы бот брал из файла ссылки не на конкретные посты, а на каналы, и при появлении в этих каналах новых постов сразу ставил на них реакции. Но в таком случае нужно учитывать, что просмотры он не добавляет.
The конец.