前言:又快要到国庆了,又绕不过抢票,索性自己研究下,之前也有研究,不过遇到了点问题,今天有时间就又研究了下12306接口。
个人猜测, /otn/HttpZF/GetJS是从服务端获取js,然后本地执行,然后生成 /otn/HttpZF/logdevice 及后面的url,并通过该请求获取这两个cookie,这几个cookie是全局的(每个请求的域名都会发送)
首先来看这个url
返回
callbackFunction('{"exp":"1564214075477","dfp":"iF4ApENCyh6Kdw1URaT70G7H_7ZPcRcXGYWMrWNm7OY3kxkh794ENoW8YzUTjIgiP1MpEXsij9Gp7NVKEj9TOlfX-K4yka5ngroOU9Kbk_sqnQabcS-aXwb6c6uqNH4AbcWdfn42PNoIh-j7vMTF-4elzPHhex4H"}')
exp即 RAIL_EXPIRATION
dfp即 RAIL_DEVICEID
怎么验证呢?
将 algID 在 /otn/HttpZF/GetJS 返回的js中查找,将会看到
Ya.getJSON("https://kyfw.12306.cn/otn/HttpZF/logdevice" + ("?algID\x3d2stcaJcUyY\x26hashCode\x3d" + e + a), null, function(a) {
在继续在 /otn/HttpZF/GetJS返回的js中查找getJSON,就会看到
var Ya = {
removeElem: function(a) {
var b = a.parentNode;
if (b)
try {
b.removeChild(a)
} catch (c) {}
},
rand: function() {
return Math.random().toString().substr(2)
},
now: function() {
return (new Date).getTime()
},
getJSON: function(a, b, c) {
b = u.createElement("script");
b.type = "text/javascript";
b.src = a;
b.id = "id_callbackFunction";
r.callbackFunction = function(a) {
r.callbackFunction = void 0;
var b = u.getElementById("id_callbackFunction");
b && Ya.removeElem(b);
c(a)
}
;
(a = u.getElementsByTagName("head")) && a[0] && a[0].appendChild(b)
},
这样就明白了,12306是通过创建 <script src="https://kyfw.12306.cn/otn/HttpZF/logdevice?algID=*************">这个标签来发送这个url的,然后再将返回的数据,用js写入cookie。这样就明白了流程,
下期再研究下 /otn/HttpZF/logdevice这个后面的众多参数生成规则,这样就可以自己写登陆了。
推荐我现在经常用的 一个 抢票软件 ,心到抢票 ,方便实惠,欢迎大家使用。