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 中直接提取并细化):

  1. 在 X API 开发者门户创建应用。

  2. 在 authentication 设置中把 redirect URI 设置为:

    http://localhost:8080/callback
    

    Setup
    Redirect URI
    图片来源:项目资源(assets)

  3. 在本地导出客户端信息到环境变量:

export CLIENT_ID=your_client_id
export CLIENT_SECRET=your_client_secret
  1. 启动 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)

  1. 启动本地 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(示例格式,实际以命令输出为准)。

  1. 用得到的 ngrok URL 注册 webhook(通常使用应用级认证):
xurl --auth app /2/webhooks -d '{"url": "<your ngrok url>"}' -X POST
  1. 之后本地服务器会处理 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 给出的完整步骤如下。

  1. 初始化(INIT) — 告诉 API 你将上传的文件大小、类型与类别:
xurl -X POST '/2/media/upload?command=INIT&total_bytes=FILE_SIZE&media_type=video/mp4&media_catefory=tweet_video'

注意:命令中的参数 FILE_SIZEmedia_typemedia_catefory(README 原文拼写为 media_catefory)应按实际情况填写。

  1. 追加分片(APPEND) — 将分片上传到服务器(示例第 0 片):
xurl -X POST -F path/to/file.mp4 '/2/media/upload?command=APPEND&media_id=MEDIA_ID&segment_index=0'
  1. 完成(FINALIZE) — 通知 API 上传已完成并进行后续处理:
xurl -X POST '/2/media/upload?command=FINALIZE&media_id=MEDIA_ID'
  1. 查询状态(STATUS) — 检查处理进度或最终状态:
xurl '/2/media/upload?command=STATUS&media_id=MEDIA_ID'

场景组合示例:发推并附带刚上传的媒体

核心回答:先通过分块或简化命令上传媒体并取得 MEDIA_ID,再在发推请求中把该 MEDIA_ID 作为附件引用。
示例(伪流程,基于 README 列出的命令):

  1. 上传媒体并获得 MEDIA_ID(参照上面分步或简化命令)。
  2. 发推(将获得的 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):

  1. 完成 OAuth2 用户认证:
export CLIENT_ID=your_client_id
export CLIENT_SECRET=your_client_secret
xurl auth oauth2
  1. 上传图片(简化方式):
xurl media upload --media-type image/jpeg --category tweet_image path/to/image.jpg
# 假设命令返回 MEDIA_ID
  1. 发推(引用 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/callbackxurl auth oauth2
  • OAuth1:xurl auth oauth1 --consumer-key ...
  • 查看/清理认证:xurl auth status / xurl auth clear --all
  • 发请求:xurl /2/users/mexurl -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)

  1. 安装 xurl。
  2. 为你的 app 在 X 开发者门户设置回调为 http://localhost:8080/callback(如需 OAuth2)。
  3. 导出 CLIENT_ID/CLIENT_SECRET(如使用 OAuth2)。
  4. 运行 xurl auth oauth2xurl auth app ... 完成认证。
  5. 验证 xurl auth status
  6. 根据需求调用 API、上传媒体或开启流式监听。
  7. 使用 xurl auth clear 清理测试凭据,或备份 ~/.xurl

常见问答(FAQ / 常见问题)

本段欲回答的核心问题:读者在使用 README 指定的功能时最可能问的几个问题有哪些?
简短回答:下面列出的 7 个短问短答均基于 README 内容,覆盖认证、回调、媒体上传、流式与 token 存储等要点。

  1. Q:如何安装 xurl?
    A:运行 curl -fsSL https://raw.githubusercontent.com/xdevplatform/xurl/main/install.sh | sudo bash

  2. Q:OAuth2 的回调应该设置为什么?
    A:README 要求设置为 http://localhost:8080/callback

  3. Q:我如何上传一张图片并在发推中引用?
    A:先 xurl media upload path/to/image.jpg 获取 MEDIA_ID,然后在发推请求体中引用该 MEDIA_ID

  4. Q:哪里可以查看或清理保存的认证?
    A:使用 xurl auth status 查看;使用 xurl auth clear --all 或其他 clear 子命令清理。

  5. Q:xurl 会自动处理流式端点吗?
    A:是的,对 README 列出的流式端点会自动识别;也可使用 -s/--stream 强制流式。

  6. Q:如何快速在本地接收 webhook 回调?
    A:运行 xurl webhook start(可指定端口与输出文件),使用输出的 ngrok URL 注册 webhook。

  7. Q:令牌保存在什么地方?
    A:保存在 ~/.xurl