声明:本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除!由于本人水平有限,如有理解或者描述不准确的地方,还望各位大佬指教!!
练习网站:Q3JhenkgUHJvTW9ua2V5IGh0dHBzOi8vd3d3LmVtcy5jb20uY24vcXBzL3lqY3gvIw==
网站分析:
点击查询,出现验证码校验,如图
校验通过后,可以查看以下接口返回信息
其请求参数如图
初步判断,我们只需要将验证码校验通过,然后拿着校验通过后返回的capcode值去请求查询接口即可(不排除还有其他反爬限制手段)
那么,我们先进行验证码校验。同小编前面的验证码实战文章相似,我们对验证码进行跟栈找到滑块和背景图的图片字节流的具体处理过程。如下图所示,我们可以看到,两个图片也都是进行了base64操作,这和前面的实战操作相同(字节流转换图片储存本地,利用ddddocr求滑块偏移量),小编这里就不作过多讲解了
当我们求出偏移量后,尝试第一次实现正常请求,却发现并不能正常得到查询结果,如图
但是我们的post请求参数是没问题的
capcode, xpos = self.get_img_info()
data = {
"value": [
{
"ip": "39.110.120.19",
"xpos": xpos,
"capcode": capcode,
"mailStatus": "a",
"orderNum": [
phone_num
],
"orderType": "1",
"appleFlag": None
}
],
"list": [
phone_num
]
}
然后,我们就需要仔细检查是否存在其他反爬措施。果然,在查询接口的请求头部分,出现了类似加密值
我们就尝试找到他们的加密入口,判断请求头具体校验了哪些参数。经过跟栈,我们找到了入口位置,这里可以发现,服务器端是校验了ticket参数和时间戳,也能看出ticket的A值是和上图中是相同的
那么我们只要破解ticket加密过程即可,观察A值所需用到的前边参数的值,再观察加密值长度等,可以判定出使用了原生的md5和base64加密,如下图
那么,我们就可以复现加密了
const CryptoJS = require("crypto-js");
function fjm_sdk(phone, capcode) {
var r = Date.now().toString(),
l = r.substring(0, 3),
c = r.substring(r.length - 10),
p = "053B245CB1B74EBBB5FBB4A5889D66B8",
d = capcode,
h = phone + l + p + c + d,
g = CryptoJS.MD5(h).toString().toUpperCase(),
m = CryptoJS.MD5(g).toString().toUpperCase(),
A = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(encodeURIComponent(m)));
return [r, A]
}
得到请求头校验值之后,我们就可以正常进行网站请求了,如图
那么,今日的分享就到这里,想要学习更多的python爬虫和js逆向的相关技巧和知识的小伙伴们一定要点下关注哟,后期会不定时分享相关干货内容