# 益盟操盘手数据抓取器

## 前言

比起将其整合到整个平台应用中，解耦出一个数据抓取器更加便于维护和管理。抓取器只需要**获取股票池**并**定时更新**。

## 获取股票池

股票池从存放 tushare 数据库获取。抓取器应该能配置简单的股票池筛选规则，如仅限沪深 A 股。这个筛选规则可以是默认的，因为似乎益盟操盘手没有北交所数据。

获取股票池可以直接通过数据库读取。

## 更新

### 更新内容

应提供后台，对更新的内容进行配置，如：需要更新的指标、指标的参数等。

由于从益盟 5.0 版本开始，更新的指标名称由代码替代，所以在系统上也需要提供一份指标名称和代码的对应关系，以便用户能方便地选取指标。目前平台已经基本实现指标说明的获取功能。

指标参数除益盟 APK 内默认的 config_ind_online.json 外，每次启动程序还会从网上抓取一份最新的。可以通过实现抓取来获得最新配置。

另外，最好在平台上有方式对请求进行测试。每次更新前都需要确保既定的访问正常，一旦发现异常情况须立即停止更新，并对管理员发出警告。

### 更新频率

考虑以下两种方式：

1. 可使用 cron 表达式进行更新频率的配置。该表达式应该是忽略当日是否是交易日的，比如周末当然也可以运行更新。
2. 使用写死的逻辑代码进行更新。

### 更新配置

更新过程中的最大线程数、循环延时应提供相应后台进行管理配置。

为避免请求激增，同一请求任务应尽可能多地囊括需要更新的指标，即采用 `2422 CANDLE_STICK_V3` 而非 `2921 INDEX_CALC_V2` 来更新。

### 更新进度

更新进度应可视，进度是已更新股票数÷股票总数。过程应统计平均每支股票的更新时间，得出剩余时间：已用时间÷已更新股票数×未更新股票数。

## 日内更新和推送通知

对于需要特别关注的股票，应提供接收**特别关注股票**的接口（入池、出池）、推送功能、更新频率设置，供日内特别关注。

接口应以某种方式来验证是否是合法请求。

## 其他配置

益盟 client 参数，包括使用的用户参数、设备参数等，应提供简易后台进行配置。 当前使用本地 JSON 保存配置。默认配置应在对应配置类内提供初始值，当本地无 JSON 时从配置类内初始化保存在本地。

## 环境配置

### 测试环境

测试环境需要配置好 Clash、Fiddler。Clash 部分，需要对益盟网址 Phaser 进行设置，强制使用代理访问。

目前，平台已经提供代理设置界面，程序调用 okhttp 的地方基本上已经可以经由配置代理进行网络活动，故大部分确保平台访问能过代理的部分需要在 Clash 上的规则进行配置。

以 Clash Verge 为例：打开主界面——订阅——全局扩展脚本，编辑脚本如下：

```js
// Define main function (script entry)

function main(config, profileName) 
  // 此处的 dypnsapi.aliyun... 是益盟调用手机号登录的接口
  // 为了统一请求 IP 且不暴露真实 IP，这部分需要 REJECT-DROP
  config.rules.unshift('DOMAIN-SUFFIX,dypnsapi.aliyuncs.com,REJECT-DROP');
  config.rules.unshift('DOMAIN-SUFFIX,dypnsapi.aliyun.com,REJECT-DROP');
  config.rules.unshift('DOMAIN-SUFFIX,emoney.cn,喵酥云');
  config.rules.unshift('DOMAIN-KEYWORD,emapp,喵酥云');
  console.log(config.rules);
  return config;
}
```

具体使用的代理名称根据机场配置而定，也可以写 js 自动匹配。注意此处添加自定义规则采用的函数是 `unshift` 以添加到规则头部，确保自定义规则的优先级，否则很可能优先 match 到机场的自定义配置，导致自定义规则失效。

访问数据库不需要过代理，可以直连。

### 生产环境

暂未确定生产环境是否在本地环境。若在本地环境，可以选用 Windows 电脑，按照测试环境进行配置。若在云环境，必须明确所用云服务器是国外服务器。

当使用云环境作为生产环境时，须明确主数据库所在位置。若主数据库位于本地环境，则需要 frp 或其他内网穿透软件进行穿透。

## 预案

对于可能暴露的情况，需要准备预案，对内容进行销毁。可以为程序添加“毁灭模式”，一旦被触发，自动清除程序和附加的文件。