• 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都是假动作)。

    待优化

    参考资料及注释

    感谢前辈们的详细总结

  • 相关阅读:
    DS博客作业--线性表
    c博客06-2019-结构体&文件
    C语言博客作业03--函数
    DS博客作业05--查找
    DS博客作业04--图
    DS博客作业03--树
    DS博客作业02--栈和队列
    DS博客作业2--线性表
    c博客06-结构体&文件
    C语言博客作业—2019-指针
  • 原文地址:https://www.cnblogs.com/warcraft/p/9856836.html
Copyright © 2020-2023  润新知