JAVA模拟淘宝、天猫登录

有时候需要对淘宝、天猫平台进行频繁操作,会触发平台风控,需要我们登陆之后才能进行操作,或者有些功能淘宝开放平台并没有提供api接口,只能通过人工登录进行操作,但是频繁的人工操作比较浪费时间。因此对于模拟登陆的需求也就随之而来。
网上很多关于淘宝、天猫模拟登陆的教程都是python写的,但是我对python语言了解不多,而且我们需要定制化的功能,因此最好是使用自己熟悉的语言去开发,因此本文的模拟是使用JAVA实现的,网上对于使用JAVA来实现淘宝、天猫的模拟并不多,而且没有详细的实现步骤,因此这里对我的实现步骤做个记录。
我们一般都是使用selenium来实现模拟,但是这些平台会检测当前环境是否为机器操作,如果识别是机器操作,那么在登录环节会出现验证码,即使通过了验证码还是提示刷新验证码,无法登陆。因此我们要做的就是绕过检测环节,而这也是最难的。
先说明开发环境:window10、JDK1.8、selenium、chrome84.0.4147.125、python3.7.3、mitmproxy5.2(虽然使用到了python,但是是很简单的功能,主要是配合mitmproxy实现response内容的修改,如果不想使用python,可以跳过python和mitmproxy,直接看最后的修订模块中的内容即可

  1. 新建JAVA项目,引入selenium依赖

    ```
    		
                org.seleniumhq.selenium
                selenium-api
                3.4.0
            
    ```
    
  2. 根据chrome浏览器的版本下载chrome driver,然后放到chrome的安装目录下,点击下载链接

  3. 下载mitmproxy,由于我开发环境是window,所以下载时选择window版本,点击下载链接
    在这里插入图片描述
    解压后就可以看到上面两个exe文件,mitmdump.exe和mitmweb.exe,两个功能是一样的,只是一个是命令行格式一个是浏览器格式,开发阶段建议选择浏览器模式,方便调试。

  4. 安装python环境,可以参考菜鸟教程

  5. python安装成功后,为python安装mitmproxy依赖(命令行执行:pip install mitmproxy)

  6. 新建py文件,写入下面的代码并保存xxx.py(TARGET_URL是一个js文件,版本是会更新的,使用时要结合当下进行修改),下一步会用到

    TARGET_URL = 'https://g.alicdn.com/secdev/sufei_data/3.9.0/index.js'
    INJECT_TEXT = 'Object.defineProperties(navigator,{webdriver:{get:() => undefined}});'
    
    
    def response(flow):
        if flow.request.url.startswith(TARGET_URL):
            flow.response.text = INJECT_TEXT + flow.response.text
            print('执行成功')
    
  7. 找到第3步中安装的mitmproxy,命令行方式启动mitmweb.exe(启动命令:mitmweb.exe -s path/xxx.py),启动成功后会自动在浏览器打开一个后台页面(默认无法监听https,需要按照https证书,可以在C:\Users\xxx\.mitmproxy下找到证书,双击安装即可)
    JAVA模拟淘宝、天猫登录_第1张图片
    JAVA模拟淘宝、天猫登录_第2张图片

  8. 然后结合selenium开始编写JAVA代码,然后运行代码,结果还是无法绕过平台验证,那如何绕过平台验证?这里我们还需要修改一处,找到我们第2步中安装的chrom driver,然后使用记事本打开,虽然是乱码也没有问题,找到一处$cdc_开头的字符串,然后随意修改cdc_后面的字符串,但是要保证字符串长度不变,然后保存,再去运行JAVA方法就可以绕过检测,实现登录。
    JAVA模拟淘宝、天猫登录_第3张图片
    以上流程完成后可是现实淘宝登录,但是我发现我在访问天猫时还是被拒绝,然后我发现很多HTTP2协议的请求都报错,因此我把HTTP2关闭,然后就可以模拟天猫登录
    JAVA模拟淘宝、天猫登录_第4张图片

至此,对于淘宝、天猫的模拟登陆已完成,整个流程的重点就是如何绕过前端检测,如果我们能够绕过前端检测,那么其余的操作也就容易得多。

-----------------------------------------------------------------修订--------------------------------------------------------------
上述流程虽然能够绕过平台检测,但是运行一段时间后发现上述python代码段会抛出“can not creat new thread”错误,开始以为是由于mitmproxy每次拦截一个请求都会创建一个新线程,导致内存耗尽而无法创建新的线程,所以就修改python代码,增加了打印thread,memory的代码,结果发现每次使用的线程都是同一个线程,并没有创建新的线程,而且每次内存都会增加,并不会释放。所以就猜测mitmproxy存在内存泄漏问题,于是就去github上去查看issue,发现不止我一个人遇到这个问题,而且issue上并没有给出解决方案。既然这样那就不使用mitmproxy,反正这里只是使用mitmproxy代理工具来修改response,能够事先这个功能的不止mitmproxy,于是我把mitmproxy换成了fiddler,然后通过fiddler的AutoResponder的功能来实现response的修改,同样能够实现mitmproxy的效果,并不会出现内存溢出的问题。
JAVA模拟淘宝、天猫登录_第5张图片

参考issue
Crash: Can’t create thread
mitmdump memory grows

你可能感兴趣的:(java,python,selenium,经验分享)