如何在Flask-SocketIO应用中为Tweepy流添加过滤器并更新客户端?
完整实现:Flask-SocketIO实时推送Tweepy流推文给所有客户端
我来帮你完善这个Flask-SocketIO + Tweepy的实时推文应用,下面是完整的可运行代码,同时解决接收新推文时更新所有客户端和为Tweepy流添加过滤器这两个核心需求:
第一步:安装依赖包
首先确保你安装了所需的库:
pip install flask-socketio tweepy eventlet
eventlet是Flask-SocketIO推荐的异步服务器,能更好地处理实时连接。
第二步:完整后端代码
from flask import Flask, render_template from flask_socketio import SocketIO, emit from tweepy.streaming import StreamListener from tweepy import OAuthHandler, Stream import json # 替换为你自己的Twitter API密钥 access_token = "你的access_token" access_token_secret = "你的access_token_secret" consumer_key = "你的consumer_key" consumer_secret = "你的consumer_secret" # 初始化Flask和SocketIO应用 app = Flask(__name__) app.config['SECRET_KEY'] = 'secret!' # 使用eventlet作为异步模式,保障实时性能 socketio = SocketIO(app, async_mode='eventlet') # 推文计数器(可选,用于统计接收的推文数量) tweet_count = 0 class MyListener(StreamListener): def on_data(self, raw_data): global tweet_count try: # 解析JSON格式的推文数据 tweet_data = json.loads(raw_data) # 提取推文核心信息(根据需求调整,比如文本、作者、时间等) tweet_info = { 'text': tweet_data['text'], 'user': tweet_data['user']['screen_name'], 'created_at': tweet_data['created_at'] } # 向所有已连接的客户端推送新推文事件 socketio.emit('new_tweet', tweet_info, broadcast=True) tweet_count += 1 print(f"已推送 {tweet_count} 条推文") return True except Exception as e: print(f"解析推文出错: {str(e)}") return True def on_error(self, status_code): # 处理Twitter API错误,比如420是速率限制,需要暂时停止流 print(f"API错误状态码: {status_code}") if status_code == 420: return False # 返回False会断开流连接 @app.route('/') def index(): # 渲染客户端页面,用于展示实时推文 return render_template('index.html') @socketio.on('connect') def handle_connect(): # 客户端连接成功时触发,可选做日志或确认 print("新客户端已连接") emit('welcome', {'message': '已连接到推文流服务器!'}) if __name__ == '__main__': # 初始化Tweepy认证 auth = OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) # 创建推文流并应用过滤器 twitter_stream = Stream(auth, MyListener()) # 这里设置过滤器:track是跟踪的关键词列表,也可以用follow指定用户ID # 示例:跟踪"python"和"flask"关键词 twitter_stream.filter(track=['python', 'flask'], is_async=True) # 启动SocketIO服务器,debug模式方便开发 socketio.run(app, debug=True)
第三步:客户端HTML模板(templates/index.html)
创建templates文件夹,里面新建index.html,用于展示实时推送的推文:
<!DOCTYPE html> <html> <head> <title>实时推文流</title> <style> .tweet { border: 1px solid #eee; padding: 10px; margin: 10px 0; border-radius: 5px; } .user { font-weight: bold; color: #1da1f2; } .time { font-size: 12px; color: #666; } </style> </head> <body> <h1>实时推文更新</h1> <div id="tweets-container"></div> <!-- 引入SocketIO客户端JS(Flask-SocketIO自动提供) --> <script src="//cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js"></script> <script type="text/javascript"> // 连接到SocketIO服务器 var socket = io(); // 接收欢迎消息 socket.on('welcome', function(data) { alert(data.message); }); // 监听新推文事件,更新页面 socket.on('new_tweet', function(tweet) { var tweetDiv = document.createElement('div'); tweetDiv.className = 'tweet'; tweetDiv.innerHTML = ` <span class="user">@${tweet.user}</span> <span class="time">${tweet.created_at}</span> <p>${tweet.text}</p> `; document.getElementById('tweets-container').prepend(tweetDiv); }); </script> </body> </html>
关键功能说明
- 实时推送客户端:在
MyListener.on_data中,通过socketio.emit('new_tweet', tweet_info, broadcast=True)实现广播,所有已连接的客户端都会收到新推文。 - Tweepy流过滤器:通过
twitter_stream.filter()设置规则,支持两种常用过滤方式:track=['关键词1', '关键词2']:跟踪包含指定关键词的推文follow=['用户ID1', '用户ID2']:跟踪指定用户发布的推文
注意is_async=True参数会让推文流在后台运行,不阻塞Flask-SocketIO服务器。
- 错误处理:
on_error方法处理API错误,比如遇到420速率限制时断开流,避免被Twitter暂时封禁。
内容的提问来源于stack exchange,提问作者Surjya Narayana Padhi
相关产品推荐
相关产品推荐

