xurl — A curl-like CLI tool for the X API
xurl —— 面向 X(原 Twitter)API 的 curl 风格命令行工具
本文欲回答的核心问题(Core question this article answers):
What is xurl, what can it do, and how do I use it end-to-end to authenticate, call endpoints, stream data, receive webhooks and upload media with the X API?
本文要回答的核心问题:什么是 xurl,它能做什么,以及如何完成从认证、请求、流式数据、临时 webhook 到媒体上传的全流程操作?
简短答案:xurl 是一个面向 X API 的命令行工具,类似
curl
,支持 OAuth 1.0a、OAuth 2.0(含 PKCE)、多账号管理、持久化 token、HTTP 请求自定义、流式响应自动处理、临时 webhook 与分块媒体上传等功能。本文基于提供的 README 文件,按步骤、场景与示例详尽展开,便于技术读者直接上手。
简短导航(Quick navigation / 快速导航)
-
功能概览(Features) -
安装(Installation) -
认证与凭据(Authentication) -
认证管理(Authentication management) -
发起请求(Making requests) -
流式响应(Streaming responses) -
临时 Webhook 配置(Temporary webhook setup) -
媒体上传(Media upload) -
令牌存储与安全(Token storage) -
常见使用场景与示例工作流(Scenarios & worked examples) -
操作清单与一页速览(Actionable checklist & One-page summary) -
结论、反思与 FAQ(Conclusion, reflections & FAQ)
特性概览(Features / 功能概览)
本段欲回答的核心问题:xurl 包含哪些关键功能?
简短回答:xurl 提供 OAuth 2.0 PKCE、OAuth 1.0a、多个 OAuth2 账户、持久 token 存储、可自定义 HTTP 请求、自动流式响应识别、临时 webhook 与分块媒体上传等关键能力。
简要摘要:本小节列出工具功能并为每项功能给出场景化说明,帮助你判断何时使用。
主要功能(Key features)
-
OAuth 2.0 PKCE flow authentication / OAuth 2.0 PKCE 流认证 -
OAuth 1.0a authentication / OAuth 1.0a 认证 -
Multiple OAuth 2.0 account support / 支持多个 OAuth2 账户 -
Persistent token storage / 持久化令牌存储(位于 ~/.xurl
) -
HTTP request customization(headers, methods, body)/ 自定义 HTTP 请求(头、方法、请求体) -
Streaming response auto-detection / 流式响应自动识别并处理 -
Temporary webhook helpers (with ngrok) / 临时 webhook 支持(可配合 ngrok) -
Chunked media upload support / 分块媒体上传支持
场景化说明(How these features are used)
-
多账号场景:当你需要在一台机器上以不同个人或测试账号进行请求时,xurl 的多 OAuth2 账户支持让切换变得可控(例如在调试不同用户权限时)。 -
流式数据:当目标是 /2/tweets/search/stream
等流式端点时,xurl 会自动进入流模式,便于实时消费事件。 -
临时 webhook:在本地开发时通过 xurl webhook start
与 ngrok 快速生成公开 URL 并注册到 X API,便于在开发环境接收事件。 -
媒体上传工作流:上传大文件(视频、音频)时使用分块上传 INIT→APPEND→FINALIZE→STATUS 的标准流程,确保兼容性与可控的处理进度检查。
安装(Installation / 安装)
本段欲回答的核心问题:如何安装 xurl?
简短回答:通过 README 提供的一行安装脚本即可安装:curl -fsSL https://raw.githubusercontent.com/xdevplatform/xurl/main/install.sh | sudo bash
。
摘要:本节提供精确安装命令、安装后验证建议和常见安装场景。
安装命令(Install command)
curl -fsSL https://raw.githubusercontent.com/xdevplatform/xurl/main/install.sh | sudo bash
安装后建议(Post-install checklist)
-
运行安装命令后,建议先确认可执行文件已被放置到系统 PATH 中(通常安装脚本会完成此步)。 -
验证基本功能:可以先运行 xurl auth status
来查看当前认证状态(见后文认证管理)。
(注意:README 中列出的命令是本工具对接 X API 的标准入口。请严格按环境要求配置变量与回调地址,详见下文。)
认证(Authentication / 认证)
本段欲回答的核心问题:如何与 X API 完成认证并获得可用令牌?
简短回答:xurl 支持三种主要认证方式:应用级 Bearer Token、OAuth 2.0 用户上下文(含 PKCE)和 OAuth 1.0a,按照 README 提供的命令与回调设置逐步完成。
摘要:本节按三类认证方式给出命令、环境变量设置、回调配置与使用场景。
先决条件(Prerequisites / 前提)
-
你必须拥有 X 的开发者账号和已创建的应用(developer account & app)。 -
对于 OAuth 2.0 用户上下文,必须在 X API 开发者门户设置回调(redirect URI)。
应用认证(App authentication / 应用认证)
核心回答:要用应用凭据做请求,使用 xurl auth app --bearer-token BEARER_TOKEN
。
命令示例:
xurl auth app --bearer-token BEARER_TOKEN
场景:当你只需要以应用身份访问部分端点(如部分只需 app bearer token 的管理接口)时使用此模式。
OAuth 2.0 用户上下文(OAuth 2.0 User-Context)
核心回答:为 OAuth 2.0,先在开发者门户把 Redirect URI 设置为 http://localhost:8080/callback
,再在本地设置 CLIENT_ID 与 CLIENT_SECRET,然后运行 xurl auth oauth2
开始认证流程。
步骤(从 README 中直接提取并细化):
-
在 X API 开发者门户创建应用。
-
在 authentication 设置中把 redirect URI 设置为:
http://localhost:8080/callback
图片来源:项目资源(assets) -
在本地导出客户端信息到环境变量:
export CLIENT_ID=your_client_id
export CLIENT_SECRET=your_client_secret
-
启动 OAuth2 流程:
xurl auth oauth2
场景:需要代表最终用户发起请求(例如发表推文、读取私有用户数据)时,使用 OAuth2 用户上下文。
作者提示(Reflection):把回调地址统一设为
http://localhost:8080/callback
有助于本地开发时使用内置本地服务器进行回调接收,结合 CLI 可以实现快速的本地认证体验。
OAuth 1.0a(OAuth 1.0a authentication / OAuth 1.0a)
核心回答:如果使用 OAuth 1.0a,直接在命令里提供 consumer key/secret 与 access token/token secret。
命令示例:
xurl auth oauth1 --consumer-key KEY --consumer-secret SECRET --access-token TOKEN --token-secret SECRET
场景:遗留系统或某些集成仍用 OAuth 1.0a,xurl 提供直接支持以便向后兼容。
认证管理(Authentication management / 认证管理)
本段欲回答的核心问题:如何查看、清理或管理 xurl 中保存的认证信息?
简短回答:使用 xurl auth status
查看状态,使用 xurl auth clear
(带不同 flag)按需清理:--all
、--oauth1
、--oauth2-username USERNAME
、--bearer
。
摘要:本节列出管理命令并说明何时使用。
查看当前认证(View authentication status)
xurl auth status
用途:确认当前活跃的认证方式及账户。
清理认证(Clear authentication)
-
清理所有 token:
xurl auth clear --all
-
清理 OAuth 1.0a token:
xurl auth clear --oauth1
-
清理特定 OAuth2 用户 token:
xurl auth clear --oauth2-username USERNAME
-
清理应用 bearer token:
xurl auth clear --bearer
发起请求(Making requests / 发起请求)
本段欲回答的核心问题:如何用 xurl 向 X API 发起 GET/POST 请求、添加头信息和选择认证方式?
简短回答:直接把路径或端点放在命令后,使用 -X
指定方法,-d
指定 JSON body,-H
添加 headers,--auth
指定认证模式,--username
指定 OAuth2 账户。
摘要:本节按典型操作给出最常用命令示例并解释参数含义。
常用命令示例(Examples)
-
简单 GET(获取当前认证用户信息):
xurl /2/users/me
-
使用 POST 发表推文(示例请求体):
xurl -X POST /2/tweets -d '{"text":"Hello world!"}'
-
添加自定义 header:
xurl -H "Content-Type: application/json" /2/tweets
-
指定认证类型:
xurl --auth oauth2 /2/users/me
xurl --auth oauth1 /2/tweets
xurl --auth app /2/users/me
-
使用特定 OAuth2 账户(多账号场景):
xurl --username johndoe /2/users/me
场景示例:以用户身份发推并附加自定义 Header
步骤速览:确保已用 OAuth2 完成用户认证 → 将请求体作为 JSON 传入 → 指定 Content-Type
header → 使用 --auth oauth2
或 --username
(如需要)
命令:
xurl --auth oauth2 -H "Content-Type: application/json" -X POST /2/tweets -d '{"text":"This is a test from xurl"}'
流式响应(Streaming responses / 流式响应)
本段欲回答的核心问题:xurl 如何处理需要持久连接的流式端点?
简短回答:xurl 对已知的流式端点(在 README 列出的路径)会自动识别并进入流模式;也可通过 --stream
或 -s
强制流式行为。
摘要:本节列出被自动识别的流式端点、如何强制流式,以及场景化用途。
自动识别的流式端点(Endpoints auto-detected as streams)
-
/2/tweets/search/stream
-
/2/tweets/sample/stream
-
/2/tweets/sample10/stream
-
/2/tweets/firehose/strea/lang/en
-
/2/tweets/firehose/stream/lang/ja
-
/2/tweets/firehose/stream/lang/ko
-
/2/tweets/firehose/stream/lang/pt
强制流式(Force streaming)
xurl -s /2/users/me
用途:如果你想把任意端点以流式方式消费,-s/--stream
可以强制切换。
场景:实时监听搜索流
核心回答:要对搜索流进行实时监听,只需调用相应的流式端点,xurl 会自动处理连接并把流写入终端或文件。
示例命令(按 README 列出的端点):
xurl /2/tweets/search/stream
作者反思:自动识别流式端点是一项显著便捷性设计,能让开发者关注数据消费逻辑而不是连接细节。
临时 Webhook 配置(Temporary Webhook Setup / 临时 Webhook 设置)
本段欲回答的核心问题:如何在本地快速搭建一个能被 X API 回调的临时 webhook?
简短回答:使用 xurl webhook start
启动本地服务器并由 ngrok 生成公网 URL,将该 URL 注册到 X API(用 app 认证)即可接收事件;可通过 -p
指定端口、-o
指定日志文件。
摘要:本节提供逐步操作与命令示例,并说明为何这对开发与调试有帮助。
步骤(Step-by-step)
-
启动本地 webhook 服务器(并使用 ngrok 获取公网 URL):
xurl webhook start
# 或者指定端口与输出文件:
xurl webhook start -p 8081 -o webhook_events.log
运行时会提示你输入 ngrok authtoken(如果未事先通过 NGROK_AUTHTOKEN
环境变量配置的话)。命令执行后会输出一个 ngrok URL,如 https://your-unique-id.ngrok-free.app/webhook
(示例格式,实际以命令输出为准)。
-
用得到的 ngrok URL 注册 webhook(通常使用应用级认证):
xurl --auth app /2/webhooks -d '{"url": "<your ngrok url>"}' -X POST
-
之后本地服务器会处理 CRC handshake 并记录收到的 POST 事件(如果使用 -o
会写入指定文件)。
场景与用途
-
本地开发者需要测试事件回调、验证处理逻辑或调试 webhook 消息结构时,此流程非常实用。 -
使用 xurl webhook start
可缩短从修改代码到观测真实回调的反馈环节。
作者反思:把 ngrok 集成到 CLI 的 webhook 子命令简化了本地开发循环,这是一种务实且提高效率的设计。
媒体上传(Media Upload / 媒体上传)
本段欲回答的核心问题:如何使用 xurl 上传媒体(图片/视频等)到 X API?
简短回答:xurl 支持通过 xurl media upload path/to/file
的简化命令或通过分块(chunked)上传按 INIT → APPEND → FINALIZE → STATUS 的步骤来完成大文件上传;支持自定义 media type 与 category。
摘要:本节给出简化命令示例和分块上传完整步骤,便于在不同场景选择合适路径。
简化上传(Simplified media upload)
xurl media upload path/to/file.mp4
或设置自定义 media-type 与 category:
xurl media upload --media-type image/jpeg --category tweet_image path/to/image.jpg
检查媒体上传状态:
xurl media status MEDIA_ID
等待媒体处理完成(block until processed):
xurl media status --wait MEDIA_ID
分块上传(Direct chunked upload / 分块上传)
分块上传常见于大文件(如视频)的上传流程。README 给出的完整步骤如下。
-
初始化(INIT) — 告诉 API 你将上传的文件大小、类型与类别:
xurl -X POST '/2/media/upload?command=INIT&total_bytes=FILE_SIZE&media_type=video/mp4&media_catefory=tweet_video'
注意:命令中的参数
FILE_SIZE
、media_type
与media_catefory
(README 原文拼写为media_catefory
)应按实际情况填写。
-
追加分片(APPEND) — 将分片上传到服务器(示例第 0 片):
xurl -X POST -F path/to/file.mp4 '/2/media/upload?command=APPEND&media_id=MEDIA_ID&segment_index=0'
-
完成(FINALIZE) — 通知 API 上传已完成并进行后续处理:
xurl -X POST '/2/media/upload?command=FINALIZE&media_id=MEDIA_ID'
-
查询状态(STATUS) — 检查处理进度或最终状态:
xurl '/2/media/upload?command=STATUS&media_id=MEDIA_ID'
场景组合示例:发推并附带刚上传的媒体
核心回答:先通过分块或简化命令上传媒体并取得 MEDIA_ID
,再在发推请求中把该 MEDIA_ID
作为附件引用。
示例(伪流程,基于 README 列出的命令):
-
上传媒体并获得 MEDIA_ID
(参照上面分步或简化命令)。 -
发推(将获得的 MEDIA_ID
嵌入请求体的相应字段):
xurl -X POST /2/tweets -d '{"text":"Check this out","media":{"media_ids":["MEDIA_ID"]}}'
(这里演示了如何把媒体 ID 嵌入请求体;实际字段请以 API 要求的请求体结构为准。)
作者反思:把分块流程以命令级别暴露出来,既能让高级用户精细控制,也能让脚本化或自动化流程更可靠。README 覆盖了分块全流程,这是面向工程化使用的关键。
令牌存储(Token storage / Token 存储)
本段欲回答的核心问题:xurl 将令牌保存在哪里?如何保证持久化?
简短回答:xurl 将令牌安全地保存在用户主目录下的 ~/.xurl
文件夹(或文件)中,实现持久化。
摘要:了解存储位置有助于备份、迁移或清理 token。
存储位置
-
Tokens are stored securely in ~/.xurl
in your home directory. -
如果需要迁移或备份,复制该目录即可(注意保密与权限控制)。
作者反思:默认将 token 存放于用户主目录下是一种常见做法,但在生产或共享环境中,请注意文件权限与备份策略以避免凭据泄露。
常见使用场景与示例工作流(Scenarios & Worked Examples / 场景与示例工作流)
本段欲回答的核心问题:结合 README 的命令,我可以如何把多功能串联成完整的工作流?
简短回答:下面给出三个典型工作流:快速发推(带媒体)、搭建并注册临时 webhook、实时监听搜索流;每个工作流按步骤列出命令与注意点。
摘要:对初学者与工程化使用者均给出可直接复制粘贴的流程。
工作流 A:作为用户发一条包含图片的推文
核心回答:先通过 xurl auth oauth2
完成 OAuth2 用户认证 → 上传图片(简化命令或分块上传)→ 获取 MEDIA_ID
→ 发推引用 MEDIA_ID
。
示例步骤(基于 README):
-
完成 OAuth2 用户认证:
export CLIENT_ID=your_client_id
export CLIENT_SECRET=your_client_secret
xurl auth oauth2
-
上传图片(简化方式):
xurl media upload --media-type image/jpeg --category tweet_image path/to/image.jpg
# 假设命令返回 MEDIA_ID
-
发推(引用 MEDIA_ID):
xurl -X POST /2/tweets -d '{"text":"Photo upload test","media":{"media_ids":["MEDIA_ID"]}}'
工作流 B:本地接收并调试 webhook 事件
核心回答:使用 xurl webhook start
启动本地服务并得到 ngrok URL → 使用 app 认证注册 webhook → 观察收到的事件(写到文件或终端)。
示例步骤:
xurl webhook start -p 8081 -o webhook_events.log
# 从命令输出中复制 ngrok URL
xurl --auth app /2/webhooks -d '{"url": "<your ngrok url>"}' -X POST
# 然后在 webhook_events.log 中查看事件
工作流 C:监听搜索流并处理事件
核心回答:直接调用流式端点(/2/tweets/search/stream
等),xurl 会自动进入流式模式并连续输出事件。
示例命令:
xurl /2/tweets/search/stream
注意:处理流时通常需要把输出交给文件或管道,以便后续处理或解析。
命令清单与速查表(Command cheat sheet / 命令速查表)
本段欲回答的核心问题:哪些命令是最常用的,我如何快速对照使用?
简短回答:下表总结 README 中列出的常用命令与简短描述,便于快速查找与复制。
摘要:一览表便于 CLI 使用者迅速定位命令。
命令样例 | 作用 | |
---|---|---|
`curl -fsSL … | sudo bash` | 安装 xurl(单行安装脚本) |
xurl auth app --bearer-token BEARER_TOKEN |
使用应用 bearer token 完成认证 | |
export CLIENT_ID=... |
设置 OAuth2 客户端 ID | |
xurl auth oauth2 |
开始 OAuth2 用户上下文认证 | |
xurl auth oauth1 --consumer-key ... |
使用 OAuth1.0a 认证 | |
xurl auth status |
查看认证状态 | |
xurl auth clear --all |
清理所有认证信息 | |
xurl /2/users/me |
简单 GET 请求(示例) | |
xurl -X POST /2/tweets -d '{"text":"..."}' |
发起 POST 请求(示例) | |
xurl -H "Content-Type: application/json" /2/tweets |
添加 header | |
xurl --auth oauth2 /2/users/me |
指定认证类型 | |
xurl --username johndoe /2/users/me |
使用指定 OAuth2 账户 | |
xurl /2/tweets/search/stream |
监听流式搜索端点(自动流式) | |
xurl webhook start -p 8081 -o webhook_events.log |
启动本地 webhook 并写入文件 | |
xurl --auth app /2/webhooks -d '{"url":"..."}' -X POST |
注册 webhook | |
xurl media upload path/to/file.mp4 |
简化媒体上传 | |
xurl -X POST '/2/media/upload?command=INIT&... |
分块:INIT | |
xurl -X POST -F path/to/file.mp4 '/2/media/upload?command=APPEND&...' |
分块:APPEND | |
xurl -X POST '/2/media/upload?command=FINALIZE&media_id=...' |
分块:FINALIZE | |
xurl '/2/media/upload?command=STATUS&media_id=...' |
分块:STATUS | |
~/.xurl |
token 存储位置 |
代码片段与实操演示(Code snippets & practical demos / 代码片段与实操)
本段欲回答的核心问题:有哪些可靠的命令片段可以直接复制并用于脚本或调试?
简短回答:下面给出 README 中明确支持的命令片段(认证、发请求、分块上传、webhook 注册)以便复制到脚本或 CI 中。
摘要:所有片段都严格依据 README 内容编写,可直接使用或改写为脚本一部分。
示例:导出环境变量并启动 OAuth2 认证
export CLIENT_ID=your_client_id
export CLIENT_SECRET=your_client_secret
xurl auth oauth2
示例:带 JSON body 的 POST(发推示例)
xurl -X POST /2/tweets -d '{"text":"Hello world!"}'
示例:分块上传(INIT → APPEND → FINALIZE → STATUS)
# INIT
xurl -X POST '/2/media/upload?command=INIT&total_bytes=FILE_SIZE&media_type=video/mp4&media_catefory=tweet_video'
# APPEND (segment 0)
xurl -X POST -F path/to/file.mp4 '/2/media/upload?command=APPEND&media_id=MEDIA_ID&segment_index=0'
# FINALIZE
xurl -X POST '/2/media/upload?command=FINALIZE&media_id=MEDIA_ID'
# STATUS
xurl '/2/media/upload?command=STATUS&media_id=MEDIA_ID'
结论、反思与作者见解(Conclusion, Reflections & Author Insights / 结论、反思与作者见解)
本段欲回答的核心问题:使用 xurl 的总体价值是什么,我(作者)从 README 的设计与功能中学到了什么?
简短回答:xurl 把 X API 的常见认证模式、媒体上传、流式消费与临时 webhook 开发流程简洁地暴露在命令行,使得开发/调试/自动化更直接;README 内容覆盖了关键使用场景,便于工程化集成。
摘要:下面以简短反思形式总结工具设计带来的好处与注意点。
作者反思(Reflection / 反思)
-
支持多种认证方式(OAuth1/OAuth2/App)让工具在迁移或兼容旧系统时更有价值,但也要求用户在管理凭据时保持谨慎(尤其是在多账号场景)。 -
自动识别流式端点减少了手工判断连接模式的负担,这对实时系统调试特别重要。 -
把 ngrok 集成到 webhook 流程中能极大提升本地开发速度,但同时需要做好 ngrok token 的管理与安全控制。 -
提供完整的分块上传流程(INIT/APPEND/FINALIZE/STATUS)对媒体工程化至关重要,README 给出的步骤很适合脚本化实现。
实用摘要 / 操作清单(Practical checklist / 操作清单)
本段欲回答的核心问题:我需要记住的快速执行步骤有哪些?
简短回答:安装 → 配置凭据 → 选择认证模式 → 验证 xurl auth status
→ 依需求执行请求/流/上传/ webhook。下面给出一页速览与可执行清单。
一页速览(One-page summary / 一页速览)
-
安装: curl -fsSL https://raw.githubusercontent.com/xdevplatform/xurl/main/install.sh | sudo bash
-
应用认证: xurl auth app --bearer-token BEARER_TOKEN
-
OAuth2:设置 CLIENT_ID
/CLIENT_SECRET
、回调http://localhost:8080/callback
→xurl auth oauth2
-
OAuth1: xurl auth oauth1 --consumer-key ...
-
查看/清理认证: xurl auth status
/xurl auth clear --all
-
发请求: xurl /2/users/me
或xurl -X POST /2/tweets -d '{"text":"..."}'
-
媒体上传(简化): xurl media upload path/to/file
-
媒体上传(分块):执行 INIT → APPEND → FINALIZE → STATUS -
流式端点: xurl /2/tweets/search/stream
(自动)或xurl -s ...
(强制) -
Webhook: xurl webhook start
→ 注册 webhook → 观察事件 -
Token 存储: ~/.xurl
可执行清单(Actionable checklist)
-
安装 xurl。 -
为你的 app 在 X 开发者门户设置回调为 http://localhost:8080/callback
(如需 OAuth2)。 -
导出 CLIENT_ID
/CLIENT_SECRET
(如使用 OAuth2)。 -
运行 xurl auth oauth2
或xurl auth app ...
完成认证。 -
验证 xurl auth status
。 -
根据需求调用 API、上传媒体或开启流式监听。 -
使用 xurl auth clear
清理测试凭据,或备份~/.xurl
。
常见问答(FAQ / 常见问题)
本段欲回答的核心问题:读者在使用 README 指定的功能时最可能问的几个问题有哪些?
简短回答:下面列出的 7 个短问短答均基于 README 内容,覆盖认证、回调、媒体上传、流式与 token 存储等要点。
-
Q:如何安装 xurl?
A:运行curl -fsSL https://raw.githubusercontent.com/xdevplatform/xurl/main/install.sh | sudo bash
。 -
Q:OAuth2 的回调应该设置为什么?
A:README 要求设置为http://localhost:8080/callback
。 -
Q:我如何上传一张图片并在发推中引用?
A:先xurl media upload path/to/image.jpg
获取MEDIA_ID
,然后在发推请求体中引用该MEDIA_ID
。 -
Q:哪里可以查看或清理保存的认证?
A:使用xurl auth status
查看;使用xurl auth clear --all
或其他clear
子命令清理。 -
Q:xurl 会自动处理流式端点吗?
A:是的,对 README 列出的流式端点会自动识别;也可使用-s/--stream
强制流式。 -
Q:如何快速在本地接收 webhook 回调?
A:运行xurl webhook start
(可指定端口与输出文件),使用输出的 ngrok URL 注册 webhook。 -
Q:令牌保存在什么地方?
A:保存在~/.xurl
。