网址:aHR0cHM6Ly94eGdzLmNoaW5hbnBvLm1jYS5nb3YuY24vZ3N4dC9uZXdsaXN0
访问这个网站,用谷歌浏览器似乎访问不了,只能用IE浏览器了。
进行搜索时,会弹出滑块验证码
一般来说,两个包最重要,一个是返回图片的包,一个是进行滑动验证的包。获取图片包,得到滑动距离x是我们的目标。
抓包分析,第一个包返回了一些a,b值(以后会有作用)以及滑块背景图和滑块的图片base64格式
再看看这个包的请求头和载荷,发现没有什么加密,因此写代码获取滑块图和a,b的值
获取到滑块图后,用ddddocr库去得到x的值,用下面的代码可以获得x的移动距离。
万事俱备,我们现在去看查验包有哪些参数,滑动滑块,但不要成功
我们发现验证滑块有没有成功的包有a,b,c三个加密参数,注意a,b是不同于第一个包返回的a,b的值的。我们现在跟栈分析。找到参数加密的位置。
直接进slideup(这个包的名字就吸引我进去),一看就找到了,打上断点,看看是怎么个事。
可以看出,验证包里的a,b是对第一个包里的a,b进行encodedata加密得来的。c是由滑块移动距离进行$getRsaCode加密,再进行encodedata加密得来的。
现在就是去找encodedata这个函数,往上一翻就找到了
这里面一看就是u也没有定义,接着往上找,复制下来
现在去找 $getRsaCode,发现是个RSA的加密,直接调用库
解决细枝末节后的js代码为,运行了一下,没有错误:
再写一个调用函数
结果为:
现在我们已经获得了验证包中的载荷加密参数,可以直接访问这个包,通过滑块验证。
写一个函数访问这个包,带上加密载荷。
我们看一下结果 ,验证通过。
通过验证码之后,我们需要得到数据,找到数据包,发现数据包有三个参数,刚好是a,b,c就是滑动好的a,b,c
定义一个得到数据的函数
最终结果:
通过更改载荷中的关键词和页码,可以访问不同的数据。
再次改进代码
完整python代码:
import requests
import base64
import ddddocr
import execjs
import pprint
def get_image():
cookies = {
'https_waf_cookie': '18378829-4d28-4d841c2ee84652d79b342b3c0ad8727b7f4b',
'SF_cookie_129': '12016923',
}
headers = {
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
'Connection': 'keep-alive',
# 'Cookie': 'https_waf_cookie=18378829-4d28-4d841c2ee84652d79b342b3c0ad8727b7f4b; SF_cookie_129=12016923',
'Referer': 'https://xxgs.chinanpo.mca.gov.cn/gsxt/newlist',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0',
'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Microsoft Edge";v="126"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
}
response = requests.get('https://xxgs.chinanpo.mca.gov.cn/gsxt/PlatformSHZZFRKGSXT/slideCaptcha',cookies=cookies,headers=headers,).json()
a = response['result']['a']
b = response['result']['b']
cutImage = response['result']['c']['cutImage']
oriImage = response['result']['c']['oriImage']
with open('cut.png', 'wb') as f1:
f1.write(base64.b64decode(cutImage))
with open('ori.png', 'wb') as f2:
f2.write(base64.b64decode(oriImage))
return a,b
def get_xcode():
det = ddddocr.DdddOcr(det=False, ocr=False, show_ad=False)
with open('cut.png', 'rb') as f:
target_bytes = f.read()
with open('ori.png', 'rb') as f:
background_bytes = f.read()
res = det.slide_match(target_bytes, background_bytes,simple_target=True)['target'][0]
print(res)
return res
def get_params(a,b,xcode):
js_code = execjs.compile(open('全国社会信用平台滑块逆向.js','r',encoding='utf-8').read())
result = js_code.call('get_params',a,b,xcode)
print(result)
return result
def get_check(code):
cookies = {
'https_waf_cookie': '18378829-4d28-4d841c2ee84652d79b342b3c0ad8727b7f4b',
'SF_cookie_129': '12016923',
}
headers = {
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
'Connection': 'keep-alive',
# 'Cookie': 'https_waf_cookie=18378829-4d28-4d841c2ee84652d79b342b3c0ad8727b7f4b; SF_cookie_129=12016923',
'Referer': 'https://xxgs.chinanpo.mca.gov.cn/gsxt/newlist',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0',
'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Microsoft Edge";v="126"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
}
params = {
'a': code['a'],
'b': code['b'],
'c': code['c'],
}
response = requests.get('https://xxgs.chinanpo.mca.gov.cn/gsxt/PlatformSHZZFRKGSXT/slide_captcha_check',params=params,cookies=cookies,headers=headers,
)
print(response.json())
return response.json()
def get_data(code):
cookies = {
'https_waf_cookie': '18378829-4d28-4d841c2ee84652d79b342b3c0ad8727b7f4b',
'SF_cookie_129': '12016923',
}
headers = {
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
'Connection': 'keep-alive',
'Content-Type': 'application/json;charset=UTF-8',
# 'Cookie': 'https_waf_cookie=18378829-4d28-4d841c2ee84652d79b342b3c0ad8727b7f4b; SF_cookie_129=12016923',
'Origin': 'https://xxgs.chinanpo.mca.gov.cn',
'Referer': 'https://xxgs.chinanpo.mca.gov.cn/gsxt/newlist',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0',
'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Microsoft Edge";v="126"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
}
json_data = {
'pageNo': 1,
'pageSize': 10,
'paramsValue': '阿里',
'ssfw': '1',
'aaae0127': '',
'xyzk': '',
'aaae0129': '',
'aaae0105': '',
'aaae0123': '',
'aaae0114': '',
'aae15having': '',
'aaae0145': '',
'aaae0110': '',
'aaae0137': '',
'aaae0149': '',
'aaae0136': '',
'aaae0139': '',
'a': code['a'],
'b': code['b'],
'c': code['c'],
}
response = requests.post(
'https://xxgs.chinanpo.mca.gov.cn/gsxt/PlatformSHZZFRKGSXT/biz/ma/shzzgsxt/a/gridQuery.html',
cookies=cookies,
headers=headers,
json=json_data,
).json()
data = response['result']['data']
for item in data:
compyname = item['aaae0103'].strip()
code = item['aaae0113'].strip()
aaae0113 = item['aaae0113'].strip()
aaae0123 = item['aaae0123'].strip()
print(compyname,code,aaae0113,aaae0123)
if __name__ == '__main__':
a,b = get_image()
xcode = get_xcode()
code = get_params(a,b,xcode)
get_check(code)
get_data(code)
完整js代码:
const JSEncrypt = require('node-jsencrypt');
var u = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
function get_RSAcode(t) {
var e = new JSEncrypt;
e.setPublicKey("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCCsYUGHMhjSzdMqn9JzPfKs9JbxXTPtHofTv7reV0HrEz4brnE6ZJpNn5s934KO3L4QDF7ELHysIiounhhpF1bewW9jKdcpZA5M1CkGHKcwpLA2liaqOlt/0Mf3ui9jxR9AHxUMFVGfJ6Q4+cEmDBUAEOXlxqk4ZjGpubwGNk9XQIDAQAB");
result = e.encrypt(t.toString())
return result
}
var encodedata=function(t) {
var a, i, e, s, n, l = "", c = "", o = "", r = 0;
do {
e = (a = t.charCodeAt(r++)) >> 2,
s = (3 & a) << 4 | (i = t.charCodeAt(r++)) >> 4,
n = (15 & i) << 2 | (c = t.charCodeAt(r++)) >> 6,
o = 63 & c,
isNaN(i) ? n = o = 64 : isNaN(c) && (o = 64),
l = l + u.charAt(e) + u.charAt(s) + u.charAt(n) + u.charAt(o),
a = i = c = "",
e = s = n = o = ""
} while (r < t.length);
return l
};
function get_params(avalue,bvalue,moveX) {
a = get_RSAcode(parseInt(moveX) + "");
i = {
a: encodedata(avalue),
b: encodedata(bvalue),
c: encodedata(a)
};
return i;
};
// console.log(get_params('1','2',56))