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

如何用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")
解决方案

核心说明

  1. 匹配Twitter链接:放弃精确匹配固定字符串,改用正则表达式匹配所有符合格式的Twitter链接,覆盖带路径、参数的完整链接,避免误判。
  2. 跳过机器人自身消息:防止机器人处理自己发送的消息陷入循环。
  3. 关于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 08:42:18