按应用代理

让手机上选定的应用通过上游 SOCKS5 或 HTTP 代理联网,不需要 root,检查它们对外显示的地址,并让凭据不出现在脚本中。

本页为译文。如与英文版不一致,以英文版为准。 English

proxy 让你选定的应用通过你指定的代理服务器联网,而手机上的其他部分,以及 Droidline 自身与电脑的连接,继续使用正常网络。典型的用法是让一整架手机中的每一部,在某个应用上各自使用不同的出口地址。

开始之前

  • Android 10 或更高版本。
  • VPN 权限,在应用的设置标签页中允许一次即可。在此之前,proxy 会以 NO_PERMISSION 失败。
  • 手机上没有其他正在运行的 VPN 应用。Android 同一时间只运行一个 VPN,所以 Tailscale、WireGuard 等应用无法与它同时运行。
  • 一个你有权使用的上游代理:socks5:// 或 http://,带不带用户名和密码都可以。

开启、检查、关闭

d.proxy("socks5://user:pass@203.0.113.10:1080", app="com.android.chrome")
print(d.proxy_check("com.android.chrome"))
# {'active': True, 'ip': '203.0.113.10', 'upstream': 'socks5://203.0.113.10:1080', 'error': ''}
d.proxy("off")
await d.proxy("socks5://user:pass@203.0.113.10:1080", { app: "com.android.chrome" });
console.log(await d.proxyCheck("com.android.chrome"));
// { active: true, ip: '203.0.113.10', upstream: 'socks5://203.0.113.10:1080', error: '' }
await d.proxy("off");
droidline proxy socks5://user:pass@203.0.113.10:1080 --app com.android.chrome
droidline proxy_check com.android.chrome
droidline proxy off

app 接受一个包名或一个列表。proxy_check 从手机经由上游发出一个请求,报告外界看到的该应用的地址。

不要把密码写进脚本

在电脑上用一个简短的名称保存代理,只需一次。密码存放在服务器的机密存储中(Windows 上使用 DPAPI),不会写入 config.toml 或你的代码:

droidline proxy add kr1 socks5://user:pass@203.0.113.10:1080
droidline proxy list

然后用 @ 加名称引用它:

d.proxy("@kr1", app=["com.android.chrome", "com.example.app"])
await d.proxy("@kr1", { app: ["com.android.chrome", "com.example.app"] });
droidline proxy @kr1 --app com.android.chrome,com.example.app

工作原理

应用会启动一个只作用于所选应用的 VPN,并把这些应用的代理设为 Droidline 应用内的一个小型代理服务器。这个本地代理把每个连接转发到你的上游:

  • http://host:port,可附带 user:pass,使用 HTTP CONNECT。
  • socks5://host:port,可附带 user:pass。主机名由代理解析,而不是由手机解析。

所选应用的其他所有流量都会被丢弃,不会绕过代理泄漏出去。因此,忽略系统代理设置的应用会失去网络连接,而不是直接联网。Chrome 以及大多数基于 WebView 或 OkHttp 的应用都遵循这项设置。

失败时

proxy 以 PROXY_FAILED 失败,并附带一个 reason:

原因通常表示
auth用户名或密码错误
timeout代理没有响应;检查地址,并确认手机能访问到它
refused该端口上没有程序在监听
protocolURL 写的是 socks5,但服务器使用的是 HTTP,或者反过来

proxy_check 会在 error 字段中报告同样的问题,但不会失败。

限制

  • 每部手机同一时间只能有一个上游。用不同的 URL 再次调用 proxy 会替换它。
  • 代理开启期间,应用内的本地代理监听手机的回环地址。同一部手机上的其他应用如果尝试,也能使用它;在你自己控制的手机上,只有安装了不信任的应用时,这一点才有影响。
  • 使用你有权使用的代理,并只用于允许这样做的服务。参见使用条款。