前段时间通过活动获得了pptv3一个月的会员,有会员偶尔看动画,收费电影还是不错的,避免了广告的干扰,pptv你也可以通过积分兑换会员,每天登录获得积分。为了避免每天复杂的登录,你写了一个脚本来登录,并将登录任务交给计算机。
脚本很简单,使用python3编写,requests库进行网络请求操作。
要实现登录,首先要实现登录,登录后才能获得用户的凭证,然后chrome中打开pptv并通过浏览器的开发者工具登录(F12)记录浏览器发送的请求。
点击登录后可以看到方向https://passport.pptv.com/v3/login/login.do这个地址发送了一次get请求可以判断这是pptv因为pptv使用的是get请求,很容易request url部分内容 ** 过来,在浏览器的地址栏中输入这个地址,得到请求返回的内容。
登录返回两个重要参数:username和token,token和cookie是最常见的登录信息,具体使用cookie或是token,需要分析签到http请求,前面的jQuery18307559810754289582_1483115348288有什么作用?for ** t参数为jsonp,这是jsonp使用的常见格式jsonp估计是为了实现跨域资源访问,也解释了为什么登录使用get请求不是常用的post,试试,试试jsonp改为json同样可以正常实现登录,而且返回的是标准的json登录时只需要数据for ** t、username、password通过脚本模拟登录三个参数。
import requestslogin_url = 'https://passport.pptv.com/v3/login/login.do'# 请求参数login_params = 'for ** t': 'jsonp', 'username': 'your name or e ** il', 'password': 'your password'}# 构造一个get请求resp = requests.get(login_url,login_params)# 获取用户信息并分析成字典user_info = resp.json()['result']登录信息已获得,下一步是分析签到http使用相同的方法获得签到触发的请求:http://api.usergrowth.pptv.com/doDailyPcard
请求携带username、token、from、for ** t等待参数,但也有index、add_str目前还不清楚这两个参数是从哪里来的,暂时认为这两个参数不需要,通过一些参数来要求,知道username、token、for ** t、version、from、index、addstr这些参数是必要的,现在username、token登录后即可获得,for ** t、version参数直接 ** 过来,试试for ** t参数值也可以设置为json,这样返回很容易处理json数据,index、addstr为了知道,两个参数不能随意填写index、addstr通过chrome开发者工具分析html源码。
可见触发docard该方法在浏览器中签到console中输入docard您可以查看该方法的源代码,并获得以下代码:
window.docard = function()()(){ var index = ""; for (var i = 0; i < 6; i { var nu = Math.floor(Math.random() * 10); if (nu == 0){ nu = 1; index = nu; var doDailyPcardurl = "http://api.usergrowth.pptv.com/doDailyPcard?username=" mylogin.username "&from=web&version=unknown&index=" index "&addstr=" md5.hex_md5(encodeURIComponent(mylogin.username "$DAILY_PCARD$" index)) "&for ** t=jsonp&cb=?&token=" mylogin.token; $.getJSON(doDailyPcardurl,function(data) if (data["flag"] == "0") var getJifen = data["result"]["obtainAward"]. ** tch(/d /)[0]; $(".id-center-ui-getnum").html(" " getJifen); $("#nosign").hide(); $("#signed").fadeIn(); $(".id-center-ui-getnum").ani ** te({ "opacity": "1", "top": "0px" }); } else { console.log("dakashibai"); } }); }可以看到index事实上,由随机六位数组成的字符串
addstr=" md5.hex_md5(encodeURIComponent(mylogin.username "$DAILY_PCARD$" index))addstr是通过hex_md5编码后的字符串是网站上常用的验证方法。将特定信息与随机数合并编码一次,可以避免敏感信息泄露。似乎是在脚本中构建一个index和对应的addstr只有这样,我才能正常发起请求,机智地直接发起请求。index、addstr因为index代码如下:
import urllib.parsesigned_url = 'http://api.usergrowth.pptv.com/doDailyPcard'# 因为之前回来了token其实是经过url编码后端token,所以需要先解码signed_params = { 'username': user_info['username'], 'token': urllib.parse.unquote(user_info['token']), 'for ** t': 'jsonp', 'from': 'client', 'version': 'unknown', 'index': 75 ** 29, 'addstr': 'e68e5a53b9467f4a739f009c6e351de1'}signed_resp = requests.get(signed_url,signed_params)到目前为止,签到的脚本已经完成。
脚本自动执行:
为实现自动签到,需要在系统中注册定时任务,让签到脚本每天运行,*nix可用于系统crontab控制脚本的执行和使用crontab -e对crontab编辑配置文件。
# For example,you can run a backup of all your user accounts# at 5 a.m every week with:# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/## For more infor ** tion see the ** nual pages of crontab(5) and cron(8)## m h dom mon dow com ** nd# 设定每天晚上9点执行签到# /usr/bin/python 根据安装情况python如果使用虚拟环境,则根据相应的路径填写python0 21 路径填充* * * /user/bin/python /path/to/your/script配置后,在终端输入crontab -l 验证是否正确添加到定时任务中,使系统每天执行登录脚本,实现每天定期登录,前提是系统此时运行,一般将程序放在vps或者支持openwrt路由器等系统7*24在小时运行的机器上,如果需要每天启动系统,可以在启动或登录时设置脚本进行执行windows可以通过计划任务程序的图形化来配置。
很久没写文章了,随便写,没有技术含量。源代码地址
扫码咨询与免费使用
立即获取免费试用
立即咨询