fix: harden image handling and update docs
This commit is contained in:
@@ -2,7 +2,7 @@ import re
|
||||
import logging
|
||||
import json
|
||||
from pathlib import Path
|
||||
from typing import List, Tuple
|
||||
from typing import List, Tuple, Any
|
||||
from core.adapters.base import BaseAdapter
|
||||
from core.schema import StandardMessage, StandardResponse
|
||||
|
||||
@@ -78,6 +78,10 @@ class QianniuAdapter(BaseAdapter):
|
||||
acc_id = str(raw.get("acc_id") or raw.get("shop_id") or "")
|
||||
from_id = str(raw.get("from_id") or raw.get("cy_id") or "")
|
||||
msg_text = str(raw.get("msg") or raw.get("content") or "")
|
||||
raw_msg_type = self._safe_int(raw.get("msg_type"), 0)
|
||||
image_urls = self._extract_inbound_image_urls(raw, msg_text)
|
||||
if raw_msg_type == 1 and not msg_text.strip():
|
||||
msg_text = "【系统:已收到图片消息】"
|
||||
|
||||
# 判断方向:如果 from_id 包含了店铺名或 acc_id,通常说明是商家自己在说话
|
||||
# 或者逆向接口通常有一个特定的标识,这里我们做一个通用的逻辑判断
|
||||
@@ -96,7 +100,8 @@ class QianniuAdapter(BaseAdapter):
|
||||
user_id=user_id,
|
||||
user_name=str(raw.get("from_name", "")),
|
||||
content=msg_text,
|
||||
image_urls=self._extract_urls(msg_text),
|
||||
msg_type=raw_msg_type,
|
||||
image_urls=image_urls,
|
||||
acc_id=acc_id,
|
||||
acc_type=str(raw.get("acc_type") or "AliWorkbench"),
|
||||
raw_data=raw
|
||||
@@ -135,3 +140,52 @@ class QianniuAdapter(BaseAdapter):
|
||||
image_exts = (".jpg", ".jpeg", ".png", ".gif", ".webp", ".bmp")
|
||||
candidates = re.findall(r'https?://[^\s#]+', text)
|
||||
return [u for u in candidates if any(ext in u.lower() for ext in image_exts)]
|
||||
|
||||
@staticmethod
|
||||
def _safe_int(value: Any, default: int = 0) -> int:
|
||||
try:
|
||||
return int(value)
|
||||
except Exception:
|
||||
return default
|
||||
|
||||
def _extract_inbound_image_urls(self, raw: dict, msg_text: str) -> List[str]:
|
||||
urls = []
|
||||
seen = set()
|
||||
|
||||
def add_url(url: str):
|
||||
if not url:
|
||||
return
|
||||
s = str(url).strip()
|
||||
if not s or s in seen:
|
||||
return
|
||||
if self._extract_urls(s):
|
||||
seen.add(s)
|
||||
urls.append(s)
|
||||
|
||||
for url in self._extract_urls(msg_text):
|
||||
add_url(url)
|
||||
|
||||
for url in self._find_image_urls_in_obj(raw):
|
||||
add_url(url)
|
||||
|
||||
return urls
|
||||
|
||||
def _find_image_urls_in_obj(self, obj: Any) -> List[str]:
|
||||
found: List[str] = []
|
||||
|
||||
def walk(val: Any):
|
||||
if val is None:
|
||||
return
|
||||
if isinstance(val, str):
|
||||
found.extend(self._extract_urls(val))
|
||||
return
|
||||
if isinstance(val, dict):
|
||||
for item in val.values():
|
||||
walk(item)
|
||||
return
|
||||
if isinstance(val, (list, tuple, set)):
|
||||
for item in val:
|
||||
walk(item)
|
||||
|
||||
walk(obj)
|
||||
return found
|
||||
|
||||
Reference in New Issue
Block a user