能否用JavaScript获取他人公开Twitter推文以搭建Telegram Bot?
实现思路与解决方案
首先得明确:Twitter(现称X)的API政策确实做了调整,未经认证(没有API密钥、Bearer Token)是没法合法获取公开推文信息流的。免费版API虽然额度有限,但依然是最稳定合规的途径。下面给你梳理几种用JavaScript实现的可行方案:
一、使用官方X API(推荐)
你需要先申请一个X开发者账号(免费即可注册),获取到Bearer Token,之后就能调用API获取指定用户的推文了。具体步骤和代码示例如下:
- 注册X开发者账号,创建项目并拿到
Bearer Token; - 通过用户名获取目标用户的ID(推文接口需要用户ID而非用户名);
- 获取该用户的最新推文,筛选含特定字符串的内容;
- 调用Telegram Bot API发送筛选后的推文。
// 替换为你的实际配置信息 const BEARER_TOKEN = 'your_bearer_token_here'; const TARGET_USERNAME = 'target_username'; const TELEGRAM_BOT_TOKEN = 'your_telegram_bot_token'; const TELEGRAM_CHAT_ID = 'your_chat_id'; const KEYWORD = '特定字符串'; async function getUserId(username) { const response = await fetch(`https://api.twitter.com/2/users/by/username/${username}`, { headers: { 'Authorization': `Bearer ${BEARER_TOKEN}` } }); const data = await response.json(); return data.data.id; } async function getLatestTweets(userId) { const response = await fetch(`https://api.twitter.com/2/users/${userId}/tweets?tweet.fields=created_at&max_results=10`, { headers: { 'Authorization': `Bearer ${BEARER_TOKEN}` } }); const data = await response.json(); return data.data; } async function sendToTelegram(message) { await fetch(`https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ chat_id: TELEGRAM_CHAT_ID, text: message }) }); } // 主逻辑:定时检查并推送 async function runBot() { try { const userId = await getUserId(TARGET_USERNAME); const tweets = await getLatestTweets(userId); // 筛选含特定字符串的推文 const filteredTweets = tweets.filter(tweet => tweet.text.includes(KEYWORD)); for (const tweet of filteredTweets) { const message = `新推文:\n${tweet.text}\n发布时间:${tweet.created_at}`; await sendToTelegram(message); await new Promise(resolve => setTimeout(resolve, 1000)); // 避免请求过于频繁 } } catch (error) { console.error('运行出错:', error); } } // 每5分钟检查一次 setInterval(runBot, 5 * 60 * 1000);
免费版API的调用额度足够小流量Bot使用,比如/2/users/:id/tweets端点每15分钟最多可调用900次。
二、第三方镜像服务(非官方,风险较高)
如果不想申请开发者账号,可以尝试第三方X镜像服务(比如Nitter),部分实例提供JSON接口或可解析HTML获取推文内容。但要注意:
- 这类服务没有官方保障,随时可能被X封禁或停止服务;
- 需遵守镜像服务的使用规则,避免频繁请求给对方服务器造成压力。
示例(假设某Nitter实例支持JSON接口):
async function getTweetsFromNitter(username) { const response = await fetch(`https://nitter.example.com/${username}/json`); const tweets = await response.json(); return tweets; } // 后续筛选和发送逻辑与官方API方案类似
这种方法稳定性差,不建议用于长期运行的Bot。
三、额外注意事项
- 无论采用哪种方式,都要遵守X的服务条款,避免大规模爬取或滥用API;
- Telegram Bot开发推荐使用
node-telegram-bot-apinpm包,能简化消息发送、更新监听等逻辑; - 建议存储上次获取的最新推文ID,避免重复发送相同内容,提升效率。
内容的提问来源于stack exchange,提问作者user234562
相关产品推荐
相关产品推荐

