first commit

This commit is contained in:
Hermes Agent
2026-05-10 13:52:46 +08:00
commit ccc63d1e70
4583 changed files with 584341 additions and 0 deletions

View File

@@ -0,0 +1,80 @@
#!/usr/bin/env python3
"""Twitter/X 搜索。通过 TikHub API。"""
from __future__ import annotations
import sys
from search_utils import build_parser, get_client, get_key, make_item, make_result, print_json
TIKHUB_BASE = "https://api.tikhub.io"
SEARCH_ENDPOINT = "/api/v1/twitter/web/fetch_search_timeline"
def search(query: str, limit: int, token: str | None = None) -> list[dict]:
"""执行 Twitter 搜索。"""
if not token:
raise ValueError("需要 TIKHUB_TOKEN 环境变量。请到 tikhub.io 注册获取。")
headers = {
"Authorization": f"Bearer {token}",
"Accept": "application/json",
}
params = {
"keyword": query,
"search_type": "Latest",
}
with get_client(timeout=30, headers=headers) as client:
resp = client.get(f"{TIKHUB_BASE}{SEARCH_ENDPOINT}", params=params)
resp.raise_for_status()
data = resp.json()
# 解析 TikHub 返回结构
items = []
results = data.get("data", {}).get("data", [])
if isinstance(results, dict):
results = results.get("data", [])
for tweet in results[:limit]:
content = tweet.get("content", {}) if isinstance(tweet, dict) else {}
if not content:
content = tweet
text = content.get("full_text") or content.get("text") or ""
user = content.get("user", {}) or {}
screen_name = user.get("screen_name", "")
tweet_id = content.get("id_str") or content.get("rest_id") or ""
url = f"https://x.com/{screen_name}/status/{tweet_id}" if screen_name and tweet_id else ""
items.append(make_item(
title=f"@{screen_name}" if screen_name else "",
url=url,
snippet=text[:500],
author=user.get("name"),
screen_name=screen_name,
favorite_count=content.get("favorite_count"),
retweet_count=content.get("retweet_count"),
created_at=content.get("created_at"),
))
return items
def main():
parser = build_parser("搜索 Twitter/X 推文")
parser.add_argument("--token", help="TikHub Token也可通过 TIKHUB_TOKEN 环境变量设置)")
args = parser.parse_args()
token = get_key("TIKHUB_TOKEN", args.token)
try:
items = search(args.query, args.limit, token)
print_json(make_result(True, args.query, "twitter", items))
except Exception as e:
print_json(make_result(False, args.query, "twitter", [], str(e)))
sys.exit(1)
if __name__ == "__main__":
main()