如果遇见了,大多都是对token的加密。
今天遇见了这样一个网站:
想要获取验证码图片。抓包获取之后:
requests.post()请求啊,但是请求之后一直在被网站拒绝,一直在报403.。
后来回头重新看,才发现请求头中是有X-CSRF-Token和c-token来识别身份的。
这个网站比较简单,这两个值是一样的。
然后就找这两值所在的界面嘛。
全局搜索之后,发现这个是明文传输的,如下:
那用requests中的
Session来进行会话保持,获取这个值,在访问图片的链接时,加进去即可。
这是最简单的token加密形式了。
代码如下:
import requests
import base64
import json
import re
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
def get_image():
s = requests.Session()
url1 = '*******************'
headers1 = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Cache-Control': 'max-age=0', 'Connection': 'keep-alive', 'Host': 'wsswj.hb-n-tax.gov.cn', 'Referer': 'https://www.google.com/', 'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'}
res1 = s.get(url1,headers=headers1).text
c_token = re.findall('var csrfPreventionSalt = "(.*?)";',res1)[0]
print(c_token)
headers2 = {
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
'Content-Length':'0',
'Host': 'wsswj.hb-n-tax.gov.cn',
'Origin': 'https://wsswj.hb-n-tax.gov.cn',
'Referer': 'https://wsswj.hb-n-tax.gov.cn/portal/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36',
'X-CSRF-Token': c_token,
'X-Requested-With': 'XMLHttpRequest',
'c-token': c_token,
}
url2 = '*********************'
resp = s.post(url=url2,headers=headers2,verify=False)
img = base64.b64decode(json.loads(resp.text)["repData"]['image'])
filename = 'template.jpg'
with open('./image/'+filename,'wb') as f:
f.write(img)
print('下载完成')
get_image()
多说一句,我在没有加上X-CSRF-Token和c-token的时候,一直报的403,也就是服务器端判别了我是属于非正常请求头的,所以说,服务器对这个是有一个验证识别机制的。