验证码服务平台注册连接:http://captcha.oxo.cool/reg通用性目前已知网站均能通过验证(包括其他平台过不去的带s值的企业版,如steam),且接口统一v2、v3。极致的速度接口使用纯算法计算参数,协议提交,同步返回,v3invisible、v2nocaptcha类型平均1s返回,v2其他图片点击类型最快2s,最慢不会超过10s(这也取决于代理的速度)。高可用v3分值高,大部分风控强度高的站点(如各种企业版),我们接口生产的token值,都能通过风控成功获取到目标数据。稳定性更新及时(不会超过两小时),更好地支撑您的业务。谷歌人机ReCaptcha(v2/v3通用版),直接返回tokenReCaptcha(v2/v3企业版),直接返回tokenReCaptcha(steam),直接返回tokenCloudFlare盾通用版返回cf_clearance、__cf_bm、正确响应源码html、验证流程使用的tls指纹Incapsula盾reese84通用版返回reese84cookie或solution参数Incapsula盾__utmvc通用版服务器直接无感验证或__utmvccookieHcaptcha通用版,直接返回generated_pass_UUIDakamaiV2直接返回_abcktls转发接口针对校验ja3、http2等指纹(akamai/cloudflare)的接口更多支持后续敬请期待.....注册连接:http://captcha.oxo.cool/reg新用户注册加群即送10000点余额新用户注册加群即送10000点余额新用户注册加群即送10000点余额
jsvmp特点jsvmp有一个最大的特点,就是有一长串字符串._$jsvmprt(...),算法代码的具体细节都在这个一节长字符串里,所有在算法的扣取上就很不友好,本案例采取补环境的方式实现。(glb="undefined"==typeofwindow?global:window)._$jsvmprt(.....)逻辑分析定位加密入口添加XHR断点,然后向下滑动,断点短住搜索_signature,在关键位置下断点,然后在刷新页面断点位置r变量,来自于S(n,e)函数计算,该S函数就是入口函数分析加密得值逻辑进入S函数,分析这一段逻辑,其实调用的就是//o是{'url':'xxxx'}window.byted_acrawler.sign(o)进入window.byted_acrawler.sign函数,来到acrawler.js文件,也就是jsvmp的Js文件补环境把acrawler.js文件全部复制下来,代码起始有一句(varglb;glb="undefined"==typeofwindow?global:window),这是检查当前是什么环境的,是node还是浏览器有两种处理办法使用jsdom补充window使用window=global当然还有其他更好的方式,这里采用第二次这样就和浏览器一样了加上一个输出,尝试使用node,浏览器执行,查看两者的区别浏览器正常得值,node报错,说明node缺少一些条件在浏览器添加条件断点,查看referrer是什么//referrer来自于document,继续添加环境document={referrer:''}node继续执行,发现没有sign,说明node还被检查着经过分析,发现这些代码,exports、module,这是node才存在的东西,直接改成undefined当然也有更好的方式直接过滤这些特征//nodetrue浏览器false"undefined"!=typeofexports//nodetrue浏览器false"undefined"!=typeofmodule继续执行,缺少href,就根据浏览器的插装输出补充就好了然后是缺少‘protocol’location={href:'',protocol:'https:'}然后是缺少userAgentnavigator={userAgent:'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/86.0.4240.198Safari/537.36'}再次执行,出现结果因为校验的不严格,所以这个短Cookie也是可以过的,长Cookie需要添加一些Cookie才行长Cookie需要加上其他的Cookie,这个cookie位置需要靠后,不然会被清空如果是自己写的环境框架,就不需要担心cookie的位置为了稳定,请求头部还需要带一个随机Cookie完整结构
难点头部顺序反爬、某些框架内部会对头部处理造成获取不到CookieTip:文末可以下载例子猿人学该题官网:http://match.yuanrenxue.com/match/3确定逆向目标请求加密一般在参数头部(Cookie,token,还有其他的自定义的),这里就只有Cookie了开始逆向既然第二个请求,带有Cookie,那么就需要确定该Cookie是生成,还是服务器返回,这里还有第一个请求,所以大概率是服务器返回分析请求第一个请求状态码是202(表示服务器端已经收到请求消息,但是尚未进行处理),还有Set-Cookie,那就可以确定是服务器返回的了获取不到Cookie的原因这里获取不到Cookie,有两个原因一、反爬(对请求头部的顺序有要求,最好是使用原始顺序)二、requests框架的原因(框架会对设置的头部进行优化修改)获取Cookie规避了上面两个问题后,就可以获取到Cookie请求数据importrequestsdefapp(page:int)->dict:session=requests.Session()session.headers={'Host':'match.yuanrenxue.com','Connection':'keep-alive','Pragma':'no-cache','Cache-Control':'no-cache','User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/91.0.4472.101Safari/537.36','DNT':'1','Accept':'*/*','Origin':'http://match.yuanrenxue.com','Referer':'http://match.yuanrenxue.com/match/3','Accept-Encoding':'gzip,deflate','Accept-Language':'zh-CN,zh;q=0.9',}session.post(url="http://match.yuanrenxue.com/jssm",)print(session.cookies)s=session.get(url="http://match.yuanrenxue.com/api/match/3",headers={"User-Agent":"yuanrenxue.project",},params={"page":page})returns.json()if__name__=='__main__':for_inrange(1,6):print(app(_))结果正确Tip:直接访问数据接口,会返回一段Js其实这段代码一点用都没有。完整代码:https://pan.bigdataboy.cn/s/JZh7
难点加密在Cookie,Cookie有时间限制,暗桩反调,混淆,调试阻塞Tip:文末可以下载例子猿人学该题官网:http://match.yuanrenxue.com/match/2确定逆向目标开始逆向加密值在Cookie有两种情况,该加密Cookie是服务器返回或者是本地生成分析请求反ob混淆这段代码经过了ob混淆,格式化后是这样的一键ob反混淆(猿人学提供有)网址:http://tool.yuanrenxue.com/decode_obfuscator分析加密处反混淆后,直接看见了document["cookie"],还有location["reload"]();这个不就就是:设置Cookie然后再次请求嘛调试加密值发现M()函数为空,V(Y)函数疑似加密结果导出加密值这个加密值在函数内部,想要使用就用全局变量接收一下暗桩一这段代码,其中!a6["test"](a2)执行起来很慢,并且一直返回true,所以直接写死,就会发现执行起来很快了,一些调试工具也不会阻塞了vara2=B(this,function(){vara5=function(){vara6=a5["constructor"]("return/\"+this+\"/")()["compile"]("^([^]+(+[^]+)+)+[^]}");return!a6["test"](a2);//true};returna5();});暗桩二如果说暗桩一是技巧,那暗桩二才是真正的暗桩,可以看这段代码改造了console.log只要我们一使用就会陷入,虽然这个暗桩对Js执行没有影响,但是调试就很容易陷入console=newObject()console.log=function(s){while(1){for(i=0;i<1100000;i++){history.pushState(0,0,i)}}}console.toString='[objectObject]'console.log.toString='?toString(){[nativecode]}'请求计算结果稍微修改Js,计算结果importexecjsimportrequestsdefget_c():returnexecjs.compile(open('./main.js','r',encoding="utf-8").read()).call('f')defapp(page:int)->dict:rep=requests.get(url="http://match.yuanrenxue.com/api/match/2",headers={"Cookie":f"sessionid=你的sessionid;m={get_c()};","User-Agent":"yuanrenxue.project",},params={"page":page})returnrep.json()if__name__=='__main__':sum=0for_inrange(1,6):data=app(_)forvalueindata.get('data'):sum=sum+value.get("value")print(sum)结果正确完整代码:https://pan.bigdataboy.cn/s/EYSW
难点源码压缩,混淆,反调,时间检测Tip:文末可以下载例子猿人学官网:http://match.yuanrenxue.com/确定逆向目标这个m值开始逆向过反调跟值此处是加密的url在发送出去最后出现的地方,我们可以通过函数调用的栈,进行跟值,找到大体加密的地方本地调试最终我们跟到了此处,发现它在<script>标签里,我们无法格式化,就无法断点调试我采用把整个网页扒下来,修改其中的<href>为绝对路径,采用fiddler本地替换网页响应,实现把在本地把<script>压缩的代码格式化,在手动加断点寻找window.f值逆向需要有怀疑精神,oo0O0()这个函数返回空,不会这么简单吧,进入它定位加密位置经过分析最终确定在这一行改造加密函数到这里,差不多就分析完成,就改造一下加密函数就完成了functionf(){varmv=Date.parse(newDate())+100000000;varwindow={};varm=eval("把eval里的全部复制过来window.f=hex_md5('bigdataboy')".replace(/bigdataboy/,mv))//这里有个小坑必须要用替换,因为拼接的md5值是不对的returnm+'丨'+mv/1000}请求计算结果importexecjsimportrequestsdefget_m():returnexecjs.compile(open('./main.js','r',encoding="utf-8").read()).call('f')defapp(page:int)->dict:rep=requests.get(url="http://match.yuanrenxue.com/api/match/1",headers={"Cookie":"自己的sessionid",'User-Agent':'yuanrenxue.project',},params={"page":page,"m":get_m(),})returnrep.json()if__name__=='__main__':sum=0count=0for_inrange(1,6):data=app(_)count=count+len(data.get("data"))forvalueindata.get("data"):sum=sum+value.get("value")print(sum/count)结果成功完整代码:https://pan.bigdataboy.cn/s/Nnsy
难点&目标网站:https://spa6.scrape.center/逆向参数:Token有时间限制,混淆,加密查找加密出位置通过技术分析,我们很容易找到加密生成的位置,主要观察_0x51c425['a']这个函数又很容易找到_0x51c425=_0x32d76d('7d92'),所以只要扣出_0x32d76d('7d92')就算解决问题扣代码再通过观察,发现网站是webpack打包的网站,那么就简单很多了,首先找到这样一段代码,然后改造成如下:varfff;!(function(_0x776dc){var_0x54509b={}function_0x478fb7(_0x2ad438){if(_0x54509b[_0x2ad438])return_0x54509b[_0x2ad438]['exports'];var_0xcb17fa=_0x54509b[_0x2ad438]={'i':_0x2ad438,'l':!0x1,'exports':{}};return_0x776dc[_0x2ad438]['call'](_0xcb17fa['exports'],_0xcb17fa,_0xcb17fa['exports'],_0x478fb7),_0xcb17fa['l']=!0x0,_0xcb17fa['exports'];}fff=_0x478fb7;}({模块代码的位置,完整下面网盘下载})仿写加密逻辑functiongetToken(){var_0x51c425=fff('7d92')returnObject(_0x51c425['a'])("/api/movie")();}最终效果完成特别说明:50积分只是0.5元,为防止恶意下载,也可以联系博主要积分兑换码即可完整代码:https://pan.bigdataboy.cn/s/4dcp
特别声明本文仅供学习交流,相关敏感数据已做脱敏处理分析目标通过抓包我们发现有两处加密值,sign、bv寻找加密位置搜索关键值,锁定这段代码为加密函数代码改写通过分析发现,sign、bv都是通过md5加密的所以我们就只需要进行一点点改写就好了//CryptoJS.MD5下面网盘可以下载functionMD5_Encrypt(word){returnCryptoJS.MD5(word).toString();}navigator={appVersion:"5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/91.0.4472.77Safari/537.36"}//e为翻译的文本functionget_sign_bv(e){vart=MD5_Encrypt(navigator.appVersion),r=""+(newDate).getTime(),i=r+parseInt(10*Math.random(),10);return{bv:t,sign:MD5_Encrypt("fanyideskweb"+e+i+"Tbh5E8=q6U3EXe+&L[4c@")}}相关资料下载特别说明:10积分只是0.1元,为防止恶意下载,也可以联系博主要积分兑换码即可https://pan.bigdataboy.cn/s/L0FV
工具说明使用tkinter制作的小工具,随机抽取一个男生、女生或者随机抽取一个人使用方法成品地址:https://pan.bigdataboy.cn/#/s/0Mh6源码地址:https://github.com/bigdataboy2020/choose_a_person准数据文件&打开软件初始化一定注意表格文件文件格式随机抽取源码说明view目录工具界面文件,能单独运行测试,没有功能main.py运行主文件,包含主要功能实现逻辑data.xlsx软件读取数据的文件,注意格式,不然无法初始化使用。打包说明使用pyinstaller打包,进入项目目录打包打包命令:pyinstaller-F-wmain.py
前言这个是2.0版本,使用现在流行的前后端分离思想重构。体验网址:https://douyin.bigdataboy.cn源码地址:https://github.com/bigdataboy2020/fastapi_douyin使用到的技术后端:语言:PythonWEB框架:FastAPI(现代、快速(高性能)的Web框架)服务器框架:Uvicorn(基于asyncio开发的一个轻量级高效的web服务器框架)反向代理:Nginx(高性能的HTTP和反向代理web服务器)进程管理:Supervisor(ython开发的一套通用的进程管理程序)前端:UI框架:LayUI静态文件存放:Nginx前端部署宝塔添加网站上传前端源码api请求域名可以部署后端之后,再来修改部署后端再添加一个网站,用于添加反向代理修改后端配置&上传源码允许浏览器跨域请求的网址。需要修改成自己的前端域名。宝塔添加Python项目Python版本需要3.6以上。添加进程守护运行目录:/www/wwwroot/api.bigdataboy.cn网站目录启动参数:/www/wwwroot/api.bigdataboy.cn/api_venv/bin/uvicornmain:app按照自己的网站目录改改守护进程配置成功如下,这时只需要去Python项目管理器再启动一次该项目就行。配置反向代理即可部署成功,有问题联系QQ876545500
测试代码fromseleniumimportwebdriverbro=webdriver.Chrome(executable_path="./chromedriver_win32/chromedriver.exe")bro.get(url="https://bigdataboy.cn")设置代理IP导入配置模块fromseleniumimportwebdriverfromselenium.webdriverimportChromeOptionsoptions=ChromeOptions()#本地代理不需要用户密码的代理options.add_argument('--proxy-server='+'59.63.40.207:32231')bro=webdriver.Chrome(executable_path="./chromedriver_win32/chromedriver.exe",options=options)bro.get(url="https://bigdataboy.cn")修改UAfromseleniumimportwebdriverfromfake_useragentimportUserAgentfromselenium.webdriverimportChromeOptionsoptions=ChromeOptions()#使用了一个模块options.add_argument('user-agent=%s'%UserAgent().random)bro=webdriver.Chrome(executable_path="./chromedriver_win32/chromedriver.exe",options=options)bro.get(url="https://bigdataboy.cn")隐藏自动化测试有些网站会检查selenium,从而爬取不到任何东西检验参数:window.navigator.webdriver添加配置,隐藏自动化测试fromseleniumimportwebdriverfromselenium.webdriverimportChromeOptionsoptions=ChromeOptions()#添加一个配置options.add_experimental_option('excludeSwitches',['enable-automation'])bro=webdriver.Chrome(executable_path="./chromedriver_win32/chromedriver.exe",options=options)bro.get(url="https://youhui.pinduoduo.com/")以上配置能组合使用,其他配置详见官网