Telegram бот не присылает сообщения

Рейтинг: 1Ответов: 1Опубликовано: 20.02.2023

я делаю парсер из дискорда в телеграм (парсит с обычного аккаунта абсолютно все сообщения в нужном канале и перенаправляет их в телеграм бот в личку/канал). сам парсер работает отлично, а вот бот не отправляет ничего. ошибки в консоли не пишет, за исключением тех, что выводятся уже после отключения кода. прилагаю код:

import json
import discord
import telebot
import requests
from multiprocessing import Pool

TOKEN_TG = ''
TOKEN_DS = ''

NUM_PROCESSES = 4
MAX_TIMESTAMPS = 1000

CHANNEL_IDS = []
USER_IDS = ['']


intents = discord.Intents.default()
intents.members = True
client = discord.Client(intents=intents)

bot = telebot.TeleBot(TOKEN_TG)
session = requests.Session()
session.headers['authorization'] = TOKEN_DS


def is_message(obj):
    res = "timestamp" in obj and (
        (
            "embeds" in obj and
            isinstance(obj["embeds"], list) and
            all(["description" in x for x in obj["embeds"]])
        ) or
        "content" in obj)
    return res


def extract_timestamped_content(message) -> [str, str]:
    timestamp = message["timestamp"]

    content_parts = []

    if ("embeds" in message):
        content_parts.extend([x["description"] for x in message["embeds"]])

    if ("content" in message):
        content_parts.append(message["content"])

    content = "\n\n".join(content_parts)

    return [timestamp, content]


def get_new_contents(session: requests.Session, channel_id: str, old_timestamps: list[any]) -> list[str]:
    response = session.get(
        f'https://discord.com/api/v9/channels/{str(channel_id)}/messages?limit=10')

    data = json.loads(response.text)

    if (not isinstance(data, list)):
        print(f"Server returned malformed data: {response.text}")
        return []

    timestamped_contents = [extract_timestamped_content(
        x) for x in data if is_message(x)]

    new_timestamped_contents = [
        x for x in timestamped_contents if x[0] not in old_timestamps]

    if len(new_timestamped_contents) == 0:
        print(f"No new messages on channel {channel_id}")
        return []

    print(new_timestamped_contents)

    old_timestamps.extend([x[0] for x in new_timestamped_contents])

    return [x[1] for x in new_timestamped_contents]


def send_messages(bot: telebot.TeleBot, user_ids: list[str], payload: str):
    try:
        for user_id in user_ids:
            bot.send_message(user_id, payload)

    except KeyError:
        print("Can't send")


def runner(channel_id: str):
    print(f"runner on {channel_id} started")

    old_timestamps = []
    while True:
        new_contents = get_new_contents(session, channel_id, old_timestamps)

        for new_content in new_contents:
            send_messages(bot, USER_IDS, new_content)

            if len(old_timestamps) > MAX_TIMESTAMPS:
                old_timestamps.pop(0)

        time.sleep(20)


def main():
    with Pool(NUM_PROCESSES) as p:
        p.map(runner, CHANNEL_IDS)


if __name__ == "__main__":
    main()```

Ответы

▲ 1

Вам надо функции, которая отправляет сообщения в телеграм (я так понял это функция send_messages), написать декоратор:

@bot.message_handler(content_types=["text"])
def send_messages(bot: telebot.TeleBot, user_ids: list[str], payload: str):
    try:
        for user_id in user_ids:
            bot.send_message(user_id, payload)

    except KeyError:
        print("Can't send")

Этот декоратор делает так, чтобы при написании любого текста он отправляет сообщение. И функция должна принимать параметр message, но не уверен, что он обязательный, почитайте в документации.