Как войти в приватный канал через ссылку приглашения в телегармме на 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'
))