zoukankan      html  css  js  c++  java
  • Python模拟登陆TAPD

    因为在wiki中未找到需要的数据,查询也很迷,打算用python登录tapd抓取所需项目下的wiki数据,方便查找。
    2018-9-30 19:12:44

    几步走

    • 模拟登录tapd
    • 抓取wiki页左侧链接
    • 拿到每页markdown
    • 存储数据库

    模拟登录TAPD

    请求参数

    data[Login][ref]	https://www.tapd.cn/my_worktable?left_tree=1
    data[Login][encrypt_key]	GxYimlauXYHXtqflCRfP4MLxInPBlMJIfvw7D+vCxQE=
    data[Login][encrypt_iv]	M7IkutCvI9/jFyQc3owL+Q==
    data[Login][site]	TAPD
    data[Login][via]	encrypt_password
    data[Login][email]	xxxxx@vchangyi.com
    data[Login][password]	T0cbRTIoaM1z9ktIM6Wl2Q==
    data[Login][login]	login
    dsc_token	dDdgn7oC89YL6Waz
    

    变量

    data[Login][encrypt_key]	0royxaa8qvuNkffv0zGRpLKZg+80lBje4fEz876igzw=
    data[Login][encrypt_iv]	2ouJgjQ6j3jp4O5hFH6k4A==
    data[Login][password]	m6YLZH4DVzXjD/eLyVT/nQ==
    dsc_token	30CfdZ59sH3JIaNh
    

    dsc_token 通过 dsc+180208173064.js 生成,多次请求地址没有变化说明后面数字尾巴不是时间戳之类动态,试着获取一下dsc_token。

    获取 token

    tapd_dsc.gen_token_and_set_to_cookie()

    PyV8装不上,用execjs读取

    import execjs
     
    sign_js_path = "./dsc+180208173064.js"
     
    def get_js(path):
        f = open(path, 'r', encoding='UTF-8')  # 打开JS文件
        line = f.readline()
        html_str = ''
        while line:
            html_str = html_str + line
            line = f.readline()
        return html_str
     
    def load_sign_js(js_str):
        return execjs.compile(js_str)
    
    def writeFile(js):
        fo = open("dsc.js", "w")
        fo.write(js)
        fo.close()
     
    sign_js = load_sign_js(get_js(sign_js_path))
    writeFile(sign_js._source)
    print(sign_js.call('tapd_dsc.gen_token_and_set_to_cookie'))
    

    调用方法不成功,报错,写文件并用html测试,则是好的。调用姿势不对。
    提取函数放单独文件,改一下就好了。先这样

    获取encrypt

    轻车熟路在首页里找到了一串疑似生成encrypt的代码,拿出来封装一下

    function encrypt(password){
        var key = CryptoJS.MD5(Math.random() + '').toString();
        password = CryptoJS.AES.encrypt(password, key, {mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.ZeroPadding});
        password_encode = password.ciphertext.toString(CryptoJS.enc.Base64);
        //360记住密码在val的时候会有bug,导致登录不成功
        while($("#password_input").val() != password_encode){
            $("#password_input").val(password_encode);
        }
    
        $("#encrypt_iv").val(password.iv.toString(CryptoJS.enc.Base64));
        $("#encrypt_key").val(password.key.toString(CryptoJS.enc.Base64));
    }
    

    发现一个形似的
    Python3 模拟手机登录熊猫直播(panda.tv)
    我还是先用js直接搞。

    CryptoJS用的是

    aes+151112164124.js

    pad-zeropadding+151112164124.js

    开始重点的,用上面执行js的方法,执行这个试试。
    第一次报错缺少对象,加上返回后成功!太牛了。

    还缺少个必要的参数,password,相比上面那 password_encode 就是本尊了。返回加上,ok.
    此处是encyrpt html测试图片

    最紧张的时刻来临。到底数据加密的对不对呢?

    组合数据,模拟登陆

    找了一个登录的改了一下,发现没效果。Fiddler抓包时编辑器才报错SSL。为什么呢?

    强行忽略SSL,尝试登录了几次还不成功。发现有验证码了。真有意思。加上验证码处理之后又发现没有验证码了导致解析报错,加个异常处理。ok

    执行,看日志,跳转成功!开森!
    此处是日志图片

    还没测有验证码的,可能因为用浏览器成功登录一次就没了。试错几次又出来了验证码。
    此处是tapd 验证码页
    F5运行,输入验证码。Bingo! 一次过的感觉超级好。再回去刷新浏览器登录页,无验证码。
    此处是tapd无验证码页

    p.s. 还是想说破解的有点暴力,真没想到上面获取的token 和 encrypt 会有效很顺利(看来其他js都是假动作)。

    待优化

    参考资料及注释

    感谢前辈们的详细总结

  • 相关阅读:
    Day 20 初识面向对象
    Day 16 常用模块
    Day 15 正则表达式 re模块
    D14 模块 导入模块 开发目录规范
    Day 13 迭代器,生成器,内置函数
    Day 12 递归,二分算法,推导式,匿名函数
    Day 11 闭包函数.装饰器
    D10 函数(二) 嵌套,命名空间作用域
    D09 函数(一) 返回值,参数
    Day 07 Day08 字符编码与文件处理
  • 原文地址:https://www.cnblogs.com/warcraft/p/9856836.html
Copyright © 2011-2022 走看看