如何从Python脚本调用Discord机器人函数?Telegram转Discord遇阻
问题分析与解决方案
你的代码核心问题有三个:
- Discord Bot阻塞主程序:
discord_signal.py中的bot.run()是阻塞调用,导入该模块时会直接启动Bot并卡住,主脚本的main()函数根本无法执行。 - 异步函数调用错误:主脚本中直接同步调用异步函数
send_message,不会触发实际的消息发送逻辑。 - 同步/异步环境冲突: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())
关键修改说明
- 统一异步环境:Telethon改用异步API(所有调用添加
await),和discord.py的异步框架兼容,避免同步/异步冲突。 - 移除阻塞调用:替换
bot.run()为bot.start(),并在on_ready事件中执行核心逻辑,避免导入模块时阻塞主程序。 - 优化链接提取:新增正则匹配逻辑,可提取消息内的所有链接(不仅限于纯链接消息),同时添加去重处理。
- 错误处理与限流:添加发送失败的异常捕获,以及发送间隔延迟,避免触发Discord API的限流机制。
- 资源清理:任务完成后主动关闭Bot和Telegram客户端,释放资源。
额外注意事项
- 确保
config.py中的所有配置项(API_ID、DISCORD_TOKEN等)填写正确。 - Discord开发者后台需开启
Message Content Intent权限,否则Bot无法读取和发送消息。 - Telegram客户端首次运行会要求验证手机号,按照提示完成验证即可。
内容的提问来源于stack exchange,提问作者user20899166
相关产品推荐
相关产品推荐

