上周有个朋友想在自己博客侧边栏加个自选股涨跌,做的是静态站,不想搞后端_key,就问有没有不用申请、直接能调的行情接口,新浪这个就是被问最多的一类。

调用方式特别糙,直接 GET 一个地址就行,比如查浦发银行:

https://hq.sinajs.cn/list=sh600000

多个代码用逗号隔开,sh 是沪市,sz 是深市,bj 是北交所,想加美股就写 gb_aapl 这种前缀,港股是 rt_hk00700,规则得记一下。

返回的那一串数字分别代表什么

它不返回 JSON,返回的是一句 JS 赋值,大概长这样,var hq_str_sh600000=开盘价,昨收,现价,最高,最低……后面还跟着买卖盘和成交量,中间用逗号隔开,取现价就是拆开后第三个值。

前端很多人第一次调都踩乱码坑,因为这个接口默认是 GBK 编码,直接 fetch 拿到的中文名是乱的。要么用 script 标签直接引进来当变量读,要么用 arrayBuffer 加 TextDecoder 转 gbk,实测第二种在移动端更稳。

浏览器直接调会不会跨域

这个接口的好处就是不校验 referer,一般的个人站直接用 script src 引入就能用,不用代理。但别在循环里狂刷,有人写了个 1 秒轮询全量自选,IP 很快就被限了,表现就是偶尔返回空,隔几分钟又好。

  • 展示场景:直接 script 引入,前端解析字符串,5 秒以上间隔刷新一次
  • 量化场景:别用这个,它只有快照,没有 K 线复权,延迟也大
  • 商用场景:去买收费行情源,这个随时可能改格式,没任何 SLA

真要稳定跑,建议自己后端做一层缓存,每 5 秒抓一次再分发给前端,用户多的时候能省大量请求,也避免前端编码问题到处修。

顺便提一句返回字段顺序,现价后面依次是最高价、最低价、买一价、卖一价,接着才是成交量和成交额,很多人以为第三个后面紧跟的就是最高价,其实中间还夹着今开和昨收,数错一位图表就画歪。拿不准就先把整串打出来,对着字段说明一项项标号,比凭记忆猜靠谱。

一句话取舍:做个小挂件看看价,新浪这个够用了,要下单、要回测、要上生产,趁早换正规数据源。