开盘啦怎么联动通达信、同花顺?一个看盘联动工具的技术拆解(截图识别 + 切股指令 + 手机局域网直连)
一、要解决什么问题短线用户的看盘习惯通常是「两段式」发现在开盘啦 App 里看竞价异动、涨停梯队、题材强度确认在电脑上的通达信、同花顺里看分时、盘口、K 线。开盘啦以及同一家公司的开盘红没有官方 Windows 客户端所以电脑上一般跑在安卓模拟器里或者干脆在手机上看。两边之间的「搬运」全靠人工记代码 → 切窗口 → 输代码 → 回车开着两个行情软件就输两遍。需求很明确在开盘啦里点一只股票电脑上的行情软件自动切到同一只。约束条件也很明确不能动行情软件本身不注入、不改文件、不碰交易账户要兼容雷电、夜神、MuMu、逍遥等多种模拟器不能依赖某一家的私有接口要能在普通配置的电脑上稳定跑用户大多不是技术人员。二、整体架构截图识别局域网直连切股切股模拟器里的开盘啦校验 / 去重 / 防抖安卓手机上的开盘啦分发器通达信同花顺含远航版三个环节拿到股票代码 → 校验去重 → 发给行情软件。下面逐个说。三、来源端一模拟器里的开盘啦为什么选截图识别而不是 adb拿到「用户点了哪只股票」最直观的做法是通过 adb 读模拟器里的界面信息。我们评估后没有用 adb原因是对比项adb 方案截图识别方案用户要做的设置开调试模式、装驱动、处理端口无安装即用模拟器兼容性各家 adb 端口和版本不同升级后经常断只依赖窗口画面和模拟器内部无关对模拟器的侵入需要连接模拟器内部不连接、不改动模拟器难点连接稳定性识别准确率、性能对普通用户来说「不用开 adb」这一点就能省掉一大半售后问题所以我们把难度留给自己选了截图识别。截图识别还有一个好处来源 App 不绑定接口。开盘红和开盘啦同一家公司出的竞价、资金类 App在模拟器里运行时同样可以识别并联动不需要对方提供任何接口。识别流程大致是找窗口定位模拟器的渲染窗口判断点击用户在模拟器窗口内点击后再截图而不是一直轮询截图降低 CPU 占用截取区域只截需要的区域减少识别量识别代码或名称用 OCR 引擎识别股票代码或名称校验识别结果必须通过股票代码规则校验并能在本地股票列表里查到才往下发。第 5 步很关键。识别错一个数字就会跳到一只完全不相干的股票比没跳还糟。校验规则的简化版importre# A 股代码前缀规则简化版完整规则以交易所为准RULES[(r^(600|601|603|605|688|689)\d{3}$,SH),(r^(000|001|002|003|300|301)\d{3}$,SZ),(r^(920\d{3}|[48]\d{5})$,BJ),]defnormalize(code:str,name_map:dict)-str|None:返回带市场前缀的代码不合法或本地列表查不到时返回 None宁可不跳也不能跳错codecode.strip()forpattern,marketinRULES:ifre.match(pattern,code):fullf{market}{code}returnfulliffullinname_mapelseNonereturnNone如果识别到的是股票名称而不是代码就反查本地股票列表名称有歧义时比如带 ST 前缀、改过名的票宁可不发。四、来源端二手机直连不装模拟器V6.9.3 开始支持安卓手机直接带动电脑适合不想开模拟器、电脑配置一般的用户。手机端用 Android 无障碍服务读取开盘啦、同花顺手机版当前界面上被点击的股票信息这也是为什么需要用户手动打开「无障碍」和「通知」两个权限传输手机和电脑在同一局域网内直连电脑端监听一个端口默认 8888手机按 IP 端口连接配对电脑端生成六位配对码手机填对了才建立连接防止同一局域网里的其他设备乱发方向目前是单向的手机带动电脑电脑上切股票不会反推到手机。几个踩过的坑用户填地址时带了http://在手机端做了输入清洗只保留数字和点手机清后台导致断连很多国产 ROM 会杀后台教程里专门提醒用户不要清理联动啦后台App 里也做了断线重连不在同一个路由器用流量的手机连不上电脑这个没法从技术上绕只能在 FAQ 里写清楚。五、接收端把代码发给通达信和同花顺行情软件让外部程序切换股票常见有几种思路思路说明问题模拟键盘输入激活行情窗口输入代码再回车等同于人手输入依赖窗口焦点会打断用户正在做的操作窗口消息 / 软件自带的联动接口有些行情软件支持外部程序发消息切换股票不同软件、不同版本差异大要逐个适配注入 / Hook直接改行情软件内部风险高我们明确不做不管用哪种方式有两个工程问题绕不开多窗口、多屏时发给哪个窗口重度用户会同时开多个通达信窗口分布在几块屏幕上。我们的规则是优先发给用户最近点击过的那个行情窗口。所以教程里会让用户在开始联动前先用鼠标点一下希望接收的窗口。发完之后回到哪里短线用户的节奏是「看一只、退回来、再看一只」。切完股票后自动把焦点还给开盘啦的列表页用户可以接着点下一只不用自己再切回去。六、V9.3.0通达信 ⇄ 同花顺相互联动以及怎么防止「回环」V9.3.0 新增了两个行情软件之间的相互联动在通达信里切股票同花顺跟着切反过来也一样。这里有个经典问题回环。通达信切到 A → 通知同花顺切到 A → 同花顺切换后又被检测到「股票变了」→ 再通知通达信切到 A → ……如果处理不好就会无限互相触发或者两边来回抖动。处理思路是给每次切换带上「来源」并在短时间窗口内去重importtimeclassDispatcher:def__init__(self,targets,window1.0):self.targetstargets# {tdx: ..., ths: ...}self.windowwindow# 去重时间窗口秒self.last{}# 最近一次切换code - (来源, 时间)defon_change(self,code,source):nowtime.monotonic()prevself.last.get(code)# 同一只股票在时间窗口内已经由别的端发起过说明这是被动跟随产生的变化直接忽略ifprevandnow-prev[1]self.windowandprev[0]!source:returnself.last[code](source,now)forname,targetinself.targets.items():ifname!source:# 不发回给发起方target.switch(code)真实实现还要处理用户手速很快、连续切几只的情况时间窗口不能太长否则会吞掉用户的正常操作。七、兼容性让它在「任何一台电脑」上都能跑联动工具的口碑不是由功能决定的而是由「在我电脑上能不能用」决定的。这类工具最常见的兼容性问题系统缩放DPI125%、150% 缩放下截图坐标和窗口坐标对不上。需要按每块屏幕的 DPI 分别换算多屏且各屏缩放不同时尤其容易出错多屏坐标副屏在主屏左边或上方时坐标是负数很多代码默认坐标非负模拟器渲染模式部分模拟器在某些渲染模式下截图是黑屏需要换截图方式或提示用户切换渲染模式低配电脑同时跑模拟器、通达信、同花顺CPU 很紧张。我们在软件里提供了「推荐 / 加速 / 稳健」三种模式低配电脑用稳健模式牺牲一点速度换稳定窗口被遮挡开盘啦窗口被其他窗口挡住时截不到有效内容排查清单第一条就是检查遮挡。八、为什么这类工具容易被杀毒软件「误报」我们怎么处理「截图 模拟按键 监听点击」这几个行为放在一起在杀毒软件的启发式规则里很像远控或外挂所以这类小工具普遍容易被报。我们的处理代码签名安装包和主程序都做数字签名用户可以在文件属性里核对公布哈希官网公布每个版本的 SHA-256用户可以自己校验下载的文件有没有被篡改不做可疑的事不注入、不修改行情软件不读取交易账户信息不需要证券账户密码不劝用户关杀软遇到提示先核对来源、签名和哈希还不确定就问客服而不是让用户直接「信任」或关掉杀毒软件。我们的看法是「报毒」不能一律说成误报用户的警惕是对的。工具方要做的是让用户有办法自己验证。九、目前的限制电脑端只有 Windows 版Windows 10 / 1164 位手机端只有安卓版iOS 和鸿蒙在开发中来源端支持开盘啦模拟器、安卓手机和开盘红模拟器手机直连的来源是开盘啦和同花顺手机版接收端目前支持通达信和同花顺含远航版其他行情软件暂不支持手机直连需要和电脑在同一个局域网。十、最后这个工具做的事情很小就是把「记代码、切窗口、输代码」这一步自动化掉但要在几十种电脑配置、四五种模拟器、两款行情软件的不同版本上都稳定工程量远比看起来大。如果你也在做类似的桌面自动化或识别类工具欢迎在评论区交流踩坑经验。想试用的话官网是 www.liandongla.com。