隐藏页面特效

滑块 验证

爬虫方面必须会的

两款 需要还原 底图 轨迹

第一个 pkulaw

import json import random from PIL import Image from io import BytesIO from base64 import b64decode from ddddocr import DdddOcr import time import requests def generate_track(distance): """ 生成滑块的轨迹 :param distance: 滑块需要滑动的距离 :return: 滑块的轨迹列表 """ tracks = [] # 滑块的轨迹列表 current = 0 # 当前滑动距离 mid = distance * 3 / 4 # 拖动距离的3/4作为中间位置 t = 0.2 # 模拟人的动作间隔时间 v = 0 # 初始速度 while current < distance: if current < mid: a = random.uniform(2, 3) # 加速度在2-3之间随机取值 else: a = -random.uniform(2, 3) # 加速度在-2到-3之间随机取值 v0 = v # 初始速度 v = v0 + a * t # 当前速度 move = v0 * t + 0.5 * a * t * t # 当前位移 current += move tracks.append(round(move)) vv = [] det = 0 for i in tracks: det += i t = round(time.time() * 1000) vv.append("{},{}".format(det, t)) time.sleep(0.005) return '|'.join(vv) class Slider(): def __init__(self): self.dd = DdddOcr(det=False, ocr=False) self.req = requests.Session() self.req.headers = { 'Accept': 'application/json, text/javascript, */*; q=0.01', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6', 'Connection': 'close', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'Origin': 'https://www.pkulaw.com', 'Referer': 'https://www.pkulaw.com/', '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/115.0.0.0 Safari/537.36 Edg/115.0.1901.188', 'X-Requested-With': 'XMLHttpRequest', 'sec-ch-ua': '"Not/A)Brand";v="99", "Microsoft Edge";v="115", "Chromium";v="115"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', } def downimg(self): data = 'act=getcode&spec=300*200' response = self.req.post('https://www.pkulaw.com/VerificationCode/GetVerifiCodeResult', data=data).json() resjson = json.loads(response) y = resjson['y'] arr = resjson['array'] small = resjson['small'] with open('target.jpg', 'wb') as fp: fp.write(b64decode(small.split(',')[1])) normal = resjson['normal'] self.resimg(arr.split(','), b64decode(normal.split(',')[1])) def resimg(self, arr, imgtxt): # 还原 图片 img = Image.open(BytesIO(imgtxt)) newimg = Image.new("RGB", img.size) u = 30 f = 100 for i in range(len(arr)): num = int(arr[i]) x = int((i - 10) * u if i > 9 else i * u) y = 100 if i > 9 else 0 # 开始截取 cort = img.crop((x, y, x + u, y + f)) newx = (num - 10) * u if num > 9 else num * u newy = 100 if num > 9 else 0 newimg.paste(cort, (newx, newy)) newimg.save('bg.jpg') def detslice(self): with open('bg.jpg', 'rb') as fp: bg = fp.read() with open('target.jpg', 'rb') as fp: tar = fp.read() return (self.dd.slide_match(tar, bg, simple_target=True))['target'] def postslider(self, x): # 发送请求 data = { 'act': 'check', 'point': '{}'.format(x), 'timespan': '1625', 'datelist': generate_track(x) } print(generate_track(x)) response = self.req.post( 'https://www.pkulaw.com/VerificationCode/GetVerifiCodeResult', data=data, ) print(response.json()) def main(self): self.downimg() x = self.detslice() self.postslider(x[0]) if __name__ == '__main__': x = Slider() x.main()
View Code

效果:

 

第二个京东

import json import time from ddddocr import DdddOcr import requests from random import random from base64 import b64decode from track import gettrack import execjs d = execjs.compile(open('test.js','r',encoding='utf-8').read()) sess = requests.Session() cookies = { '__jdv': '122270672|direct|-|none|-|1693053565184', '__jdu': '16930535651841903031468', 'mba_muid': '16930535651841903031468', 'areaId': '21', 'ipLoc-djd': '21-1845-0-0', '__jda': '122270672.16930535651841903031468.1693053565.1693053565.1693287518.2', '__jdc': '122270672', '__jdb': '122270672.2.16930535651841903031468|2.1693287518', 'wlfstk_smdl': 'r1cjwqth5fek3fdbw92yy2kdfilkntte', '3AB9D23F7A4B3C9B': 'WTVAS3IZRIA6EUFCU5xxxP4VQEMF4KF5OUAGQL3CDSV3GUCWZVH2HVSICOXUZCY45ZGXYQR3ZxxxSA4NPLB5EXQ', } sess.cookies = requests.utils.cookiejar_from_dict(cookies) sess.headers = { 'Accept': '*/*', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive', 'Pragma': 'no-cache', 'Referer': 'https://passport.jd.com/', 'Sec-Fetch-Dest': 'script', 'Sec-Fetch-Mode': 'no-cors', 'Sec-Fetch-Site': 'same-site', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/5x7.36 (KHTML, like Gecko) Chrome/1xx.0.x.0 Safari/53x.36 Edg/116.0.1xx8.x2', 'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Microsoft Edge";v="116"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', } params = { 'appId': '1604ebb2287', 'scene': 'login', 'product': 'click-bind-suspend', 'e': cookies['3AB9D23F7A4B3C9B'], 'j': '', 'lang': 'zh_CN', 'callback': f'jsonp_{random()}'.replace('.', ''), } response = requests.get('https://iv.jd.com/slide/g.html', params=params) ret = json.loads(response.text.split('(')[-1][:-1]) challenge: str = ret['challenge'] patch: bytes = b64decode(ret['patch']) bg: bytes = b64decode(ret['bg']) Dd = DdddOcr(ocr=False, det=False, show_ad=False) distance: int = Dd.slide_match(target_bytes=patch, background_bytes=bg, simple_target=True)['target'][0] distance = int(distance * 278 / 360) tr = gettrack(distance) time.sleep(3) params = { 'd': d.call('getCoordinate',tr), 'c': challenge, 'w': '278', 'appId': '1604ebb2287', 'scene': 'login', 'product': 'click-bind-suspend', 'e': cookies['3AB9D23F7A4B3C9B'], 'j': '', 's': '224271118108593154', 'o': 'x@139.com', 'o1': '0', 'u': 'https://passport.jd.com/new/login.aspx?ReturnUrl=https%3A%2F%2Fglobal.jd.com%2F', 'lang': 'zh_CN', 'callback': f'jsonp_{random()}'.replace('.', ''), } response = sess.get('https://iv.jd.com/slide/s.html', params=params) print(response.text)
View Code

 第三个有赞:

 

 第四极验:

 


__EOF__

本文作者inkser blog
本文链接https://www.cnblogs.com/inkser/p/17602005.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   inks  阅读(118)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示