Files
xiaoli-cli/plugins/operit_scripts/market_network_test.py
T
shuiyu67 388ac493af feat(operit): 增强转译层并接入 5 个 Operit 市场插件
operit_loader.py:
- OkHttp 新增 newClient()(真实市场插件普遍使用,而非 newBuilder)
- OkHttpRequest.execute() 改为 async,与 Operit 运行时异步语义对齐
- OkHttpResponse 新增 json() 与 statusMessage()(基于 http.HTTPStatus)

operit_translate.py(新增):
- Operit .ts 插件 -> xiaoli-cli .py 脚手架生成器
- 自动提取 METADATA、生成 exports 胶水,原 TS 作参考注释保留

plugins/operit_scripts/ 新增 5 个已跑通的真实插件:
- market_time        时间查询/格式化
- market_duckduckgo  网页内容抓取与清洗
- market_crossref    Crossref 学术文献检索
- market_network_test HTTP 连通性测试
- market_reader      本地代码递归搜索

注: 工具需注册为 async 包装函数,同步 lambda 会导致 complete() 不执行的假阳性
2026-08-07 16:38:58 +08:00

91 lines
3.2 KiB
Python
Raw 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.
# METADATA
# {
# "name": "network_test",
# "display_name": { "zh": "网络测试", "en": "Network Test" },
# "description": { "zh": "基于 OkHttp 的网络请求测试(GET/POST)", "en": "Network request testing via OkHttp." },
# "category": "Network",
# "tools": [
# { "name": "http_get", "description": { "zh": "发送 HTTP GET 请求", "en": "Send HTTP GET" } },
# { "name": "http_post", "description": { "zh": "发送 HTTP POST 请求", "en": "Send HTTP POST" } }
# ]
# }
import json as _json
def getErrorMessage(error):
return str(error) if error else "unknown"
def getErrorStack(error):
import traceback
return traceback.format_exc()
def format_response(resp):
content = resp.content or ""
result = {
"status_code": resp.statusCode,
"status_message": resp.statusMessage,
"content_length": len(content),
"headers": resp.headers(),
"content": content[:12000],
}
try:
result["json"] = _json.loads(content)
except Exception:
result["json"] = None
return result
async def http_get(params):
if not params.get("url"):
return {"success": False, "message": "URL不能为空"}
try:
console.log(f"发送GET请求: {params['url']}")
req = OkHttp.newClient().newRequest().url(params["url"]).method("GET")
if params.get("headers"):
req = req.headers(params["headers"])
resp = await req.build().execute()
return {"success": True, "message": "GET请求完成", "data": format_response(resp)}
except Exception as e:
return {"success": False, "message": f"GET请求失败: {getErrorMessage(e)}"}
async def http_post(params):
if not params.get("url"):
return {"success": False, "message": "URL不能为空"}
if params.get("body") is None:
return {"success": False, "message": "请求体不能为空"}
try:
req = OkHttp.newClient().newRequest().url(params["url"]).method("POST")
if params.get("headers"):
req = req.headers(params["headers"])
body_type = params.get("body_type", "json")
req = req.body(params["body"], body_type)
resp = await req.build().execute()
return {"success": True, "message": "POST请求完成", "data": format_response(resp)}
except Exception as e:
return {"success": False, "message": f"POST请求失败: {getErrorMessage(e)}"}
async def wrap(func, params, ok_msg="操作成功", err_msg="操作失败"):
try:
result = await func(params)
complete({"success": True, "message": result.get("message", ok_msg),
"data": result.get("data"), **{k: v for k, v in result.items() if k not in ("success", "message", "data")}})
except Exception as error:
console.error(f"Error: {getErrorMessage(error)}")
complete({"success": False, "message": getErrorMessage(error), "error_stack": getErrorStack(error)})
async def http_get_wrapper(params):
await wrap(http_get, params, "GET请求完成", "GET请求失败")
async def http_post_wrapper(params):
await wrap(http_post, params, "POST请求完成", "POST请求失败")
exports.http_get = http_get_wrapper
exports.http_post = http_post_wrapper