如何用discord.py实现Twitter链接转VXTwitter并替换消息
问题
需要实现一个Discord机器人,功能如下:
- 捕获用户发送的Twitter链接
- 将链接修改为VXTwitter格式(在
twitter前添加vx,即https://twitter.com/xxx改为https://vxtwitter.com/xxx) - 删除用户发送的原消息
现有代码仅能匹配固定的https://twitter.com字符串,无法处理带路径的完整链接,且不清楚ctx的使用场景,寻求解决方法。现有代码:
@bot.event async def on_message(message): if message.content == 'https://twitter.com': messages=await message.channel.send("https://vxtwitter.com") await asyncio.sleep(INT) await messages.edit(content="https://vxtwitter.com")
解决方案
核心说明
- 匹配Twitter链接:放弃精确匹配固定字符串,改用正则表达式匹配所有符合格式的Twitter链接,覆盖带路径、参数的完整链接,避免误判。
- 跳过机器人自身消息:防止机器人处理自己发送的消息陷入循环。
- 关于
ctx:ctx是Discord.py中@bot.command()装饰器的上下文对象,用于命令交互场景;而on_message是消息监听事件,使用message参数即可,不需要ctx。
完整代码示例
import re import discord from discord.ext import commands bot = commands.Bot(command_prefix="!", intents=discord.Intents.all()) @bot.event async def on_message(message): # 跳过机器人自身发送的消息 if message.author.bot: return # 正则匹配所有http/https开头的Twitter链接 twitter_pattern = re.compile(r'https?://twitter\.com/(\S+)') matches = twitter_pattern.findall(message.content) if matches: # 将所有匹配到的twitter链接替换为vxtwitter格式 new_content = re.sub(r'https?://twitter\.com', 'https://vxtwitter.com', message.content) # 发送修改后的内容 await message.channel.send(new_content) # 删除用户原消息(需机器人拥有"管理消息"权限) await message.delete() # 必须保留该行,否则机器人的命令功能会失效 await bot.process_commands(message) bot.run("你的机器人Token")
注意事项
- 需在Discord开发者后台的Bot设置中开启
message_content意图,否则机器人无法读取消息内容。 - 机器人需要配置管理消息权限,才能执行删除原消息的操作。
- 正则表达式会自动匹配所有包含
twitter.com的有效链接,比如https://twitter.com/user/status/123456会被正确替换为https://vxtwitter.com/user/status/123456。
内容的提问来源于stack exchange,提问作者Ohan
相关产品推荐
相关产品推荐

