滑块 验证
爬虫方面必须会的
两款 需要还原 底图 轨迹
第一个 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()
效果:
第二个京东


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)
第三个有赞:
第四极验:
__EOF__

本文作者:inkser blog
本文链接:https://www.cnblogs.com/inkser/p/17602005.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/inkser/p/17602005.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~