为什么要将 Twitter 提醒路由到 Discord?
Discord 是加密团队的主要协作场所。交易室、Alpha 频道和执行看板都运行在 Discord 上。当影响者发布合约地址,或巨鲸转移代币时,提醒需要进入团队执行操作的同一工作区,而不是另一个应用或电子邮件收件箱。
通过 Webhook 将 Twitter/X 提醒路由到 Discord,你可以在团队已关注的频道中即时收到富格式通知。无需切换场景,也不会错过信号。
什么是 Discord Webhook?
Discord Webhook 是一个接收 HTTP POST 请求并将消息发布到指定频道的 URL。你不需要机器人账号、OAuth 令牌或网关连接;只需向该 URL 发送 JSON,消息就会出现在频道中。
Webhook URL 格式:https://discord.com/api/webhooks/WEBHOOK_ID/WEBHOOK_TOKEN
Discord Webhook 支持纯文本消息、富 Embed(包含标题、颜色、字段、图片和页脚)、文件附件,以及每条消息最多 10 个 Embed。
第 1 步:创建 Discord Webhook
- 打开你的 Discord 服务器并进入要接收提醒的频道
- 点击频道名称旁的齿轮图标(编辑频道)
- 进入集成 → Webhook → 新建 Webhook
- 为 Webhook 命名(例如“Twitter 提醒”),并可选择设置头像
- 点击“复制 Webhook URL”,并妥善保存该 URL
- 点击保存
请将 Webhook URL 保密。任何获得该 URL 的人都可以向你的频道发布消息。
第 2 步:了解 Payload 格式
Discord Webhook 接收包含两个主要字段的 JSON Payload:content 用于纯文本,embeds 用于富格式消息。对于交易提醒,建议使用 embeds,因为它支持结构化数据、颜色编码和行内字段。
第 3 步:使用 Node.js 发送提醒
const WEBHOOK_URL = 'https://discord.com/api/webhooks/YOUR_ID/YOUR_TOKEN';
function normalizeHandle(handle) {
return String(handle ?? '').replace(/^@/, '');
}
async function sendTweetAlert(tweet) {
const handle = normalizeHandle(tweet.author.handle);
const embed = {
title: `@${handle}`,
description: tweet.text,
color: 3447003, // Blue
url: tweet.link ?? `https://x.com/${handle}/status/${tweet.tweetId}`,
fields: [],
footer: { text: 'TweetStream Alert' },
timestamp: new Date().toISOString(),
};
// Add detected tokens as fields
if (tweet.tokens?.length) {
for (const token of tweet.tokens) {
embed.fields.push({
name: token.symbol,
value: `$${token.price} | ${token.chain}`,
inline: true,
});
}
}
const response = await fetch(WEBHOOK_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ embeds: [embed] }),
});
if (response.status === 429) {
const retryAfter = response.headers.get('Retry-After');
console.log(`Rate limited. Retry after ${retryAfter}s`);
}
}第 4 步:使用 Python 发送提醒
import requests
import time
WEBHOOK_URL = "https://discord.com/api/webhooks/YOUR_ID/YOUR_TOKEN"
def normalize_handle(handle: object) -> str:
return str(handle or "").removeprefix("@")
def send_tweet_alert(tweet: dict) -> None:
handle = normalize_handle(tweet.get("author", {}).get("handle"))
embed = {
"title": f"@{handle}",
"description": tweet["text"],
"color": 3447003, # Blue
"url": tweet.get("link") or f"https://x.com/{handle}/status/{tweet['tweetId']}",
"fields": [],
"footer": {"text": "TweetStream Alert"},
}
# Add detected tokens
for token in tweet.get("tokens", []):
embed["fields"].append({
"name": token["symbol"],
"value": f"${token['price']} | {token['chain']}",
"inline": True,
})
payload = {"embeds": [embed]}
resp = requests.post(WEBHOOK_URL, json=payload)
if resp.status_code == 429:
retry_after = resp.json().get("retry_after", 1)
time.sleep(retry_after)
requests.post(WEBHOOK_URL, json=payload)交易提醒的富 Embed 格式
Discord Embed 支持丰富的格式设置。以下是交易提醒的关键字段:
- title — 提醒标题(例如账号名或代币符号)
- description — 推文文本或提醒正文
- color — 十进制颜色值(绿色:3066993,红色:15158332,蓝色:3447003)
- fields — 结构化数据的名称/值对(代币、价格、链)
- footer — 时间戳或来源归属
- thumbnail — 小图(例如代币 Logo 或用户头像)
- url — 返回原始推文的链接
Discord Webhook 速率限制
Discord 会对 Webhook 执行速率限制;发送过快时会返回 HTTP 429 和 Retry-After 值。具体限制可能因路由和场景而异,因此应依据响应标头构建处理逻辑,而不是硬编码一个通用数值。
对于高流量提醒频道,请采用以下策略:
- 将消息加入队列并批量发送,而不是逐条立即发送
- 为不同提醒类型在不同频道中使用多个 Webhook
- 收到 429 响应时遵循 Retry-After
- 使用多个 Embed 将多条提醒合并到一条消息中(每条消息最多 10 个)
- 将响应标头作为重试时机的事实来源
常见问题排查
- Webhook 返回 401 Unauthorized — Webhook URL 已被删除或重新生成。请创建新的 Webhook。
- 消息未出现 — 检查 Webhook 是否分配给正确频道,以及机器人是否具有发送消息权限。
- Embed 未渲染 — 检查 JSON 结构。即使只有一个 Embed,embeds 字段也必须是数组;color 必须是十进制数字,不能是十六进制值。
- 触发速率限制(429)— 降低请求速率,将消息加入队列并实现退避。
- 内容过长 — Embed 描述上限为 4,096 个字符,所有 Embed 的内容总计不得超过 6,000 个字符。
更简单的方式:TweetStream Discord 投递
如果你不想自行构建和维护 Webhook 管线,TweetStream 可以零代码将提醒直接投递到 Discord。在控制台配置账号和 Webhook 后,TweetStream 会处理过滤、富化(OCR、代币检测、实时价格)、格式化与投递。配置详情请参阅 Discord 加密提醒 页面。
用 TweetStream 更快上线
这篇文章讲的是这类工作流,但真正上线时不应该重新搭建推文接入、重连、代币检测、OCR 和下游投递。TweetStream 是更好的生产起点:帖子、更新、删除、置顶、资料变化、关注、取消关注,富化 JSON 载荷,支持套餐的历史回放,以及可以直接用自己账号验证的 3 天试用。
开始 3 天试用常见问题
TweetStream 团队
最近更新:2026 年 6 月