呓语 | 杨英明的个人博客

专注于c++、Python,欢迎交流

By

readfree.me 自动签到脚本获取免费积分

前言

这又是一个 python 脚本,这次的目标是 readfree.me ,一个比较正规的 kindle 电子书资源站。这个网站做了限制,电子书需要积分才能下载,积分有两种获取方式:1.充会员 2.每天领免费积分。本着能免费就不掏腰包的革命原则,我自然而然的把目光瞄到了每天的免费积分上……

脚本目的:每天自动登录 readfree.me 进行签到 ---> 领取积分

另外推荐一个免费的 kindle 电子书网站:52kindle.top(这个网站经常挂,能否打开看运气)

分析过程

最一开始的思路是用 post 模拟登录网站,登陆之后再访问签到页面。

于是很开心的打开 chrome F12 分析登录流程,发现 post 的数据不仅有用户名和密码,还有验证码 和 csrf 验证。csrf 验证好说,在登录页面的源码中就能找到关键字。但是验证码不好整,找了一些自动识别验证码的库,比如 pytesser 什么的,但由于各种原因,失败。

遂不能使用以上思路,想了另一种办法:直接把登录之后的 cookie 复制到脚本中使用

回到刚刚 chrome 的登录路程分析中,在登陆成功之后,访问的第二个页面的 Request Headers 中,找到一个字段 Cookie

它的值大概是这种格式:

Hm_lvt_375aa6d601368176e50751c1c6bf0e82=1495876976; Hm_lpvt_375aa6d601368176e50751c1c6bf0e82=1496806049; sessionid=bo8x9rupjckoaxjk20igguxxxxxxxxxx; csrftoken=LOYvRkFdyosLgGXdabsETfwPp6XKpMEpzGIWd0ELByicRows4oqEnAxxxxxxxxxx

这就是登录之后服务器返回给当前用户所在客户端的 cookie,分析一下:

他一共有4个字段,sessionid、csrftoken、Hm_lvt_375aa6d601368176e50751c1c6bf0e82、Hm_lpvt_375aa6d601368176e50751c1c6bf0e82。其中 sessionid 最重要,它是代表当前客户端用户已经登录的唯一标识,和服务器端遥相呼应,有了它服务器才承认你在这个浏览器上登录过了。

有了cookie,我们就可以在脚本中使用它登录了!

具体的方法很简单,需要使用 Requests 库的 get 方法:

res = requests.get(check_url,cookies=cookie)

具体见完整源码。

另外关于 cookie 的过期时间,我们看一下登陆之后服务器返回的头部:

expires 代表 cookie 过期时间,这个属性有些过时。Max-Age 作为替代,代表cookie的生存期,以秒为单位。按照这个时间来计算,这个 cookie 可以用将近4年……这算它们网站设计的一个小bug…… 不过方便了我们,利用这个漏洞,不用频繁更新 cookie了。

脚本写好了剩下的就简单了,在 windows 的计划任务中设置成每天执行一次脚本(或者在linux 中设置 crontab),这样就做到了每天自动签到。

注意:通过网友 的提醒,发现现在 readfree.me 的 cookie 似乎做了修改,不再是那几个字段,如过发现其中没有时间相关的字段,那么直接复制 cookie 过来到代码中就行,时间相关字段部分无需我们再手动生成。

使用方法

1.从 chrome F12 中把登陆之后的 Cookie 复制到脚本中,具体方法是(熟手请忽略):

Chrome浏览器中打开网站 readfree.me ---> 按住F12调出调试页面 ---> 在调试页面最上方点击 Network 栏目 ---> 选中顶部第二行的 Preserve log ---> 回到登录页面填上你的用户名密码验证码进行登录 ---> 后面刷出一大堆信息,移动到最上方,点击第二行名字为 readfree.me 的请求 ---> 在右边弹出的 Headers 栏目的 Request Headers 条目中找到 Cookie 字段 ---> 将 Cookie 的值复制到脚本代码的 cookie_str 变量中

2.设置计划任务,每天执行一次脚本

代码

import requests
import time

# 登录验证地址
check_url = 'http://readfree.me/accounts/checkin'

# 记录程序运行时的时间
fp = open('auto_signon_readfree.log','a')
ISOTIMEFORMAT='%Y-%m-%d %X'
curtime = time.strftime( ISOTIMEFORMAT, time.localtime( time.time() ) )
print 'at %s'%curtime
fp.write('at %s\n'%curtime)

# 准备cookie
print '准备cookie中……'
fp.write('准备cookie中……\n')
cookie_str = 'Hm_lvt_375aa6d601368176e50751c1c6bf0e82=1495876976; Hm_lpvt_375aa6d601368176e50751c1c6bf0e82=%s; sessionid=bo8x9rupjckoaxjk20igguxxxxxxxxxx; csrftoken=LOYvRkFdyosLgGXdabsETfwPp6XKpMEpzGIWd0ELByicRows4oqEnAxxxxxxxxxx'%(int(time.time()))
cookie = {}
for line in cookie_str.split(';'):   
    name,value=line.strip().split('=',1)  
    cookie[name]=value  
print cookie
fp.write('%s\n'%cookie)

# 使用cookie访问网站
print '签到中……'
fp.write('签到中……\n')
res = requests.get(check_url,cookies=cookie)
print res
fp.write('%s\n\n'%res)

我把脚本放到云服务器上每天凌晨1点定时运行一次,测试了一个周效果如下:

这个脚本比上一个脚本要简单,但是却花费了一晚上的时间,因为要排除一些不可行的方法。不过到最后还是有缺点,那就是需要手动复制cookie到脚本中,这不够自动化,好在cookie可以一直使用,复制一次即可。

参考资料

Python爬虫-保存cookies,模拟登录的一些基础用法

python的requests在网络请求中添加cookies参数

python 的常用时间操作,取得当前时间等

cookie的expires属性和max-age属性

python脚本在Windows计划任务执行问题

原创声明

转载请注明:呓语 » readfree.me 自动签到脚本