pylogin系列之搞定百度统计

加速会  •  扫码分享
我是创始人李岩:很抱歉!给自己产品做个广告,点击进来看看。  

概述

这次分析的百度统计登录接口,算是这几个中最简单的了。

但是学到了一个新东西,叫做js模板,搞web的同学应该知道,我这种web半吊子第一次见,非常有意思。

工具:

1. chrome/firefox2. f12,network3. python:requests、re

登录接口

打开百度统计首页 https://tongji.baidu.com/web/welcome/login ,点开登录框,f12。尝试输入之后,查看发送的数据。

Request URL:https://cas.baidu.com/?action=loginRequest Method:POSTStatus Code:200 OKappscope[]:6appscope[]:7appscope[]:12appid:12entered_login:anhkgg //名字entered_password:1111111111111111 //密码entered_imagecode:9mxm //验证码charset:utf-8fromu:https://tongji.baidu.com/web/welcome/loginbackselfu:https://tongji.baidu.com/web/welcome/loginsenderr:1

除了上面注释的需要输入的三个字段,其他字段意义都不明确,偷点懒,多次尝试后发现其他字段不会变化,那么就用固定值了。

点击验证码,看到网络,拿到获取验证码的请求,key使用10位时间戳。

GET https://cas.baidu.com/?action=image&key=1503151305

所以登录接口就出来了, vcode 需要人工输入。

url = 'https://cas.baidu.com/?action=image&key='   time_stamp(10)r = self.s.get(url)payload = {'appscope[]':6,'appscope[]':7,'appscope[]':12,'appid':12,'entered_login':name,'entered_password':pwd,'entered_imagecode':vcode,'charset':'utf-8','fromu':'https://tongji.baidu.com/web/welcome/loginback','selfu':'https://tongji.baidu.com/web/welcome/login','senderr':1,}url = 'https://cas.baidu.com/?action=login'r = self.s.post(url, data = payload)

接着看看登录返回状态,如果失败了,返回数据中包含如下数据:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta http-equiv="ReFresh" content="0; url=https://tongji.baidu.com/web/welcome/login?fromu=https://tongji.baidu.com/web/welcome/loginback&e=用户名密码错误&un=anhkgg&aid=12&errno=132" /><title>正在处理...</title></head><body><script>var url="https://tongji.baidu.com/web/welcome/login?fromu=https://tongji.baidu.com/web/welcome/loginback&e=用户名密码错误&un=anhkgg&aid=12&errno=132";location.href=url;</script></body></html>

然后浏览器加载该url,显示错误提示信息

Request URL:https://tongji.baidu.com/web/welcome/login?fromu=https://tongji.baidu.com/web/welcome/loginback&e=用户名密码错误&un=anhkgg&aid=12&errno=132Request Method:GETfromu:https://tongji.baidu.com/web/welcome/loginbacke:用户名密码错误un:anhkggaid:12errno:132

其中 e 是错误提示信息,errno是错误号。

登录成功返回数据如下,没有 e 错误信息。

<script>var url="http://cas.baidu.com/?action=check&appid=12&u=https://tongji.baidu.com/web/welcome/loginback?castk=c4086gh7e82166251d451&fromLogin=1";location.href=url;</script>

那么就可以先通过正则拿到url,通过搜索url是否有 e 判断是否登录成功,并且拿到提示信息。成功则继续访问该url跳转到成功页面,获取其他需要的信息。

pattern = re.compile(r'var url="(.*?)";')cont = re.search(pattern, r.content)url = cont.group(1)pattern = re.compile(r'e=(.*?)&un=')cont = re.search(pattern, url)if cont != None:r = urllib.unquote(cont.group(1)) #失败return utf2gbk(r)r = self.s.get(url) # 成功

js模板

这里比较意思的是使用的js模板来生成登录表单。

具体js模板使用看 这里 。

<script id="LoginTemplate" type="text/template"><div id="LoginContainer" class="login-dialog"><div id="TopTmp"> </div>if (this.isIco == 1) {<div id="LoginMain" class="ico-login clearfix"><div class="visitor-login-tab" id="LoginTab">请输入查看密码</div><div id="LoginInput" class="login-input">if (this.errMsg) {<div id="ErrorTip" class="error">#{this.errMsg}</div>}...</div></div>}else {<div id="LoginMain" class="login-main"><form method="post" action="#{this.loginAction}"><input type="hidden" value="12" id="Appid" name="appid">...<input type="hidden" value="#{this.selfUrl}" name="selfu" /><input type="hidden" value="1" name="senderr" /></form></div></div>}</div><div class="dialog-bottom-bg"></div></script>

从上面代码中可以看到,某些标签的值使用了 #{this.xxx} 这样的语法,不是直接填入的具体内容,更加灵活,扩展更容易。

然后在点击登录按钮之后,通过函数格式化一个全局定义的变量来生成的登录表单。具体如下:

//全局数据,用于替换表单中的this.xxx<script type="text/javascript">VAR = {webMasterRegister: "https://tongji.baidu.com/web/register",customRegister: "https://u.baidu.com/ucweb/?module=Reguser&controller=reg&action=index&appid=3",union_forget: "http://union.baidu.com/findPassword!input.action",shifen_forget: "https://aq.baidu.com/new/#/findpwd",uc_forget: "https://aq.baidu.com/new/#/findpwd",waiting_img_src: "/web/img/loadingImage.gif",app_id: "0",errMsg: "",loginUrl: "/web/welcome/login",loginAction: "https://cas.baidu.com/?action=login",userName: "",authCode: "https://cas.baidu.com/?action=image&key=1503151305",registerUrl: "/web/register",fromUrl: "https://tongji.baidu.com/web/welcome/loginback",selfUrl: "https://tongji.baidu.com/web/welcome/login",isIco: "0",webmasterUserNum: "2097176",customerUserNum: "2270927",mtjUserNum: "2262130"};</script>

然后在login.js中,通过下面的函数来初始化表单,并且显示。

其中 n.format("LoginTemplate", VAR) 用于格式化VAR定义的数据到表单的数据中。

, h = function() {var e = t(".login-trigger").eq(0);e.on("click", function() {s || (s = new i({width: 345,isModal: !0,titleText: "",isSingle: !0,content: n.format("LoginTemplate", VAR) //初始化登录表单数据}),loginController.init()),s.show()});

而在format具体如何替换的,就随意实现了,这里就不在具体分析,有兴趣跟着分析的同学可以去看看common.js中的代码。

总结

百度统计接口非常简单,密码未做变换,使用https。

登录之后具体做什么也不在分析。

预告下次做百度主站的登录分析,简单看了下,非常…复杂!

另外安利一下微信公众号:汉客儿,和专栏同步更新。

另外预告后面会做Rootkit系列文章,敬请关注!

转载请注明出处,博客原文: https://anhkgg.github.io/pylogin-baidutongji-login-analyze/



随意打赏

百度统计
提交建议
微信扫一扫,分享给好友吧。