新闻详情

新闻详情

首页 / 资讯中心 / 详情

网页点击股票代码自动打开本地股软:Wzslinker联动方案

发布时间:2026/9/29 15:46:45来源:尧图网络
网页点击股票代码自动打开本地股软:Wzslinker联动方案
每次在东方财富网页版上刷资讯看到文章里提到某只股票、再切到本地股软输一遍代码这个动作我重复了快两年。直到我把 Wzslinker 这套网页联动方案跑通才算把“网页看盘”和“本地股软看盘”之间的那几步切换成本压到最低。Wzslinker 你可以直接理解成 Web Stock Linker干的事情就一件在网页上点一下股票代码本地股软立刻打开对应的行情页面。它不花钱、不用改股票软件、也不碰任何交易链路适合那些常年混在网页资讯里、同时离不开本地股软深度指标的人。下面把我从需求拆解到编码实测的完整过程写出来能复现。1. 网页看盘切本地股软到底输在哪一步很多人觉得“网页版能看、本地股软也能看干嘛非要联动”。我在做 Wzslinker 之前也是这么想的直到一次复盘的时候被折腾到没脾气。那天晚上我在网页版翻一份板块复盘文章文章里连续提了七八只股票每只都带代码。正常操作是切到本地股软输入代码回车等行情刷出来再切回网页继续看。七八只股票就是七八轮重复动作中间只要有一轮输错市场前缀打开的还是另一只完全无关的股票。那天之后我开始认真算这笔账一次切换大概要 10 到 15 秒一天重复几十次一周下来浪费的时间足够做一次完整的复盘了。1.1 网页版和本地股软各自不可替代的部分网页版的优势是资讯更新快、板块热点和关联个股都在同一个页面里看到就能点本地股软的优势则是本地指标公式、分笔数据、自定义画线、多周期联动这些深度功能网页版替代不了。所以问题的关键从来不是“要不要用本地股软”而是“怎么在两者之间做最短路径跳转”。前端页面给你一串数字代码你把它喂给本地软件这个动作在技术上其实不复杂难的是连接两端的桥一直没人做。1.2 Wzslinker 实际解决的三类场景我在设计的时候按使用频率把联动场景分成了三类。第一类是资讯联动。网页文章里提到某只股票点击代码段本地股软直接打开对应分时。这个场景最高频。第二类是批量联动。把网页上的板块成分股、自选股列表批量导到本地股软里。第三类是复盘联动。复盘中按顺序翻阅股票时本地股软跟着逐只切换。我最初只想解决第一类但做着做着发现只要网页端脚本和本地服务端协议设计得干净三类场景都能复用一个链路。这也算是我做这个小项目比较大的收获不要一开始就冲着“大而全”去把最痛的那个点打通后扩展只是顺手的事。2. secid 与 secid2东方财富网页里的股票代号到底怎么读联动的前提是能从网页里拿到“当前用户看的是哪只股票”的信息。你可能觉得直接抓网页上的股票名称就行但名称有简称、有带后缀的、还有重名的最可靠的反而是代码而且是带市场信息的代码。2.1 在网页链接里找到 secid东方财富网页版的行情跳转链接里最常见的是secid参数格式是“市场编号.股票代码”。比如secid1.600519其中 1 表示沪市600519 是股票代码secid0.000001里 0 表示深市。有时候在部分内部接口或嵌套页面里会看到secid2它本质上还是同一套“市场代码”标识只是不同业务场景下的变体解析逻辑完全一样。我自己的脚本里会这样取const secid href.match(/[?]secid([01]\.\d{6})/)?.[1] || href.match(/[?]secid2([01]\.\d{6})/)?.[1];很多初学者在这里容易犯一个错直接用比较宽的正则去匹配数字结果把页面里其他参数也捞进来。严格限定[01]\.\d{6}之后基本就不会误伤了。2.2 市场前缀比股票代码本身更重要拿到 secid 之后下一步是把“市场编号”映射成本地股软认识的代码前缀。本地股软一般用sh表示沪市、sz表示深市所以secid1.600519应该转成sh600519secid0.000001转成sz000001。为什么这么强调市场前缀因为有跨市场重号。比如深市的000001和港股的00001就是完全不同的标的。如果不带市场信息直接输数字本地股软大概率会打开一个错误的行情甚至提示“无此代码”。映射表很简单常见就两种secid 市场编号对应市场转成本地股软前缀1沪市 A 股sh0深市 A 股sz港股、美股等场景的市场编号和本地股软代码规则都不一样我在本项目里暂时没做扩展但协议上预留了字段后面加也不难。2.3 一个稳妥的转换函数我习惯在本地服务端做转换而不是在前端脚本里做。原因很简单前端脚本是跑在别人页面里的容易被网页改版影响本地服务端是自己控制的出问题好排查。import re def secid_to_symbol(secid: str): m re.match(r^([01])\.(\d{6})$, secid) if not m: return None market sh if m.group(1) 1 else sz return f{market}{m.group(2)}注意股票代码一律按字符串处理。像000001这种以 0 开头的代码如果在前端转成数字前面的 0 就丢了本地股软根本认不出来。这是我后来在实测里踩过的坑后面专门写。3. Wzslinker 本地联动服务一个只守本机的轻量中转站网页端拿到 secid 之后怎么把它送到本地股软我选择了“本地 HTTP 服务”这个方案而不是做浏览器扩展的原生消息通道。3.1 为什么是“浏览器脚本 本地服务”组合浏览器扩展如果想调用本地程序一般要走 Native Messaging需要配置清单文件、注册表还得处理浏览器更新带来的兼容问题。对个人工具来说太重了。换成本地服务方案之后架构就变得非常清晰网页脚本解析 secid → HTTP POST / GET → 本地联动服务 → 本地股软网页脚本只负责一件事把 secid 发给本机服务。本地联动服务拿到 secid转成sh600519这种格式再通过命令或模拟按键的方式让股软打开行情。两边解耦网页改版了最多改脚本本地股软换了一家就把执行模块换一下其他都不用动。3.2 服务端监听配置端口、协议与安全本地服务监听地址我固定为127.0.0.1坚决不监听0.0.0.0。端口我选了9477避开8080、3000这些热门端口降低冲突概率。协议我用带 token 的 JSON。核心字段就这几个字段类型说明secidstring形如1.600519tokenstring简单校验防止其他网页偷调actionstringquote表示打开行情预留扩展为什么加 token因为网页脚本的本质是“本地页面主动调用自己服务”如果有恶意网页猜到地址也能发请求。虽然它只能让本地股软开个行情造不成什么实质破坏但养成分离校验的习惯总没错。3.3 联动执行模块把代码“喂”给股软本地联动服务的最后一段是把代码传给股软。这里有三条路可选方案优点缺点命令行参数启动稳定不抢焦点很多股软不支持代码参数剪贴板实现简单依赖股软有没有“读剪贴板”功能模拟键盘输入兼容性最好窗口焦点没切对会打错地方我实测下来模拟键盘输入是最通用的。它本质上模拟的是你自己手敲键盘作用范围只限于你本机的股软窗口。逻辑是先激活股软窗口然后把六位数字代码发送进去再按一下回车。4. 从网页点击到股软弹窗完整链路与可抄的代码骨架这一节把整套链路完整写一遍分前端脚本、本地服务、执行模块三部分代码都是可以直接拿去改的骨架。4.1 前端脚本监听网页点击事件我用用户脚本的形式注入东方财富页面。脚本的核心逻辑是监听页面上的点击事件如果点到的是带secid或secid2的链接就阻止默认跳转改成把 secid 发给本地服务。// UserScript // name wzslinker-front // match https://*.eastmoney.com/* // run-at document-end // /UserScript (function () { const TOKEN wzl-2024; const LINK_URL http://127.0.0.1:9477/api/link; function secidFromHref(href) { return href.match(/[?]secid([01]\.\d{6})/)?.[1] || href.match(/[?]secid2([01]\.\d{6})/)?.[1]; } function sendToLocal(secid) { // 优先用图片请求避开浏览器对本地 HTTP 请求的跨域限制 const img new Image(); img.src LINK_URL ?secid encodeURIComponent(secid) token encodeURIComponent(TOKEN); } document.addEventListener(click, function (e) { const link e.target.closest(a[href*secid]); if (!link) return; const secid secidFromHref(link.href); if (!secid) return; e.preventDefault(); sendToLocal(secid); }); })();注意这里我特意用了new Image()而不是fetch。原因是在 https 页面里直接 fetch 一个 http 本地地址有时候会被浏览器拦截而图片请求天然避开了跨域读取限制作为“只触发不读取响应”的场景非常合适。这个方法也是我踩过几次坑之后定的。4.2 本地服务端用 Python 标准库就能跑服务端不需要重依赖Python 自带的http.server就够。import json import re import subprocess from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer from urllib.parse import urlparse, parse_qs LINK_PORT 9477 TOKEN wzl-2024 SOFT_TITLE 行情 # 改成你本地球软窗口标题里的关键词 def secid_to_symbol(secid: str): m re.match(r^([01])\.(\d{6})$, secid) if not m: return None market sh if m.group(1) 1 else sz return f{market}{m.group(2)} def open_quote(symbol: str): digits symbol[-6:] # 有些股软的搜索框只要纯数字 ps ( $w New-Object -ComObject WScript.Shell; f$w.AppActivate({SOFT_TITLE}) | Out-Null; Start-Sleep -Milliseconds 250; f$w.SendKeys({digits}~); ) subprocess.run([powershell, -NoProfile, -Command, ps], timeout5) class Handler(BaseHTTPRequestHandler): def do_GET(self): qs parse_qs(urlparse(self.path).query) payload { secid: qs.get(secid, [])[0], token: qs.get(token, [])[0], } self._handle(payload) def do_POST(self): length int(self.headers.get(Content-Length) or 0) raw self.rfile.read(length) if length else b try: payload json.loads(raw or b{}) except Exception: payload {} self._handle(payload) def _handle(self, payload): ok False symbol None if payload.get(token) TOKEN: symbol secid_to_symbol(payload.get(secid, )) if symbol: open_quote(symbol) ok True body json.dumps({ok: ok, symbol: symbol}).encode(utf-8) self.send_response(200 if ok else 400) self.send_header(Content-Type, application/json; charsetutf-8) self.send_header(Access-Control-Allow-Origin, *) self.send_header(Content-Length, str(len(body))) self.end_headers() self.wfile.write(body) def log_message(self, *args): pass if __name__ __main__: server ThreadingHTTPServer((127.0.0.1, LINK_PORT), Handler) server.serve_forever()代码逻辑不复杂收到 GET 或 POST 请求校验 token解析 secid转成sh600519或sz000001再调open_quote把纯数字代码发给股软窗口。4.3 执行模块为什么不直接用“启动程序传参”很多人第一反应是用命令行参数启动股软比如D:\Soft\Client.exe sh600519。这个方案确实稳定但实测下来有个问题不是所有股软都支持这种参数很多软件启动时直接忽略还是打开默认界面。所以我默认走“激活已有窗口 模拟输入”的路线。这条路的好处是股软不用重启打开速度更快代价是要求本地股软窗口已经运行而且窗口标题里必须有SOFT_TITLE里的关键词AppActivate才能找到它。4.4 用户体验上的几个细节整套链路跑通之后我用秒表算过网页点击到股软弹出行情大概 0.5 到 0.8 秒主要耗时在窗口激活后的等待延时。这个速度已经完全不影响复盘节奏了。另外服务端我在开发时还加了一个/api/ping接口作用是告诉前端“我还在运行”。前端脚本启动时会先 ping 一下如果连不上就在页面上提示“本地联动服务未启动”否则用户点了半天没反应会以为脚本坏了。5. 实测踩坑串号、焦点被抢、本地请求被封逐个拆给你看工具能用和工具好用之间隔着好几个实测坑。我把这几个坑完整记录一下基本都是网上文档里不会写的细节。5.1 坑一市场映射写反联动打开的是另一只票最开始我把secid0映射成沪市secid1映射成深市结果第一次实测就翻车了网页里点的是深市股票本地股软打开的却是沪市里代码相同的另一只。这种“串号”问题比不联动还恶劣因为它会误导你。排查过程很简单先在前端脚本里打印取到的 secid再在服务端打印转换后的 symbol两行日志一对发现映射反了。所以我在转换函数里加了一行注释1是上海0是深圳别记反。5.2 坑二000001 变 1前面的 0 被吞了前端 JavaScript 在处理纯数字字符串时很容易把它转成数字。如果 JSON 传参写成{secid: 0.000001}服务端拿到的基本就是0.000001转成字符串再解析正则直接匹配不上。解决方案就一条secid 全程按字符串处理不允许任何一层把它转成数字。我在前端把 secid 从链接里正则取出来之后立刻用String(secid)包一层防止后续操作意外转换。5.3 坑三模拟输入焦点被抢代码打进了别的地方SendKeys最大的问题是焦点必须准确落在股软窗口上。有次我本地开着聊天窗口联动触发后AppActivate没抢到焦点六位数字直接打进了聊天输入框里。好在那只是在自己机器上丢人要是放到正式场景里就麻烦了。我的处理办法是两层第一层AppActivate之后加 250 毫秒延时让窗口切换稳定第二层在发送之前检查当前激活窗口标题是否包含SOFT_TITLE不匹配就直接放弃用日志提示人工介入。if ($w.AppActivate(行情)) { Start-Sleep -Milliseconds 250 $w.SendKeys(600519~) }5.4 坑四https 页面请求本地 http 服务被拦这个问题我卡了挺久。前端脚本最开始用fetch发请求在 http 页面一切正常一到 https 页面就直接报跨域或混合内容错误。我一度怀疑是 CORS 配置不对后来发现是浏览器对“安全页面请求本地非安全地址”的拦截。绕过去的办法就是前面代码里写的放弃fetch改用new Image()这种只发请求不读响应的方式。实测下来稳定多了不用处理 CORS也不用为了本地服务折腾证书。5.5 坑五重复点击导致股软开了一堆窗口网页文章里有时候链接密集手一抖就双击了本地股软瞬间弹出好几个一模一样的分时窗口。解决办法是前端加防抖同一 secid 在 500 毫秒内只允许触发一次。let lastSecid ; let lastTime 0; function sendToLocal(secid) { const now Date.now(); if (secid lastSecid now - lastTime 500) return; lastSecid secid; lastTime now; const img new Image(); img.src LINK_URL ?secid encodeURIComponent(secid) token encodeURIComponent(TOKEN); }别小看这一层防抖它让联动服务端收到的重复请求少了很多日志也干净了。5.6 坑六服务端口被占用联动静默失败有次我发现点了几次都没反应排查到最后是9477端口被另一个进程占用了。服务启动时报错但是因为没看控制台根本没发现。现在的习惯是服务启动时输出一行明确的提示前端 ping 不到本地服务时页面上直接弹提示不再静默失败。这样任何一环断了都能顺着日志找到原因。最后说点个人体会我用这套方案已经跑了两个月整体感受是只要你愿意花半小时把服务端脚本配好接下来每天的看盘体验提升是实打实的。整套东西我最满意的一点是它没有侵入任何交易链路纯粹是把“复制代码、切换窗口、手动输入”这三步自动化等于把平时重复劳动的时间还给了自己。如果后续想扩展我建议可以顺手加一个系统托盘图标让本地服务可以一键启停也可以根据你现在用的股软把执行模块改成命令行参数或剪贴板方式不同股软的兼容性差异很大最好自己实测一遍。最后提醒一句本地服务只监听127.0.0.1就好token 校验也保留着个人工具也要养成最小暴露面的习惯。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

含分布式光伏的配电网无功补偿优化:Matlab粒子群算法实现 2026/9/29 17:44:57

含分布式光伏的配电网无功补偿优化:Matlab粒子群算法实现

分布式光伏大面积接入之后,配电网的运行方式跟以前完全不一样了。过去我们习惯按“单电源、单向潮流”来设计补偿方案,固定电容器组加有载调压就能应付大部分场景。但分布式电源出力波动大、接入位置分散,传统手段经常出现两个极端&#xff1…

阅读更多 →
创作纪念日:从数据复盘到选题规划,把一年内容变资产 2026/9/29 17:44:51

创作纪念日:从数据复盘到选题规划,把一年内容变资产

其实我一直不太把“我的创作纪念日”当成一个节日来过。直到前阵子整理草稿箱,翻到三年前同一天发出的第一篇内容,才发现时间这种东西,真的能被文字一笔一笔地钉住。那天晚上我没干别的,把这几年的创作数据、存稿、选题、留言从头…

阅读更多 →
OpenClaw安全部署指南:从裸奔到加固的完整实践 2026/9/29 17:44:51

OpenClaw安全部署指南:从裸奔到加固的完整实践

OpenClaw 最近确实火得不行,我身边好几个圈子都在聊它,GitHub 上的 star 涨得飞快,各种“AI Agent 自主干活”的演示视频看得人热血沸腾。我自己也跟进部署过几轮,从 Ubuntu 到 Docker,从接模型到接 Teams、Obsidian&a…

阅读更多 →
基于BGA-PSO混合算法的热电联产经济调度与Matlab实现 2026/9/29 17:44:51

基于BGA-PSO混合算法的热电联产经济调度与Matlab实现

搞过电力系统经济调度的人应该都有体会:如果只是做纯火电机组的负荷分配,那是个经典凸优化问题,很多现成算法都能解;但一旦把热电联产机组加进来,问题立刻变味了。热电联产机组的电出力和热出力之间存在强耦合&#xf…

阅读更多 →
2026远程工具横评:ToDesk低延迟夺冠,六大主流软件深度对比 2026/9/29 17:44:51

2026远程工具横评:ToDesk低延迟夺冠,六大主流软件深度对比

1. 先说清楚:我在什么环境下测的要说2026年这波远程工具的市场竞争,绕不开一个词:低延迟。我花了两周多时间,把市面上被讨论最多的六款主流远程工具拉到同一批设备、同一根宽带、差不多的使用场景里做了横向对比,最终结…

阅读更多 →
多代理AI选股筛选器:从架构设计到投资组合构建的工程实践 2026/9/29 17:44:50

多代理AI选股筛选器:从架构设计到投资组合构建的工程实践

1. 从零拆解一个AI选股筛选器的设计思路 第一次看到“设计基于代理的人工智能筛选用于投资组合投资”这个题目,很多人脑子里蹦出来的第一反应是“用AI炒股”。这个理解方向没错,但太粗糙了。真正落到工程实现上,它要解决的核心问题其实是&…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉