dalongxia/patch_bot_run_openclaw.py
2026-03-04 13:25:48 +08:00

84 lines
3.3 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from pathlib import Path
path = Path('/opt/openclaw-dingtalk-bridge/bot.py')
text = path.read_text(encoding='utf-8')
start_marker = ' def _run_openclaw(self, session_id: str, prompt: str) -> str:\n'
end_marker = '\n def _is_image_url(self, raw_url: str) -> bool:\n'
start = text.find(start_marker)
end = text.find(end_marker, start)
if start == -1 or end == -1:
raise SystemExit('failed to locate _run_openclaw boundaries')
replacement = ''' def _run_openclaw(self, session_id: str, prompt: str) -> str:
cmd = [
self.openclaw_bin,
"agent",
"--session-id",
session_id,
"--message",
prompt,
"--json",
"--timeout",
str(self.openclaw_timeout),
]
self.logger.info("openclaw call: session=%s", session_id)
try:
proc = subprocess.run(
cmd,
capture_output=True,
text=True,
timeout=self.openclaw_timeout + 20,
)
except subprocess.TimeoutExpired:
self.logger.error("openclaw call timeout: session=%s timeout=%ss", session_id, self.openclaw_timeout)
return f"OpenClaw 调用超时(>{self.openclaw_timeout}秒),请重试。"
if proc.returncode != 0:
err = (proc.stderr or proc.stdout or "openclaw error").strip()
return f"OpenClaw 调用失败: {err[:500]}"
try:
raw_stdout = (proc.stdout or "").strip()
decoder = json.JSONDecoder()
data = None
parse_error = None
try:
data, _ = decoder.raw_decode(raw_stdout)
except Exception as exc:
parse_error = exc
idx = raw_stdout.find("{")
while idx != -1:
candidate = raw_stdout[idx:]
try:
data, _ = decoder.raw_decode(candidate)
break
except Exception:
idx = raw_stdout.find("{", idx + 1)
if data is None:
raise parse_error
payloads = data.get("result", {}).get("payloads", [])
text_items = [p.get("text", "") for p in payloads if isinstance(p, dict)]
answer = "\\n".join(t for t in text_items if t).strip()
if not answer:
answer = "任务已执行,但未返回文本结果。"
if self._is_market_prompt(prompt) and (
"无法直接从页面抓取" in answer
or "需要登录后的操作" in answer
or "工具版本不支持点击交互" in answer
):
subject = self._extract_market_subject(prompt)
fallback = self._run_market_brief(subject)
return f"已切换为市场分析直连模式({subject}):\\n\\n{fallback}"
return answer
except Exception as exc:
self.logger.exception("parse openclaw output failed")
raw = (proc.stdout or "").strip()
return f"结果解析失败: {exc}.\\n原始输出: {raw[:500]}"
'''
new_text = text[:start] + replacement + text[end:]
path.write_text(new_text, encoding='utf-8')
print('patched', path)