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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:26:17