乐于分享
好东西不私藏

如何通过自定义插件,让扣子 Agent 调用你外部云手机的 ADB 接口

如何通过自定义插件,让扣子 Agent 调用你外部云手机的 ADB 接口

扣子 Coze Agent 对接外部云手机 ADB 完整思路

核心逻辑:扣子 SaaS 不能直连 ADB 端口,ADB 是 TCP 协议;扣子插件只支持 HTTP/HTTPS 调用。 
需要中间代理层:自建 HTTP 网关服务,网关执行 adb 命令,扣子调用网关 http 接口,网关转发指令到你的外部云手机GitHub。 
数据流:扣子 Bot(下发自然语言)→扣子自定义插件 HTTP 请求→你的自建 API 网关→网关执行 adb shell→外部云手机执行动作→截图 / 结果原路返回扣子对话。
整体部署 4 大步骤步骤
步骤1:准备外部云手机 + 打通 ADB 连通
  • 采购第三方云手机(阿里云 / 星界 / 其他),在厂商控制台开启网络 ADB,配置 IP 白名单,拿到 adb connect ip:port 连接地址。
  • 一台中转 Linux 服务器(轻量 ECS,用来跑网关程序),中转服务器能访问云手机 adb 端口。
  • 中转服务器安装 adb 工具,测试连通:adb connect 云手机IP:端口;adb devices确认设备在线。

⚠️禁止直接把 adb 5555 端口对公网暴露,极易被扫描入侵,必须走网关 + token 鉴权。


步骤 2:搭建极简 HTTP‑ADB 网关(2 种选型)
选型 A:现成开源项目(优先,不用写代码)
  • adb‑mcp‑server / Hermes‑Agent‑Phone,已经封装好 http 接口:执行点击、滑动、输入文字、截图、shell 命令,自带 token 鉴权GitHub。 
  • 对外暴露接口示例:
POST /api/execute
headers: Authorization: Bearer 你的密钥token
body: {"adb_cmd":"input tap 300 800"}
网关收到后本地调用 subprocess 执行 adb 命令,返回 stdout、截图 base64、执行状态。
选型 B:极简 Python FastAPI 最小 Demo(快速验证)
from fastapi import FastAPI,HTTPException
import subprocess
import os
app = FastAPI()
API_TOKEN="你的强密码token"
@app.post("/adb_run")
def adb_run(token:str,cmd:str):
    if token != API_TOKEN:
        raise HTTPException(status_code=401,detail="鉴权失败")
    res = subprocess.run(["adb","shell",cmd],capture_output=True,text=True,timeout=15)
    return {"stdout":res.stdout,"stderr":res.stderr,"returncode":res.returncode}
@app.post("/adb_screenshot")
def adb_screenshot(token:str):
    """截图返回base64,给扣子视觉模型识别画面"""
    if token != API_TOKEN:
        raise HTTPException(status_code=401)
    subprocess.run(["adb","exec‑out","screencap","‑p","/dev/stdout"],capture_output=True)
    # 将png二进制转base64返回

中转服务器安全配置:只开放 443/80 端口,开启 HTTPS,禁止 adb 端口公网放行。


步骤 3:扣子平台创建【云侧自定义 HTTP 插件】

1.扣子空间→资源库→插件→创建插件,类型:基于已有服务(OpenAPI)
2.插件根 URL 填写你的网关域名 https://xxx.yourdomain.com
3.定义 2 个工具 Action:
  • 工具 1:run_adb_shell入参:token、adb_command(adb shell 后面的指令,例如input tap 200 500)
  • 工具 2:get_phone_screenshot入参:token,返回图片 base64,供 Agent 做视觉推理。
4.请求头固定带上鉴权 token,填写在插件认证配置,不要每次入参手动传。
5.插件调试,测试调用接口,确认能拿到 adb 返回结果。
6.将插件添加到你的 Bot,开启工具调用。

步骤 4:Bot 人设提示词(关键,直接复制)
你拥有调用外部安卓云手机的能力,不要编造设备状态。
任务流程:
1. 用户给出操作手机的自然语言指令,你不要直接执行,先翻译成合法adb shell命令;
2. 调用run_adb_shell工具下发指令;
3. 调用get_phone_screenshot获取手机屏幕截图;
4. 读取截图画面,判断操作是否生效;
5. 把执行结果、屏幕画面情况整理自然语言回复用户。
约束:
- 禁止执行高危adb删除、格式化命令;
- 如果工具返回报错,如实反馈错误,不要虚构成功;
- 坐标基于该云手机屏幕分辨率,点击tap需要提供正确x,y。
两种运行模式对比
模式
优缺点
适用场景
上面这套 HTTP 网关 + 扣子插件
Bot 完全跑在扣子云端,随时随地对话控制云手机;需要维护中转服务器
正式使用、对外交付 Agent
Coze‑bridge 本地 Agent(本地电脑跑 adb)
不需要公网服务器;缺点电脑必须一直开机在线,网络断开就失效
本地调试玩一玩
⚠️重要坑点(踩坑清单)
1.扣子 SaaS 插件不能访问内网地址、127.0.0.1,网关必须有公网 HTTPS 域名,http 明文在扣子会被拦截。
2.ADB 本身没有鉴权,所有安全全部由你的网关层 token 做防护,千万不要裸奔公网 adb 端口。
3.adb 命令执行会有超时,网关必须增加 timeout,防止卡死进程。
4.扣子工具调用有输出长度限制,adb 返回大 logcat 要做截断处理。
5.截图返回 base64 不要过大,否则超出扣子工具返回 payload 上限。
和扣子官方内置云手机差异
  • 官方扣子云手机:不用管服务器、adb,按量扣积分,黑盒,不能自定义安卓镜像。
  • 这套自建方案:你掌控云手机实例,可以自选各家云厂商;但是你要承担服务器、网络、设备稳定性维护,扣子只是下发指令的调度大脑。

我是喻一一

以心驱笔,以墨为欢,从记录和感悟中获取力量,人海茫茫,很高兴能在我的文字里与你相遇,在这纷繁复杂的世界里,我们一起碎碎念,一起走走看!