因为在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.

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

组合数据,模拟登陆

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

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

执行,看日志,跳转成功!开森!

还没测有验证码的,可能因为用浏览器成功登录一次就没了。试错几次又出来了验证码。



F5运行,输入验证码。Bingo! 一次过的感觉超级好。再回去刷新浏览器登录页,无验证码。

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

待优化

参考资料及注释

感谢前辈们的详细总结

Python模拟登陆TAPD的更多相关文章

  1. Python模拟登陆新浪微博

    上篇介绍了新浪微博的登陆过程,这节使用Python编写一个模拟登陆的程序.讲解与程序如下: 1.主函数(WeiboMain.py): import urllib2 import cookielib i ...

  2. Python模拟登陆万能法-微博|知乎

    Python模拟登陆让不少人伤透脑筋,今天奉上一种万能登陆方法.你无须精通HTML,甚至也无须精通Python,但却能让你成功的进行模拟登陆.本文讲的是登陆所有网站的一种方法,并不局限于微博与知乎,仅 ...

  3. Python模拟登陆淘宝并统计淘宝消费情况的代码实例分享

    Python模拟登陆淘宝并统计淘宝消费情况的代码实例分享 支付宝十年账单上的数字有点吓人,但它统计的项目太多,只是想看看到底单纯在淘宝上支出了多少,于是写了段脚本,统计任意时间段淘宝订单的消费情况,看 ...

  4. python 模拟登陆,请求包含cookie信息

    需求: 1.通过GET方法,访问URL地址一,传入cookie参数 2.根据地址一返回的uuid,通过POST方法,传入cooki参数 实现思路: 1.理解http的GET和POST差别 (网上有很多 ...

  5. python模拟登陆之下载

    好长时间没有更新博客了,哈哈. 今天公司给了这么一个需求,现在我们需要去淘宝获取上一天的订单号,然后再根据订单号去另一个接口去获取订单详情,然后再给我展示到web! 中间涉及到的技术点有: 模拟登陆 ...

  6. 使用python模拟登陆百度

    #!/usr/bin/python # -*- coding: utf- -*- """ Function: Used to demostrate how to use ...

  7. Python模拟登陆某网教师教育网

    本文转载自看雪论坛[作者]rdsnow 不得不说,最近的 Python 蛮火的,我也稍稍了解了下,并试着用 Python 爬取网站上的数据 不过有些数据是要登陆后才能获取的,我们每年都要到某教师教育网 ...

  8. python模拟登陆知乎并爬取数据

    一些废话 看了一眼上一篇日志的时间 已然是5个月前的事情了 不禁感叹光阴荏苒其实就是我懒 几周前心血来潮想到用爬虫爬些东西 于是先后先重写了以前写过的求绩点代码 爬了草榴贴图,妹子图网,后来想爬婚恋网 ...

  9. Python模拟登陆

    模拟人人登陆 #encoding=utf-8 import urllib2 import urllib import cookielib def renrenBrower(url,user,passw ...

随机推荐

  1. extern介绍

    存储类说明符extern.之前说过auto (auto int a:)extern的作用是:修饰变量/函数声明,表示是外部变量. e本身就是一个全局变量,所以在全局变量这个位置,加不加extern 都 ...

  2. angular2升级到angular4历程

    Angular 4 在昨天(2017-03-24)正式发布了,我的系列教程也得更新一下.步骤略繁琐,不用 cli 的项目反倒更简单一些,但是 cli 平时给我们的便利还是很多的,升级最多半年一次而已. ...

  3. Matlab_audiowrite_音频生成

    输出音频文件所需函数为 audiowrite .通过例程进行解释: % 生成时间序列 fs = 5000; % [Hz] 信号采样频率 T = 1; % [s] 信号长度 x = 0:1/fs:T; ...

  4. linux (centOS)安装jdk+tomcat+nginx

    一..安装jdk, 下载jdk有两种方式: 1.直接去官网找相应版本下载:http://www.oracle.com/technetwork/java/javase/downloads/index.h ...

  5. IC卡_状态码SW1、SW2

    9000 正常 成功执行 61xx 正常 需要发GET RESPONSE命令 6200 警告 信息未提供 6281 警告 回送数据可能出错 6282 警告 文件长度小于Le 6283 警告 选中的文件 ...

  6. 关于WebAPI跨域踩到的一点坑

    最近在尝试前后端分离的WebAPI+AngularJS方案,在率先处理授权的时候,踩到了一点WebAPI跨域的坑,其实严格意义上来说也不算是坑吧,只是我自己对WebAPI不熟悉而已,这里我与大家分享一 ...

  7. Python全栈之路----Python2与Python3

    金角大王Alex  python 之路,致那些年,我们依然没搞明白的编码 python2与python3的区别 py2 str = bytes 为什么有bytes? 是因为要表示图片.视频等二进制格式 ...

  8. echarts画饼环状饼图相关参数配置

    今天做页面的时候用到了环状饼图,大家都知道echarts的API文档看起来实在费劲,折腾了半天才画出来我想要的饼图,把我用到的参数配置分享给大家,希望能帮到和我一样的对echarts不是那么熟悉的童鞋 ...

  9. Visual Studio AI 离线模型训练(Windows10)

    一.序 环境搭建:[查看] samples-for-ai项目下载:[下载],两个版本,一个2018年6月15日前,一个2018年6月15日-16日版本(当前最新版本). 在环境搭建过程中,通过git ...

  10. Js高级 部分内容 面向对象

    1.单列模式 2.工厂模式 3.构造函数 (1)类 js天生自带的类 Object基类 Function  Array  String  Number  Math Date Boolean Regex ...