Traffic Cardinal Traffic Cardinal написал 16.10.2024

Создание бота для простановки реакций в Telegram

Traffic Cardinal Traffic Cardinal написал 16.10.2024
9 мин
0
203
Содержание

Реакции — отличный индикатор вовлеченности аудитории. А еще наличие реакций под постом привлекает к нему новых читателей — ведь если 100500 человек отреагировали на пост, значит, он достоин внимания. И многие авторы этим пользуются, заказывая накрутку либо проставляя реакции вручную. Мы же решили этот процесс автоматизировать и в сегодняшнем материале расскажем, как создать собственный Telegram-бот для простановки реакций. Спешим обрадовать — это гораздо легче, чем кажется! Однако обо всем по порядку.

banner banner

Какие задачи решает бот для простановки реакций

Естественно, главная задача бота для простановки реакций — автоматизация накрутки реакций. И в первую очередь это нужно для подогрева интереса к постам. Однако помимо этого, бот для простановки реакций позволяет:

  • Выделять нужные посты — ставя конкретные реакции на конкретные посты можно нативно формировать нужный вайб у подписчиков.

  • Стимулировать живые реакции — современные интернет-юзеры весьма избалованы и редко делают что-то сами. Совсем другое дело, если под постом уже есть реакции — нужно просто один раз тапнуть по нужной, а не искать ее самому в списке. А если реакции под постом позитивные, но хочется высказать свое «фи» — тут никакая лень не остановит. Все это положительно влияет на стату канала.

  • Ставить «какахи» конкурентам — мелочь, а приятно. Не то чтобы мы такое поддерживаем, но вы наверняка хотели сделать что-то такое, когда видели их под своими постами. С нашим ботом это становится возможным! :D

Здесь должна была быть смешнявка, но ты не поставил реакцию на пост — так что мема не будет…
Здесь должна была быть смешнявка, но ты не поставил реакцию на пост — так что мема не будет…

Но шутки в сторону — перейдем к алгоритму.

Принцип работы бота для простановки реакций

А алгоритм у бота для простановки реакции довольно простой:

  1. Считывание авторизационных реквизитов аккаунтов, которые будут использоваться для накрутки реакций.
  2. Прохождение авторизации.
  3. Считывание файла со списком постов, на которые нужно проставить реакции.
  4. Получение списка доступных реакций для каждого канала (они бывают разными).
  5. Уточнение, какие именно реакции вы хотите поставить (если задать только 1 — будет только она, если несколько, то они будут ставиться случайным образом).
  6. Непосредственно простановка реакций.
  7. Повтор для каждого аккаунта и каждого поста.

Как видите, все просто.

Пошаговая инструкция «Как создать бот для простановки реакций»

Технически бот для простановки реакций — это не бот, а автоматизация функционала юзер-api, который позволяет осуществлять простановку реакций без вашего участия. Однако для каждого аккаунта придется получать вручную api_id и api_hash.

Для их получения:

  1. Заходим на страницу разработчиков веб-версии.
  2. Переходим в «API development tools», вводим нужные данные.
  3. Получаем api_id и api_hash, сохраняем их.
  4. Повторяем шаги 1–4 для каждого аккаунта (увы, без этого никак).
    Затем настраиваем сервер. Подробнее о его развертывании в этой статье. Ну, или просто арендуете любой хостинг для работы с Python. Но метод из статьи — бесплатный.
  5. Пишем в консоли сервера:
    pip install asyncio
    pip install telethon
  6. Создаем на сервере любой .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())
  7. Сохраняем.
  8. Создаем файл accounts.txt, добавляем в него 'ВАШ API_ID', 'ВАШ API_HASH' и 'ВАШ НОМЕР' в следующем виде: API_ID API_HASH НОМЕР. Для добавления нескольких аккаунтов пишем с новой строки. После последнего аккаунта перенос строки не нужен (это важно!).
  9. Создаем файл links.txt, добавляем в него ссылки на посты, к которым хотим добавить реакции (в любой последовательности — бот сам их сгруппирует в себя в «голове»).
  10. Запускаем бот командой python bot.py.
  11. Выбираем реакции для каждого канала.
  12. Проверяем работоспособность.

! Важное уточнение: теоретически при копировании кода из браузера у вас может слететь кодировка. Это приведет к тому, что блок emoji_list = ["👍", "❤️", "😂", "😮", "😢", "🔥"] скопируется некорректно, и для каналов, где доступны все реакции, будет выпадать ошибка. В этом случае просто перепишите эту строку вручную, скопировав нужные вам смайлики непосредственно из самой Телеги. Увы, в API нет нужного инструмента для таких случаев.

Вот все стандартные реакции. Обратите внимание, что не обязательно вносить их все — достаточно лишь те, которые вы планируете проставлять.
Вот все стандартные реакции. Обратите внимание, что не обязательно вносить их все — достаточно лишь те, которые вы планируете проставлять.

Демонстрация работы

Для демонстрации мы взяли 3 тестовых канала — по 3 поста в каждом, и 5 аккаунтов.

Как видите из консоли, для первых двух каналов мы выбрали реакции №1 — палец вверх и обезьянку с закрытыми глазами. Для третьего ради разнообразия выбрали реакцию №2 — сердечко.

Как видите по скриншотам — реакции соответствующие
Как видите по скриншотам — реакции соответствующие

Однако ставить одну и ту же реакцию везде — не трастово, правда же? Поэтому давайте использовать рандом по указанным реакциям. В целом можно указать хоть все — но зачем?

Как видите из консоли, в этот раз на первом канале будет чертик, приведение, единорог и птичка. На втором — все три обезьянки. А на третьем, для демонстрации того, что бот не смешивает каналы, только одна реакция — огонечки.

Канал 1
Канал 1

Канал 2
Канал 2

Канал 3
Канал 3

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

The конец.

Здравствуйте! У вас включен блокировщик рекламы, часть сайта не будет работать!