词典APP接口抓取

正文

市面上常见的词典有

http://www.hrexam.com/dictionary.htm

这次我们的目标为金山词霸

http://m.iciba.com/good

打开调试模式,我们发现真正调用的接口为

http://dict.iciba.com/dictionary/word/query/web?client=6&key=1000006&timestamp=1605840240438&word=good&signature=5f09bc837db5ad6b8495b763df46001f&_=1605840776467&callback=jsonp6

经过测试发现后两个参数是可以省略的,也就是说可以通过下述地址访问接口

http://dict.iciba.com/dictionary/word/query/web?client=6&key=1000006&timestamp=1605840240438&word=good&signature=5f09bc837db5ad6b8495b763df46001f

其中client和key肯定是固定的,timestamp为时间戳,word为查询的内容,那就只剩下signature,这个签名怎么算的呢?

并且我们发现如果接口包含callback=jsonp6,返回就会为jsonp的数据格式,去掉就是json格式

通过查看index.js我们发现下面这段代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
t.regist = function (n, i, r, o) {
r = r || {}, o = o || {};
var a = null;
return t[n] ? alert("接口###" + n + "###已经被注册,请变更接口名称") : void(t[n] = function (t, s) {
a && (a.abort(), a = null), "function" == typeof t && (s = t, t = {});
var l = "",
u = $.extend({}, r, t);
if (e.indexOf(n) !== -1) {
for (var c in u) u.hasOwnProperty(c) && (l += String(u[c]));
u.signature = md5(i.replace("//dict.iciba.com", "") + l + "7ece94d9f9c202b0d2ec557dg4r9bc")
}
return a = $.ajax({
url: i,
data: u,
type: o.type || "get",
dataType: o.dataType || "jsonp",
success: function (t) {
s && s(t)
},
error: function (t) {
console.log("Error: api(" + n + ")", t)
},
complete: function () {
a = null
}
})
})
};

了解大概意思后我们既可以简化签名的js了

安装依赖

1
npm install --save md5

引用

1
const md5 = require("md5");

方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
let u = {
client: 6,
key: 1000006,
timestamp: 1605840240438,
word: "good"
};
let i = "//dict.iciba.com/dictionary/word/query/web";
let l = "";
for (let c in u) {
l += String(u[c]);
}

u.signature = md5(
i.replace("//dict.iciba.com", "") + l + "7ece94d9f9c202b0d2ec557dg4r9bc"
);

console.info(l);
console.info(u.signature);

如果我们的查询参数有空格或中文怎么办

比如好好学习 天天向上

http://dict.iciba.com/dictionary/word/query/web?client=6&key=1000006&timestamp=1605852882061&word=%E5%A5%BD%E5%A5%BD%E5%AD%A6%E4%B9%A0+%E5%A4%A9%E5%A4%A9%E5%90%91%E4%B8%8A&signature=13fd685fab420cfd1e9a1aefb2d077da&_=1605853532168&callback=jsonp9

只要把参数编码一次即可

1
2
3
let str = "好好学习 天天向上";
let str2 = encodeURIComponent(str);
console.info(str2);