目标:aHR0cHM6Ly9pLmVhc3Rtb25leS5jb20vd2Vic2l0ZWNhcHRjaGEvc2xpZGVydmFsaWQ=
参考文章,直接给了一个滑块的地址,不错的,可以直接分析
初步调试
初步调试发现首先会获取contextid这个参数,

然后get请求就是获取图片地址的请求,

查看get请求的启动器,打上断点,逐步调试

发现这里有获取浏览器cookie的操作,名为qgqp_b_id

可以发现getcontextid请求里带上的browserid就是上面获取的qgqp_b_id
核心部分
继续调试发现找到了get请求发出的地方:
发出的加密request参数的明文是如下这样组成的,这里变动的其实只有ctxid和r,其他似乎和版本以及测试账号有关
1 | var u = "appid=" + n.config.appid + "|ctxid=" + n.config.captchaContextId + "|a=" + n.config.account + "|p=" + n.config.password + "|r=" + Math.random(); |
再往下走,就是分析加密方法了

将加密代码发给GPT,推断为XXTEA算法,故验证如下
直接调用JS接口加密结果:
某网站加密结果:
现在可以确认采用了XXTEA算法进行加密
cookie生成
在编写代码时发现cookie不能通过request请求得到,发现是由客户端生成,全局搜索qgqp_b_id,发现其生成逻辑:
e是一个长度为 20 的字符串。第一个字符是一个 1 到 9 的随机数字(由Math.floor(9 * Math.random() + 1)生成),接下来的 19 个字符是 0 到 8 的随机数字(由Math.floor(9 * Math.random())生成)。- 最终生成的字符串类似
2 + "345678910111213...",也就是说一个以 1-9 开头,后面跟随 19 个 0-8 的数字的字符串。
设置 cookies:
- 使用
o.set("qgqp_b_id", e, 1e4, ".eastmoney.com")将生成的e存入名为qgqp_b_id的 cookie 中,并设置过期时间为1e4(即 10,000 秒,约为 2.8 小时),作用域为.eastmoney.com。 - 如果当前的
hostname包含dingqibao.com.cn或dingqibao.cn,还会在相应的域名下设置相同的 cookie。
背景图还原
发现返回的背景图是经过切割后的图片并且没有后续请求进行还原,那么说明是客户端进行还原并显示的。再接收到图片地址请求成功后,我们逐步调试到如下位置,发现DecodeImg方法,
进入k方法,
下面就是背景图还原的方法,经过多次调试发现数组a是一组定值,那么切片位置的还原就依赖于下面的代码:
1 | for (var l = 0, d = a.length; l < d; l++) { |

根据实际值用py给出复原代码,注意网站前端将图片缩放为260*160
1 | def genCompleteImg(): |
下面是复原的图片,略有瑕疵
滑动轨迹
打上断点,手动滑动滑块。得到发送的轨迹数据,格式为x1,y1,t1:x2,y2,t2,

1 | appid=202503141611|ctxid=d65781be7e6f60636c54a2613b51b4fd|type=slide|u=100|d=0,0,0:0,-2,11:0,-4,37:3,-4,47:7,-6,58:13,-7,69:19,-7,79:25,-7,90:29,-7,101:30,-7,112:31,-7,134:33,-7,150:36,-6,161:41,-6,171:46,-6,181:50,-6,192:53,-6,203:55,-6,237:56,-6,279:57,-6,465:59,-6,476:62,-6,487:66,-6,497:70,-6,507:75,-6,517:80,-6,527:85,-6,537:89,-6,549:92,-6,560:95,-6,570:97,-6,582:99,-6,595:100,-6,610:102,-6,621:101,-6,754:99,-6,764:98,-6,805:98,-7,871:96,-7,881:95,-8,898:96,-8,1038:99,-9,1055:101,-9,1067:103,-9,1084:105,-9,1097:106,-10,1107:105,-10,1298:103,-10,1324:102,-10,1337:101,-10,1353:100,-11,1589:99,-12,1602:97,-12,1616:96,-13,1665:97,-13,1870:100,-14,1882:101,-14,1893:100,-14,2058:98,-14,2069:99,-14,2824:100,-14,2953:100,-14,3191|a=quoteapi|p=|t=3191|r=0.8340204233087531 |
需要自己补充的字段包括ctxid、u滑动距离、d滑动轨迹数据、t滑动时间、r随机数,
用三阶贝塞尔曲线生成轨迹:
1 | def genSliderTrace(): |
最后通过验证:
