feat: add xurl CLI as alternative X search backend

Adds xurl (https://github.com/openclaw/xurl) as a third X search
backend, sitting after xAI API and Bird/GraphQL in the priority chain.

xurl uses the official X API v2 with OAuth2+PKCE authentication,
requiring only a free X Developer App. It auto-refreshes tokens and
works reliably as a stable fallback when xAI API key or browser
cookies are not available.

Limitations:
- X API search/recent returns last 7 days only (vs Bird's full archive)
- No AI-powered relevance scoring (uses token_overlap_relevance instead)
- Free tier: 180 requests per 15-minute window

New files:
- scripts/lib/xurl_x.py: xurl CLI wrapper with search + parse
- tests/test_xurl_x.py: 30 unit tests (all passing)

Modified files:
- scripts/lib/env.py: detect xurl in get_x_source_with_method(),
  get_missing_keys(), and get_x_source_status()
- scripts/last30days.py: add xurl_x import and xurl branch in
  _search_x() priority chain
- SKILL.md: document xurl setup option
This commit is contained in:
weichao
2026-03-30 03:54:29 +00:00
parent 3107325443
commit adac4c377a
5 changed files with 446 additions and 3 deletions
+4
View File
@@ -40,6 +40,7 @@ from . import (
xai_x,
xiaohongshu_api,
xquik,
xurl_x,
youtube_yt,
)
from .cluster import cluster_candidates
@@ -895,6 +896,9 @@ def _retrieve_stream(
depth=depth,
)
return xai_x.parse_x_response(result), {}
if backend == "xurl":
result = xurl_x.search_x(subquery.search_query, depth=depth)
return xurl_x.parse_x_response(result, topic=subquery.search_query), {}
raise RuntimeError("No X backend is available.")
if source == "youtube":
# Use raw_topic so expand_youtube_queries() generates diverse variants