现在好多网站都有打卡或者领金币之类的功能。但素,那么多网站,肿么可能记着都要打卡~~而且,每个网站都要上去点几下超级花费时间的。恰好又有banana pro,就想着要不弄个脚本,记个定时任务,让打卡这件事自动化好了。
沪江是个棒棒哒的外语学习网站。就以其为目标好了~
整个思路是 1. 模拟用户登录 2. 打卡
是不是So easy~~ 妈妈再也不用怕我忘记打卡了
登录
准备工作
一般来说,网站的登录模式就是客户端发送一个请求,这个请求包含了用户的信息(用户名、密码之类的)。服务端会对这个请求进行校验鉴权,然后返回给客户端一个响应,告知客户端用户是否登录成功。因此,首先,要先分析客户端给服务器发送了一个神马样子的请求。打开chrome,F12,尝试用沪江账号登录,可以得到一个GET请求,见下图
这里要注意一下,“Perserver log”选项要勾上,否则跳转可能会将登录请求给刷新掉,这样我们就看不到了。
从Query String Parameters里面可以看到请求参数。这些请求参数有的看一眼基本可以确认传固定值,有的需要分析是怎么来的
token:暂时还不清楚这个是干嘛的
remeberdays:记住密码的天数,这里使用固定值14即可
callback:jQuery18308307662333827466_1443247777543
_:1443247800524
由于WEB知识基本小白,因此被callback和_这两个参数困扰了N久。看js代码也没找出来这两个参数是哪里来的。后来想想,这两个参数是不是标准的语法参数而与网站自身无关呢。跑到google上一查,果然。
"jsonp": 以 JSONP 的方式载入 JSON 数据块。会自动在所请求的URL最后添加"?callback=?"。默认情况下会通过在URL中附加查询字符串变量 ,_=[TIMESTAMP], 禁用缓存结果,除非设置了cache参数为true。
闹了半天,原来是个时间戳呀。后边验证发现callback的前半部分不重要,只要后面替换为当前时间即可。而“_”参数也是一个当前时间戳。
继续研究token参数。在上面的链接中并未出现用户名密码,那服务器是怎么知道哪个用户在做登录请求呢?在过滤器中输入用户名,发现有一个链接出现了用户名密码
查看这个链接的响应,发现了有个参数是ssotoken,这个响应参数的值恰好跟登录请求里面的token值一模一样!!Lucky~~
那么我们来看看这个链接的请求参数,其中callback参数和_参数我们有了上面的解析,很容易就可以得到
callback:jQuery18307904950501397252_1443237280922
account:用户名
password:密码,看起来像是一个MD5加密的字段,验证一下,果然真是
_:1443238132704
接着研究响应。在Preview中可以看到,当返回的code值为0时表示登录成功。此时,可以输几次错误的密码看看登录失败的code值。
开始写代码
1 | def __init__(self): |
打卡
准备工作
紧跟登录的思路。打卡也是客户端给服务器发请求。继续chrome, F12.点击打卡后,我们可以发现我们签到的时候发送了一个GET请求http://bulo.hujiang.com/app/api/ajax_take_card.ashx?0.5263887415640056。其中,0.5263887415640056这个值不重要,因此可以随便生成一个满足位数要求的随机数即可。
退出登录在发送一次上面的打卡请求,发现返回了["-1",""]。再次登录后再发送一次打卡请求,发现返回了["","406"]。总结得出,第一次打卡的时候列表的第一项是有值,且值为正。以打卡则此项值为空。
开始写代码
1 | #签到 |
碎碎念
完整代码在autoSignIn
其实研究自动登录自动打卡的模式大概是这样的 1. 研究客户端与服务端的交互。有时候没法直接看出链接或者请求参数是怎么来的,这个时候可以借助fiddler或者浏览器自带的调试工具。参数的话,实在没辙的情况下可以研究对应的js代码。一般对应于登录按钮的click事件。 2. 代码中尽可能的模仿真实用户的行为,欺骗服务器。
另外,前端知识很重要