淘宝ua算法逆向

JavaScript05

淘宝ua算法逆向,第1张

分析了好几个小时淘宝的登陆,对其反爬虫方案有了点思路,先记录一下,后面会持续进行分析。

众所周知目前使用selenium打开浏览器访问淘宝,不管你是手动还是自动登录一律都是验证不通过,之前一直没有正式分析淘宝的反爬虫方案,今天花了几个小时分析了一下,也只是对其整体有个认识,在很多细节上还不清楚。

之前写过的两篇关于反爬虫的文章在淘宝上都能得到验证,这两篇文章分别是《selenium的封杀与突破,记录一次出师未捷身先死,淘宝、美团对爬虫的深入打击》、《Python爬虫中深不可测的ua参数,爬虫的身份证》,如果对浏览器指纹或者访客身份标示概念不清楚的可以先看这两篇文章。

总体上淘宝的反爬虫思路是:基于用户身份的ua算法,来识别浏览器是正常状态还是非正常状态,我们下面来说具体的方案。

当我们在淘宝登陆页面输完用户名,还未输入密码时会发送一个post请求。

这个post请求中有一个关键信息ua,至于ua怎么生成目前还未分析出,他的出处在z在全局对象window[UA_Opt.LogVal]、或者window["_n"],并且每次输出都不一样。

浏览器window对象,他是出于一个私有属性_n,但是怎么做到每次输出的值都不一样的,这是疑问一。

这个在输完用户名后的post请求有什么用?这个请求决定了是否会出现滑块验证,我们看它的响应内容:

needcode是需要验证或者不需要验证,在webdriver打开的浏览器中这个返回值一定是True,也就是一定要验证,但是他还不是淘宝拒绝一切selenium验证的标准,继续向下。

继续向下,当返回needcode是True时候淘宝出现滑块验证,那我们看滑块验证的请求:

其中有个t参数,t参数就是ua,也就是在验证滑块是否正确的时候淘宝后台还会对ua验证一番,检验是否为正确的标识,一切selenium打开的浏览器里面'browser': {'ie': False, 'chrome': True, 'webdriver': True},当然webdriver是比较关键的参考标准,除此还有几十个其他异于正常浏览器的属性,很明显这些信息被加密在ua参数之中。

淘宝后台在收到滑块验证信息的时候,会同时对ua经行验证,所有含有webdriver=True的验证都会被返回code=300

现在我们大致就清楚了淘宝对selenium的检测:通过本地的js算法生成ua,ua里面含有浏览器信息,甚至含有当前地址,当输入完账号后会把账号和ua一起post给服务器,服务器解析ua后通过智能算法识别是否是常用登陆地、常用浏览器、环境有无异常,selenium打开的浏览器是异常浏览器,一定返回滑块验证,当完成验证后会再把ua和滑动的轨迹发给后台,后台在检测ua,一旦含有异常信息就返回code=300,验证失败。

目前ua的生成还没找到,但是他有几个特点:

每次发送的ua都不一样

ua的长度会随着使用次数的增加越来越长。

目前分析到这里,在分析中ua生成没找到,倒是把密码的加密方式找到了,RSA加密。后面的分析还会继续,欢迎探讨。

优点:递增性,缺点:分散性和不确定性。

在大家购物的时候,退回的物品原因各种各样,其中产生的时间,地点、数量等都是比较难预见的。一些回流物品,对消费者无价值,但是通过逆向物流系统处理后,又会变成二手产品、零件或者生产的原材料,获得了再生的价值,逆向物流又具有价值的递增性。

逆向物流按成因、途径和处置方式的不同,分为投诉退货、终端使用退回、商业退回、维修退回、生产报废与副品,以及包装等6大类别。

// ==UserScript==

// @name         JD

// @namespace    http://tampermonkey.net/

// @version      0.1

// @description  try to take over the world!

// @author       You

// @match        https://item.jd.com/*

// @grant        none

// ==/UserScript==

/* jshint -W097 */

'use strict'

// Your code here...

var divObj=document.createElement("input") 

divObj.type="button"

divObj.value='获取抓取内容' 

divObj.style.marginTop="20px"

divObj.style.marginBottom="20px"

divObj.style.marginLeft="50px"

var first=document.body.firstChild

document.body.insertBefore(divObj,first)

var result={}

divObj.onclick=function(){

    //获取价格

    if(document.getElementById("jd-price")){

        var priceDiv=document.getElementById("jd-price")

        var price = priceDiv.innerText

        price = price.substr(1)

    }else if(document.getElementById("price")){

        var pricePri=document.getElementById("price")

        var priceDiv=pricePri.firstElementChild

        var price = priceDiv.innerText

    }else if(document.getElementsByClassName("price")[0]){

        var priceClass=document.getElementsByClassName("price")

        var priceDiv=priceClass[0]

        var price = priceDiv.innerText

    }

    

    result.price=price

}