ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Friend 仓库中的 Twitter/X Omi 插件实战:OAuth2 授权、Railway 部署与对话式推文管理

Friend 仓库中的 Twitter/X Omi 插件实战:OAuth2 授权、Railway 部署与对话式推文管理 Friend 仓库中的 Twitter/X Omi 插件实战OAuth2 授权、Railway 部署与对话式推文管理【免费下载链接】FriendAI that sees your screen, listens to your conversations and tells you what to do项目地址: https://gitcode.com/GitHub_Trending/fr/Friend本文围绕 Friend 开源仓库中的omi-twitter-chat-tools-app插件文档见 README.md完整讲解如何把 Twitter/X 账号接入 Omi 对话助手从创建 Twitter Developer App、通过 PKCE OAuth2 完成用户授权到在 Railway 上部署 FastAPI 服务、配置 Omi App 的三个关键 URL再到对话中发推、刷时间线、搜索、点赞、转发等十大 Chat Tools 的调用方式。读完本文你将掌握一套可直接复制上线的OAuth 授权 Chat Tools Manifest 对话式操作插件实现方案并理解其底层源码的运行原理。插件定位与功能总览omi-twitter-chat-tools-app是 plugins 目录下 28 个独立部署的omi-*-app插件服务之一。与依赖plugins/main.py单体入口的旧插件不同它拥有独立的main.py、依赖清单与部署描述文件Procfile / railway.toml可独立于单体和其他插件部署与扩容。该插件通过 Omi 对话完成以下 Twitter/X 账号管理能力发推Post Tweets向粉丝发布更新支持指定回复目标推文查看时间线View Timeline读取用户首页 feed查看我的推文Get Your Tweets查看最近发布记录查看提及Get Mentions查看谁提到了你搜索推文Search Tweets按关键词检索任何话题点赞 / 取消点赞Like / Unlike与内容互动转发Retweet把推文分享给粉丝删除推文Delete Tweets移除自己的推文查看资料View Profiles查询任意 Twitter 用户信息这些能力在源码中一一对应为 10 个 Chat Tool 端点全部声明在/.well-known/omi-tools.json清单中见下文Chat Tools Manifest小节。整体架构一条对话请求的完整链路从用户对话到推文落地的数据流如下用户在 Omi 对话中说发一条推文xxxOmi 客户端根据应用的Chat Tools Manifest URL拉取工具清单Omi 匹配到post_tweet工具向插件的/tools/post_tweet端点发起 POST 请求body 中携带uidOmi 用户 ID与参数text插件从存储中取出该用户的 Twitter OAuth2 token必要时自动刷新然后调用 Twitter API v2插件将 Twitter 返回结果格式化为可读文本通过ChatToolResponse模型返回给 Omi由对话助手展示给用户。整条链路的核心实现在 main.pyFastAPI 应用约 1300 行、db.pytoken 与状态存储、models.py响应模型三个文件中。第一步创建 Twitter Developer App1. 进入 Twitter Developer Portal在 Twitter Developer Portal 的 Projects Apps 页面新建 Project 与 App或复用现有应用然后进入User authentication settings配置App permissions应用权限选择Read and write。该权限组合与源码中申请的 OAuth scopes 对应——见 main.py 中TWITTER_SCOPESTWITTER_SCOPES [ tweet.read, tweet.write, users.read, follows.read, like.read, like.write, offline.access ]其中tweet.write支撑发推/回复/转发/删除like.write支撑点赞follows.read支撑时间线offline.access用于换取 refresh token支撑后续的 token 自动刷新。Type of App应用类型选择Web AppCallback URI / Redirect URI填写你的回调地址生产环境为 Railway 域名本地开发为http://localhost:8080/auth/twitter/callback详见下文Website URL填写应用官网地址完成后复制Client ID与Client SecretClient Secret 仅显示一次务必妥善保存。2. 可选Twitter API v2 访问层级说明该插件依赖Twitter API v2不同 Developer 账号层级的能力与配额不同以 Twitter 官方当前政策为准仓库 README 中给出的参考数值如下Free tier免费层每月约 1,500 条推文额度基础读权限Basic tier基础层每月约 3,000 条推文额度更多读权限Pro tier专业层更高额度与更多功能部分功能如查看时间线可能需要更高层级的访问权限。如果调用时报权限错误应先在 Developer Portal 确认账号层级与 App 权限配置。第二步部署到 RailwayRailway 是官方 README 推荐的部署方式仓库内已备齐部署所需的所有文件railway.toml声明 nixpacks 构建器、启动命令、健康检查与重启策略Procfile等价启动命令uvicorn main:app --host 0.0.0.0 --port $PORTrequirements.txt依赖清单部署步骤在 Railway 新建项目连接包含本插件目录的 GitHub 仓库或直接从plugins/omi-twitter-chat-tools-app/目录部署为项目添加一个Redis服务插件用它持久化 token 与 OAuth state设置如下环境变量TWITTER_CLIENT_IDyour_client_id TWITTER_CLIENT_SECRETyour_client_secret TWITTER_REDIRECT_URIhttps://your-app.up.railway.app/auth/twitter/callback触发部署。Railway 会自动完成从requirements.txt安装依赖、按 railway.toml 的startCommand启动服务并注入PORT、REDIS_URL环境变量。部署完成后回到 Twitter Developer App 的User authentication settings把回调地址更新为https://your-app.up.railway.app/auth/twitter/callback注意回调地址必须与TWITTER_REDIRECT_URI完全一致否则 OAuth 授权会失败。部署配置解读railway.toml 的关键配置[build] builder nixpacks [deploy] startCommand uvicorn main:app --host 0.0.0.0 --port $PORT healthcheckPath /health healthcheckTimeout 100 restartPolicyType on_failure restartPolicyMaxRetries 3healthcheckPath /health对应 main.py 中的健康检查端点返回{status: healthy, service: twitter-omi}startCommand读取 Railway 注入的$PORTmain.py 的入口同样支持PORT默认 8080与HOST默认0.0.0.0环境变量本地直接python main.py也能以相同方式启动。第三步Omi App 配置在 Omi 平台创建或更新该集成应用时将以下三个 URL 填入对应字段{{uid}}是 Omi 在跳转时自动替换的用户 ID 占位符字段值Setup URLhttps://your-app.up.railway.app/?uid{{uid}}Setup Completed URLhttps://your-app.up.railway.app/setup/twitter?uid{{uid}}Chat Tools Manifest URLhttps://your-app.up.railway.app/.well-known/omi-tools.json三个 URL 各自的作用Setup URLOmi 引导用户进入插件的设置页。带uid访问/时若该用户尚未连接 Twitter页面会渲染Connect Twitter按钮已连接则显示账号状态与Disconnect入口main.py。Setup Completed URLOmi 用来轮询/判定用户是否完成授权。对应/setup/twitter端点返回{is_setup_completed: true|false}——true表示该uid已存在有效 token。Chat Tools Manifest URLOmi 发现可用对话工具的关键。对应/.well-known/omi-tools.json端点返回完整的工具声明 JSON。API 端点总览Chat Tools 端点POST端点功能必需参数/tools/post_tweet发布新推文text≤280 字符可选reply_to/tools/get_timeline获取首页时间线可选max_results默认 10上限 100/tools/get_my_tweets获取自己的推文可选max_results/tools/get_mentions获取提及我的推文可选max_results/tools/search_tweets搜索推文query可选max_results/tools/like_tweet点赞推文tweet_id/tools/unlike_tweet取消点赞tweet_id/tools/retweet转发推文tweet_id/tools/delete_tweet删除推文tweet_id/tools/get_user_profile获取用户资料可选username缺省返回本人资料所有 Chat Tool 请求的 body 都需携带uid字段。若用户未授权端点统一返回错误提示Please connect your Twitter account first in the app settings.max_results在服务端通过min(body.get(max_results, 10), 100)钳制上限。OAuth 与设置端点GET端点功能/首页 / 设置 UI支持?uiduid/auth/twitter?uiduid发起 OAuth2 授权流程/auth/twitter/callbackOAuth 回调交换 code 为 token/setup/twitter?uiduid查询设置状态/disconnect?uiduid解绑账号删除 token/health健康检查/.well-known/omi-tools.jsonChat Tools 工具清单核心源码原理剖析1. PKCE OAuth2 授权流程插件采用OAuth2 Authorization Code PKCES256流程实现在 main.py 的/auth/twitter与回调端点中生成 128 位随机code_verifiergenerate_code_verifier并以其 SHA-256 摘要生成code_challengegenerate_code_challenge构造state f{uid}:{secrets.token_urlsafe(32)}把 state 写入存储CSRF 防护把code_verifier写入用户设置重定向到https://twitter.com/i/oauth2/authorize携带response_typecode、scope、state、code_challenge、code_challenge_methodS256回调端点校验state与存储值一致后用code_verifier到https://api.twitter.com/2/oauth2/token换 tokenmain.py换到 token 后调用/users/me获取 username 与用户 ID一并存入存储main.py。2. Token 自动刷新机制Twitter access token 约 2 小时过期expires_in默认按 7200 秒处理。插件在每次请求前通过 get_valid_access_token 检查过期时间若expires_at距当前不足5 分钟则调用 refresh_access_token 用 refresh token 换取新 token并回写存储。这一机制让用户授权一次即可长期使用无需反复重新授权。3. 统一 API 请求封装twitter_api_request 是所有 Twitter API 调用的统一入口注入Authorization: Bearer token请求头按 GET / POST / DELETE 分发请求204 No Content视为成功点赞取消、删除等操作其他非 2xx 状态码会把响应文本原样返回供上层生成错误信息。4. 推文展示格式化format_tweet 把 Twitter 返回的推文对象格式化为对话友好文本作者username (显示名)、正文、时间戳%b %d, %Y %I:%M %p格式、互动数据Likes / Retweets / Replies与推文 ID。时间线、提及、搜索结果均复用该函数。5. 双模式存储Redis 与文件回退db.py 提供 Redis 优先、JSON 文件回退的双模式存储Redis 模式从REDIS_URL兼容REDIS_PRIVATE_URL/REDIS_PUBLIC_URL建立连接token 以twitter:tokens:{uid}为 key 存储TTL 90 天OAuth state 以twitter:oauth_state:{uid}存储TTL 10 分钟用户设置以twitter:settings:{uid}存储db.py文件模式本地未配置 Redis 时自动回退到data/tokens.json、data/oauth_states.json、data/user_settings.json三个 JSON 文件db.py。这解释了 README 中REDIS_URL标注可选未设置时使用文件存储的原因——本地开发无需 Redis 即可运行。6. 响应模型所有 Chat Tool 端点统一返回 ChatToolResponse 模型成功时填充resultMarkdown 文本失败时填充error人类可读的错误说明Omi 对话层据此呈现结果或提示。环境变量总览变量说明必填TWITTER_CLIENT_IDTwitter OAuth2 Client ID是TWITTER_CLIENT_SECRETTwitter OAuth2 Client Secret是TWITTER_REDIRECT_URIOAuth 回调 URL是PORT服务端口默认 8080否REDIS_URLRedis 连接 URL未设置时回退文件存储否补充说明TWITTER_REDIRECT_URI在源码中的默认值是http://localhost:8080/auth/twitter/callbackmain.py因此未配置时本地开发开箱即用HOST环境变量可控制监听地址默认0.0.0.0。此外Twitter 端配置的回调地址必须与此变量一致。本地开发复制环境变量模板为.env并填入凭据模板见.env.example其中包含TWITTER_CLIENT_ID、TWITTER_CLIENT_SECRET等键设置TWITTER_REDIRECT_URIhttp://localhost:8080/auth/twitter/callback将该回调地址加入 Twitter App 的 Callback URIs 列表安装依赖pip install -r requirements.txt依赖版本见 requirements.txt含 fastapi、uvicorn、python-dotenv、requests、pydantic、redis启动服务python main.py内部以uvicorn main:app --host 0.0.0.0 --port 8080 --reload运行。本地环境未配置 Redis 时会自动使用文件存储适合快速联调 OAuth 流程与 Chat Tools 端点。对话使用示例以下自然语言指令可直接在 Omi 对话中触发对应工具Tweet: Just discovered this amazing AI assistant! →post_tweetShow my Twitter timeline →get_timelineSearch Twitter for AI news →search_tweetsLike the last tweet →like_tweetWho mentioned me on Twitter? →get_mentionsShow elonmusks profile →get_user_profileDelete my last tweet →delete_tweet这些示例与插件首页/带uid时渲染的示例命令一致main.py可作为设置页面向用户展示的引导文案。限流与错误处理Twitter API 存在严格的速率限制官方 README 给出的参考值如下每 24 小时发推数随账号类型变化读操作每 15 分钟 300–900 次请求搜索每 15 分钟 180 次请求插件对限流与错误做了如下处理可从源码确认twitter_api_request 对非 2xx 响应返回{error: 响应体, status_code: 状态码}由各工具端点包装为ChatToolResponse(error...)返回给用户token 过期或缺失时给出明确的引导性错误如请先在应用设置中连接 Twitter 账号发推长度超限在服务端即被拦截main.py返回 280 字符上限提示避免白白消耗 API 配额。故障排查速查现象排查方向授权页报 500 / credentials not configuredTWITTER_CLIENT_ID未设置检查环境变量main.py回调报 State mismatchOAuth state 过期10 分钟 TTL或 uid 不一致重新发起授权回调报 Token exchange failed回调地址与 Twitter App 配置不一致或 Client Secret 错误工具调用报 Please connect your Twitter account first用户未完成授权或 token 已删除工具调用偶发失败后自动恢复大概率是 token 刷新或限流触顶查看服务日志中的Twitter API error/Token expired ... refreshing输出本文所涉及的全部源码均位于 plugins/omi-twitter-chat-tools-app/ 目录读者可按需深入阅读 main.py、db.py、models.py、railway.toml 与 Procfile将该插件的部署与开发模式复用到其他社交平台集成场景。【免费下载链接】FriendAI that sees your screen, listens to your conversations and tells you what to do项目地址: https://gitcode.com/GitHub_Trending/fr/Friend创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表