|
|
@@ -38,16 +38,36 @@ def _get_aweme_info(item: object) -> dict:
|
|
|
DOUYIN_SEARCH_API = "https://api.tikhub.io/api/v1/douyin/search/fetch_video_search_v2"
|
|
|
DEFAULT_TIMEOUT = 60.0
|
|
|
|
|
|
+MIN_DURATION_MS = 45 * 1000
|
|
|
+
|
|
|
+
|
|
|
+def _safe_int(value: object) -> Optional[int]:
|
|
|
+ if isinstance(value, bool):
|
|
|
+ return None
|
|
|
+ if isinstance(value, int):
|
|
|
+ return value
|
|
|
+ if isinstance(value, float):
|
|
|
+ return int(value)
|
|
|
+ if isinstance(value, str):
|
|
|
+ s = value.strip()
|
|
|
+ if not s:
|
|
|
+ return None
|
|
|
+ try:
|
|
|
+ return int(float(s))
|
|
|
+ except ValueError:
|
|
|
+ return None
|
|
|
+ return None
|
|
|
+
|
|
|
|
|
|
|
|
|
@tool(description="通过关键词搜索抖音视频内容接口")
|
|
|
async def douyin_search_tikhub(
|
|
|
keyword: str,
|
|
|
- content_type: str = "0",
|
|
|
+ content_type: str = "1",
|
|
|
sort_type: str = "0",
|
|
|
publish_time: str = "0",
|
|
|
cursor: int = 0,
|
|
|
- filter_duration: str = "0",
|
|
|
+ filter_duration: str = "1-5",
|
|
|
search_id: str = "",
|
|
|
backtrace: str = "",
|
|
|
timeout: Optional[float] = None,
|
|
|
@@ -156,17 +176,25 @@ async def douyin_search_tikhub(
|
|
|
search_id_value = next_page.get("search_id", "")
|
|
|
backtrace_value = business_config.get("backtrace", "")
|
|
|
|
|
|
+ aweme_infos: list[dict] = []
|
|
|
+ for item in items:
|
|
|
+ aweme_info = _get_aweme_info(item)
|
|
|
+ duration_ms = _safe_int(aweme_info.get("duration"))
|
|
|
+ if duration_ms is not None and duration_ms < MIN_DURATION_MS:
|
|
|
+ continue
|
|
|
+ aweme_infos.append(aweme_info)
|
|
|
+ filtered_out_count = len(items) - len(aweme_infos)
|
|
|
+
|
|
|
summary_lines.append(
|
|
|
- f"找到 {len(items)} 条结果"
|
|
|
+ f"找到 {len(aweme_infos)} 条结果"
|
|
|
+ + (f"(过滤掉 {filtered_out_count} 条 duration<{MIN_DURATION_MS}ms)" if filtered_out_count else "")
|
|
|
+ (f",还有更多(cursor={cursor_value},search_id={search_id_value},backtrace={backtrace_value})" if has_more else "")
|
|
|
)
|
|
|
summary_lines.append("")
|
|
|
|
|
|
- for i, item in enumerate(items, 1):
|
|
|
- aweme_info = _get_aweme_info(item)
|
|
|
+ for i, aweme_info in enumerate(aweme_infos, 1):
|
|
|
aweme_id = aweme_info.get("aweme_id", "unknown")
|
|
|
desc = (aweme_info.get("desc") or aweme_info.get("item_title") or "无标题")[:50]
|
|
|
-
|
|
|
author = aweme_info.get("author") if isinstance(aweme_info.get("author"), dict) else {}
|
|
|
author_name = author.get("nickname", "未知作者")
|
|
|
author_id = author.get("sec_uid", "")
|
|
|
@@ -189,7 +217,7 @@ async def douyin_search_tikhub(
|
|
|
"douyin_search completed",
|
|
|
extra={
|
|
|
"keyword": keyword,
|
|
|
- "results_count": len(items),
|
|
|
+ "results_count": len(aweme_infos),
|
|
|
"has_more": has_more,
|
|
|
"cursor": cursor_value,
|
|
|
"duration_ms": duration_ms
|
|
|
@@ -199,7 +227,7 @@ async def douyin_search_tikhub(
|
|
|
out = ToolResult(
|
|
|
title=f"抖音搜索: {keyword}",
|
|
|
output="\n".join(summary_lines),
|
|
|
- long_term_memory=f"Searched Douyin for '{keyword}', found {len(items)} results",
|
|
|
+ long_term_memory=f"Searched Douyin for '{keyword}', found {len(aweme_infos)} results",
|
|
|
metadata={
|
|
|
"request_params": {
|
|
|
"keyword": keyword,
|
|
|
@@ -220,38 +248,38 @@ async def douyin_search_tikhub(
|
|
|
"raw_data": data,
|
|
|
"search_results": [ # 结构化搜索结果,供 Agent 直接引用
|
|
|
{
|
|
|
- "aweme_id": _get_aweme_info(item).get("aweme_id"),
|
|
|
+ "aweme_id": aweme_info.get("aweme_id"),
|
|
|
"desc": (
|
|
|
- _get_aweme_info(item).get("desc")
|
|
|
- or _get_aweme_info(item).get("item_title")
|
|
|
+ aweme_info.get("desc")
|
|
|
+ or aweme_info.get("item_title")
|
|
|
or "无标题"
|
|
|
)[:100],
|
|
|
"author": {
|
|
|
"nickname": (
|
|
|
- (_get_aweme_info(item).get("author") if isinstance(_get_aweme_info(item).get("author"), dict) else {})
|
|
|
+ (aweme_info.get("author") if isinstance(aweme_info.get("author"), dict) else {})
|
|
|
.get("nickname", "未知作者")
|
|
|
),
|
|
|
"sec_uid": (
|
|
|
- (_get_aweme_info(item).get("author") if isinstance(_get_aweme_info(item).get("author"), dict) else {})
|
|
|
+ (aweme_info.get("author") if isinstance(aweme_info.get("author"), dict) else {})
|
|
|
.get("sec_uid", "")
|
|
|
),
|
|
|
},
|
|
|
"statistics": {
|
|
|
"digg_count": (
|
|
|
- (_get_aweme_info(item).get("statistics") if isinstance(_get_aweme_info(item).get("statistics"), dict) else {})
|
|
|
+ (aweme_info.get("statistics") if isinstance(aweme_info.get("statistics"), dict) else {})
|
|
|
.get("digg_count", 0)
|
|
|
),
|
|
|
"comment_count": (
|
|
|
- (_get_aweme_info(item).get("statistics") if isinstance(_get_aweme_info(item).get("statistics"), dict) else {})
|
|
|
+ (aweme_info.get("statistics") if isinstance(aweme_info.get("statistics"), dict) else {})
|
|
|
.get("comment_count", 0)
|
|
|
),
|
|
|
"share_count": (
|
|
|
- (_get_aweme_info(item).get("statistics") if isinstance(_get_aweme_info(item).get("statistics"), dict) else {})
|
|
|
+ (aweme_info.get("statistics") if isinstance(aweme_info.get("statistics"), dict) else {})
|
|
|
.get("share_count", 0)
|
|
|
),
|
|
|
}
|
|
|
}
|
|
|
- for item in items
|
|
|
+ for aweme_info in aweme_infos
|
|
|
]
|
|
|
}
|
|
|
)
|