You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Python脚本调用Discord机器人函数?Telegram转Discord遇阻

问题分析与解决方案

你的代码核心问题有三个:

  1. Discord Bot阻塞主程序:discord_signal.py中的bot.run()是阻塞调用,导入该模块时会直接启动Bot并卡住,主脚本的main()函数根本无法执行。
  2. 异步函数调用错误:主脚本中直接同步调用异步函数send_message,不会触发实际的消息发送逻辑。
  3. 同步/异步环境冲突:Telethon用了同步API,和discord.py的异步框架不兼容,导致程序逻辑无法协调运行。

修改后的完整代码

将Telegram抓取和Discord发送逻辑整合到同一个异步程序中,解决所有冲突问题:

# -*- coding: utf-8 -*-
import asyncio
import validators
import re
import config
from telethon import TelegramClient
import discord
from discord.ext import commands

# 加载配置项
api_id = config.API_ID
api_hash = config.API_HASH
phone_number = config.PHONE_NUMBER
telegram_channel = config.CHANNEL_T

discord_token = config.DISCORD_TOKEN
discord_channel_id = config.DISCORD_CHANNEL_ID

# 初始化Discord Bot
intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix='!', intents=intents)

# 初始化Telegram客户端
telegram_client = TelegramClient('your_account', api_id, api_hash)

async def fetch_telegram_messages():
    """抓取Telegram频道中的链接消息(支持提取消息内所有链接)"""
    await telegram_client.start(phone_number)
    entity = await telegram_client.get_entity(telegram_channel)
    # 建议限制合理的消息数量,避免内存占用过高
    messages = await telegram_client.get_messages(entity, limit=1000)
    link_list = []
    # 正则匹配所有HTTP/HTTPS链接
    url_pattern = re.compile(r'https?://\S+')
    
    for msg in messages:
        if msg.text:
            # 提取纯链接消息或消息内的所有链接
            if validators.url(msg.text):
                link_list.append(msg.text)
            else:
                urls = url_pattern.findall(msg.text)
                link_list.extend(urls)
    # 去重避免重复发送
    return list(set(link_list))

async def send_to_discord(msg):
    """发送消息到指定Discord频道"""
    channel = bot.get_channel(discord_channel_id)
    if channel:
        try:
            await channel.send(msg)
            print(f"已发送:{msg}")
        except discord.errors.HTTPException as e:
            print(f"发送失败:{e}")
    else:
        print(f"无法找到ID为{discord_channel_id}的Discord频道")

@bot.event
async def on_ready():
    """Discord Bot就绪后执行抓取和发送逻辑"""
    print(f"Discord Bot登录成功:{bot.user}")
    links = await fetch_telegram_messages()
    print(f"共抓取到{len(links)}条有效链接")
    
    # 逐条发送,添加延迟避免被Discord限流
    for link in links:
        await send_to_discord(link)
        await asyncio.sleep(1)
    
    # 任务完成后关闭Bot和Telegram客户端
    await bot.close()
    await telegram_client.disconnect()

async def main():
    """启动异步循环,同时初始化Telegram和Discord服务"""
    await asyncio.gather(
        telegram_client.connect(),
        bot.start(discord_token)
    )

if __name__ == '__main__':
    asyncio.run(main())

关键修改说明

  1. 统一异步环境:Telethon改用异步API(所有调用添加await),和discord.py的异步框架兼容,避免同步/异步冲突。
  2. 移除阻塞调用:替换bot.run()为bot.start(),并在on_ready事件中执行核心逻辑,避免导入模块时阻塞主程序。
  3. 优化链接提取:新增正则匹配逻辑,可提取消息内的所有链接(不仅限于纯链接消息),同时添加去重处理。
  4. 错误处理与限流:添加发送失败的异常捕获,以及发送间隔延迟,避免触发Discord API的限流机制。
  5. 资源清理:任务完成后主动关闭Bot和Telegram客户端,释放资源。

额外注意事项

  • 确保config.py中的所有配置项(API_ID、DISCORD_TOKEN等)填写正确。
  • Discord开发者后台需开启Message Content Intent权限,否则Bot无法读取和发送消息。
  • Telegram客户端首次运行会要求验证手机号,按照提示完成验证即可。

内容的提问来源于stack exchange,提问作者user20899166

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 12:17:31