81 lines
2.5 KiB
Python
81 lines
2.5 KiB
Python
#!/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()
|