Как войти в приватный канал через ссылку приглашения в телегармме на Python?

Есть код:

import random
from telethon import TelegramClient
from telethon.tl.functions.channels import JoinChannelRequest
from telethon.tl.functions.messages import SendReactionRequest
from telethon.tl.types import ReactionEmoji, ReactionCustomEmoji, Message
import asyncio
import re
import os

# Данные API Telegram для аккаунтов
ACCOUNTS = [
    {'api_id': 2, 'api_hash': 'two2', 'session': 'session2'},
    {'api_id': 3, 'api_hash': 'two3', 'session': 'session3'},
]

# Функция для подписки на канал
async def join_channel(client, channel_username):
    try:
        await client(JoinChannelRequest(channel_username))
        print(f"Аккаунт {client.session.filename} успешно подписался на канал {channel_username}.")
    except Exception as e:
        print(f"Ошибка подписки на канал {channel_username} аккаунтом {client.session.filename}: {e}")

# Функция для получения последнего сообщения
async def get_last_post(client, channel_username):
    try:
        channel = await client.get_entity(channel_username)
        messages = await client.get_messages(channel, limit=1)  # Получаем последнее сообщение
        return messages[0] if messages else None
    except Exception as e:
        print(f"Ошибка при получении последнего сообщения: {e}")
        return None

# Функция для получения существующих реакций на пост
def extract_reactions(message: Message):
    if not message.reactions:
        return []  # Если реакций нет

    reactions = []
    for reaction in message.reactions.results:
        if isinstance(reaction.reaction, (ReactionEmoji, ReactionCustomEmoji)):
            reactions.append(reaction.reaction)
    return reactions

# Функция для добавления одной случайной реакции
async def react_to_post(client, channel_username, post_id, reactions):
    try:
        if not reactions:
            print(f"Нет доступных реакций для аккаунта {client.session.filename}")
            return

        # Выбираем одну случайную реакцию
        random_reaction = random.choice(reactions)
        await client(SendReactionRequest(
            peer=channel_username,
            msg_id=post_id,
            reaction=[random_reaction]  # Отправляем реакцию
        ))
        print(f"Аккаунт {client.session.filename} добавил реакцию: {random_reaction}")
    except Exception as e:
        print(f"Ошибка на аккаунте {client.session.filename}: {e}")

# Основная функция
async def main(channel_username):
    tasks = []
    for account in ACCOUNTS:
        session_file = f"{account['session']}.session"  # Имя файла сессии
        if not os.path.exists(session_file):  # Если файл сессии не существует
            print(f"Файл сессии {session_file} отсутствует. Он будет создан.")

        client = TelegramClient(account['session'], account['api_id'], account['api_hash'])
        await client.start()

        # Подписываемся на канал
        await join_channel(client, channel_username)

        # Получаем последнее сообщение
        last_message = await get_last_post(client, channel_username)
        if not last_message:
            print(f"Не удалось получить последнее сообщение для {client.session.filename}")
            continue

        # Получаем реакции на пост
        reactions = extract_reactions(last_message)
        if not reactions:
            print(f"На посте {last_message.id} нет реакций для {client.session.filename}")
            continue

        # Ставим одну случайную реакцию
        tasks.append(react_to_post(client, channel_username, last_message.id, reactions))

    await asyncio.gather(*tasks)

# Ввод данных
if __name__ == "__main__":
    channel_link = input("Введите ссылку на канал (например, https://t.me/example_channel): ")

    # Извлекаем username из ссылки
    match = re.search(r"t\.me/([a-zA-Z0-9_]+)", channel_link)
    if match:
        channel_username = match.group(1)  # username из ссылки
        asyncio.run(main(channel_username))
    else:
        print("Некорректная ссылка. Убедитесь, что она имеет формат https://t.me/example_channel")

Кидаю ссылку на ТГ канал и два аккаунта сперва заходят в канал и дальше добавляют реакции к тем реакциям, которые уже есть под последним постом. Как можно сделать так чтобы я мог кинуть ссылку на приватный канал и аккаунты также заходили и ставили реакции под последним постом ?


Ответы (1 шт):

Автор решения: Yaroslav

сам не проверял, но это есть в TDLib

    invite_link = ''
    client(ImportChatInviteRequest(invite_link))

не забудьте импортировать это

    from telethon.tl.functions.messages import ImportChatInviteRequest

пример из TDLib:

with TelegramClient(name, api_id, api_hash) as client:
    result = client(functions.messages.ImportChatInviteRequest(
        hash='A4LmkR23G0IGxBE71zZfo1'
    ))
→ Ссылка