# ShellVPN Client
## 用户登录

- 调用 https://test-client-http-api.surfshell.io/auth/login 进行登录
- dan:是的
- 此版本已经没有记住下次自动登录选项,因此不需要保存 token
- dan: 如果不保存 token 的话,用户重新启动 客户端程序 是不是需要重新登陆?如果不重启 客户端程序 的话,能不能保持登陆状态?
- 点击 Forgot Password 打开浏览器跳转到指定 Url,哪个地址?
- dan: https://surfshell.io/forgetpwd
- 点击 Create Account 调到哪个地址?
- dan: 打开浏览器,调用地址:https://surfshell.io/login
## 首页

### 首页用户信息
- 通过上一步登录获取的 token 调用 https://test-client-http-api.surfshell.io/auth/user-info 获取用户信息
- dan: 是的
- 根据用户信息显示邮件、是否 VIP、VIP 过期时间。如何判断 VIP,过期时间没到就是 VIP 吗?
- dan: 是的,以过期时间是否到期,来判断是否是 VIP 用户
- 点击 "Renew" 跳转到哪个 URL?
- dan: 打开浏览器,跳转:https://surfshell.io/login
### 首页线路列表
- 通过 https://test-client-http-api.surfshell.io/v1/channels/enabled 获取线路列表
- dan: 是的
- 这个地方不太清楚该怎么做?拿到线路列表后,类似于 Clashy 中的线路实时速度、代理服务器地址等等这些信息从哪里获取?
- dan: 不需要做 clashy 的线路实时测速功能,需要做的内容:
1. 需要分组可折叠展开(如设计图)
2. 一级线路:一级线路图标,一级线路名称,默认隐藏的连接按钮(该按钮效果后面有详述)(如设计图)(目前一级线路只有 免费连接,和智能连接两条)
1. 免费线路:数据是服务端接口返回的
2. 智能连接:数据是本地写死的
3. 一级分组:分组图标,分组名,展开收起状态的指示器图标(如设计图)
4. 各分组下的二级线路:
1. 该分组的智能连接线路:
1. 线路名称
2. 线路信号强度的图标,信号强度是假的,写死的,这个图标找设计师要,
3. 默认隐藏的连接按钮(该按钮效果后面有详述)(如设计图)
2. 普通线路:
1. 线路名称
2. 线路信号强度的图标,信号强度是假的,写死的,这个图标找设计师要,
3. 默认隐藏的连接按钮(该按钮效果后面有详述)(如设计图)
5. 一级,二级线路的 默认隐藏的连接按钮:鼠标移入对应线路显示线框按钮,移入按钮显示选中效果,每条线路均如此(请参考设计图和注解)
6. 以上所有未特殊说明的 展示的信息的数据源,都来自 https://test-client-http-api.surfshell.io/v1/channels/enabled 接口返回的数据结构,你可以先了解一下数据解构,我们再讨论一下具体实现细节
- 点击 CONNECT 是和 Clashy 逻辑一样吗?
- dan:
- 我不是很清楚 Clashy 实现的细节,你能把 clash-core 是如何加载配置文件的这一块逻辑大致说一下吗?(这一块的逻辑应该是关键)是通过 /config 这个接口吗?
- 我们这边设计的整体流程是:
1. 客户端请求 connect , 服务端返回 config 配置相关的数据 ,是json格式
2. 然后客户端再把这个配置相关的数据 传入我们定制的 clash-core
3. 我们定制的 clash-core 会解析这个配置数据,接着启动 clash 代理
## 设置

- 这个几个选项我理解应该和 Clashy 一样都是本地操作
- dan: 是的
- 点击 Check for updates 通过 https://test-client-http-api.surfshell.io/latest-release 接口获取当前最新版本信息
- dan: 是的
- 但是我们所有的 API 相关域名都不只一个,因为我们需要保证一个域名被污染后用户也能正常访问,所以我们是打算加入多域名重试的机制:
1. 一个域名访问超时或者其他原因失败后,会请求一下个域名,直到所有域名都不能用,才会提示用户相关的错误
2. 我们会先在本地写死一批硬编码域名,用于首次请求硬编码域名,从服务端获取 动态域名列表(服务端可编辑)
3. 同时有接口用于从服务端获取动态域名列表
4. 客户端,首次启动会先用本地的硬编码域名去,请求服务端,获取一批 动态域名列表,然后以后都优先使用从服务端获取的这批动态域名列表去请求 API,本地的硬编码域名的使用优先级是最低的
- 官网跳转到:https://surfshell.io
- dan: 是的
- 隐私条款: https://surfshell.io/privacy-policy
- dan: 是的
- 服务协议:https://surfshell.io/terms-of-service
- dan: 是的
## 用于传入 clash-core 的 json 格式的配置的详情解释
- 配置文件样例:
```json
{
"Rule": [
"DOMAIN,test-client-http-api.surfshell.io,DIRECT",
"DOMAIN,test-client-http-api.surfshell.io,DIRECT",
"DOMAIN,client-http-api.cbab8f853234402bb8c9a2f72c514158.xyz,DIRECT",
"DOMAIN-KEYWORD,momo,DIRECT",
"DOMAIN-SUFFIX,ad.com,REJECT",
"GEOIP,CN,DIRECT",
"MATCH,Auto"
],
"allow-lan": false,
"data": "bZfpbXfxPPc9zkTGLVJ6J2kuK/tn0DDX1adnkV9ONvXfgzOPrYKyKV9Xkl43n3GhxR1H4+1QhkaBQVwMi9odlsgl7ZmK30NPSxtsE1JuB/Q1KpwL0OjlptN0kF+4UBLzvjm52ykqun+rncuaTRaw9Ovt9ZMnFaPici7Ro568HWF9mPeKZCfrb5igqnlkpXQURxbcRL3Bx+MlmthlAEzL6uz/PYkf1RzqDzXzoaUXLC9dEhP8IO2xqKfIgbUVG3RGkO6mieHeMPlO4qkbit907r3XdZsbB9uwUiUjWdHMABlQryIpbp1xhqlDQ3uQE7Pp7iAjtp8gIcHIMzhao41IfStTZ+9mf4PyL1Hz+H/Ip7eENCSa4jRnPHs5Hm5oqvXeFMx/0dz/YmZNwYqYVlaKRaDLVESRz7YfXRHfdb0T6l9MJusKTeI7LoWCyA6Jfu9xWlfuZ0jfFGIV6TZ8JdbHTkB+15t6uQaPwWL3S/YEK58=",
"external-controller": "127.0.0.1:9090",
"log-level": "debug",
"mode": "Rule",
"port": 7890,
"socks-port": 7891
}
```
- 样例解释:
1. data 字段来自 connect 接口返回的加密数据
2. 除 data 字段以外的字段由客户端自行负责构建
3. Rule 字段:
1. 客户端有全局功能开关,无论是否打开全局功能,Rule 规则里面,我们所有的 API 相关域名都必须走 直连,而不是走代理(防止连上部分代理之后,API 无法正常请求, 因此需要客户端构建 Rule 配置的时候,把所有 API 域名相关的配置为直连,如样例所示)
2. 当全局功能打开时,Rule 规则仅包含:
1. API 域名相关的配置为直连规则
2. "MATCH,Auto"
4. 当全局功能关闭时,Rule 规则包含(如样例所示):
1. API 域名相关的配置为直连规则
2. "DOMAIN-KEYWORD,momo,DIRECT",
3. "DOMAIN-SUFFIX,ad.com,REJECT",
4. "GEOIP,CN,DIRECT",
5. "MATCH,Auto"
4. log-level 字段:
1. 测试版 日志级别设为 debug ,
2. 正式版 日志级别设为 silent
5. external-controller, port,socks-port : 需要客户端将端口号各改成比较大的数字,避免和其他 clash 之类的客户端发生端口占用的冲突
6. allow-lan: 目前暂定为 false
7. 用于测试站的 clash-core, 和用于正式站的 clash-core 是分开的,目前发给你的是测试站的 clash-core, 等你需要正式站版本的时候,找我要 clash-core 正式站版本
8. 目前测试站不是所有线路都可用的,我测试过可以正常访问代理的线路是: 美国-1 HBO, 请用这条线路测试
## 智能连接,免费线路,以及 connect 接口传参说明:
1. 免费线路:不用客户端特殊处理,和普通线路一样处理
2. 智能连接,包括 2 种:
1. 线路列表中放在顶部的: "智能连接 (全局)",对应全局
2. 每个线路一级分组里面,放在分组顶部的: "智能连接(分组名)",对应每个分组
3. 上述的智能连接,服务端都不会直接返回数据,需要客户端根据服务端返回各分组的数据信息自己行间接构造(信息在 https://develop.vpsstart.xyz/v1/channels/enabled 接口返回的结果中)
4. 智能连接,推荐的构造的规则,以及相关的 connect 接口参数传递规则:
1. "智能连接(全局)":对应关联 groupId = 0, 该 groupId 用于调用 connect 接口时传参
2. 各分组的,"智能连接(分组名)": 对应关联各分组的 groupId, 该 groupId 用于调用 connect 接口时传参
3. connect 接口:
1. 智能连接 将 groupId 传入 group 参数,channel 参数传空
2. 普通线路 将 channel id 传入 channel 参数, group 参数传空
## clash-core 控制台返回的需要 提示用户 断开连接的 错误标识, 注意前后不包含空格:
1. Decode SurfshellConfig Failed (需提示用户配置文件解析错误)
2. Decrypt SurfshellConfig Failed (需提示用户解密错误)
3. bind: address already in use (需要提示用户端口已被占用)
4. 需要使用新的 clash-core
## clash-core 成功标识是 以下四行日志都出现且端口号正确:
Start initial compatible provider proxy
RESTful API listening at: 127.0.0.1:9090 (这个端口号需要确保和我们的配置指定端口号一致,该端口暂定:31879)
HTTP proxy listening at: 127.0.0.1:7890 (这个端口号需要确保和我们的配置指定端口号一致,该端口暂定:31880)
SOCKS proxy listening at: 127.0.0.1:7891 (这个端口号需要确保和我们的配置指定端口号一致,该端口暂定:31881)