菜单

哪些选用Python的Requests包达成模拟登陆

2019年3月25日 - 皇家赌场系统

image

调用后端接口

5.3.login2

{
    "code": 0,
    "data": {
        "count": 6,
        "items": [{
            "id": 2,
            "name": "王工",
            "sex": 1,
            "logo": null,
            "token": "c9xpghlmgxn58kdq",
            "group_id": 1
        }]
    }
}

name 用户名
sex 性别,1男 0女
logo 用户头像,null大概头像url
token
认证令牌,在不能保险session的情形下,在恳求其余接口中应该将token参数带入
group_id 用户所属的用户组

因此,大家的代码逻辑就有了。首先请求一回登录页面。然后分析页面,获得csrf字符串。最终把这么些字符串和账号密码一起传给服务器用来报到。

图片 1

function get_pwd_hash(pwd){
    var salt = ‘hbuilder’; 
//此处的salt是为了幸免黑客撞库,而在md5在此以前对初稿做肯定的变形,可以设为自己喜欢的,只要和服务器验证时的salt一致即可。
    return md5(salt + pwd);
//此处假使你曾经引用了md5相关的库,比如github上的JavaScript-MD5
}

5.2.login1

{
    "code": 0,
    "data": {
        "count": 1,
        "items": [
            {
                "id": 37,
                "chcode": "9luqgrnj5vvszmjw"
            }
        ]
    }
}

id session识别号,用于login2接口,原样传递给login2即可。
chcode
挑衅字符串,客户端按约定规则使用该字符串生成二个hash值,然后调用login2接口。

水到渠成收获登陆后的页面

****[password:xxxxxxxx];{“csrf_param”:”H/DyWxogz7+2y4UfzhqddowkjH1uL04″,”csrf_token”:”MorgBb0+PNpoE8KhwBwq4OoioD2NcCs”,”errorCategory”:”ok”,”level”:2,”IsWizard”:true,”IsFirst”:true}

兑现登录后的session有三种艺术?
APP当浏览器用,直接载入远程页面

4.查询播放地址

#!/usr/bin/env python2.7
# -*- coding: utf-8 -*-

import requests
import re

# 头部信息
headers = {
 'Host':"localhost",
 'Accept-Language':"zh-CN,zh;q=0.8",
 'Accept-Encoding':"gzip, deflate",
 'Content-Type':"application/x-www-form-urlencoded",
 'Connection':"keep-alive",
 'Referer':"http://localhost/login",
 'User-Agent':"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36"
}

# 登陆方法
def login(url,csrf,r_session):
 data = {
 "_csrf" : csrf,
 "username": "xiedj",
 "password": "***"
 }

 response = r_session.post(url, data=data, headers=headers)
 return response.content


# 第一次访问获取csrf值
def get_login_web(url):
 r_session = requests.Session()
 page = r_session.get('http://localhost/login')
 reg = r'<meta name="csrf-token" content="(.+)">'
 csrf = re.findall(reg,page.content)[0]


 login_page = login(url,csrf,r_session)
 print login_page


if __name__ == "__main__":
 url = "http://localhost/login/checklogin"
 get_login_web(url)

图片 2

var onError = function(errcode){
    switch(errcode){
    case ‘INCORRECT_PASSWORD’:
        mui.toast(‘密码不正确’);
        break;
    case ‘USER_NOT_EXISTS’:
        mui.toast(‘用户并未注册’);
        break;
    }
}

1.概述

再反复肯定获得的csrf和呼吁登录的csrf字符串没问题精通后,小编想到了一个标题。
只要,大家还不领悟不当原因来说,这里能够暂停思考三个题材。“服务器怎样掌握,第②遍呼吁获取csrf和第③遍post登录请求是同一个用户?”

image

还记得刚才APP向服务器请求token时,能够进入的用户音讯吗?比如用户的配备deviceid。
一经大家在调用接口时,还附带二个当下日子戳参数timestamp,同时,用deviceid和这一个小时戳再生成一个参数sign,比如
md5(deviceid timestamp
token)那样的情势。而服务端首先验证一下参数中的时间戳与眼下服务器时间是或不是一律(误差保持在创建限定内即可,比如肆分钟),然后依照用户保存在服务器中的deviceid来对参数中的时间戳举办相同的变形,验证是或不是合营,那便自然“更更安全”了。
tips:倘诺对总体调用请求中的参数实行排序,再以deviceid和timestamp加上排序后的参数来对全部调用生成一个sign,黑客正是截获sign,不相同的时间点、参数请求所利用的sign也是例外的,难以伪造,自然会更安全。当然,写起来也更麻烦。
tips:领会了规律,整个验证进程是能够依照本人的须要改造的。

1.4.重回音信结构

回去的json消息数据结构具有从严的一致性,客户端能够运用同一的收受和分析方法处理回来音讯。
不难易行音讯
简言之的回来音讯包括对请求的处理结果,结构如下:

{
    "code":0,
    "err_desc":""
}

其中:
code 为0象征处理成功,别的值表示处理失利。
err_desc是对不当的描述,在code为0时err_desc会被容易。
新鲜意况,在用户认证的login1和login2接口中,err_desc具有特种用途用法,具体参见接口描述。除那多个接口之外,err_desc都代表错误描述。
带业务数据的音讯
一对再次来到讯息除了含有处理结果音讯,还富含业务数据记录集,结构如下:

 {
        "code":0,
        "data":{
            "count":1,
            "items":[...]
        }
    }

其中:
data 业务数据的根节点:
count 业务数据的条数,恐怕的值为0 ~ n
items
业务数据,是二个数组,数据条数由count属性定义。当count为0时,items属性大概为null或然不设有。
本文书档案后续章节中,在描述items成分的习性时,会简单一些质量的描述,即事实上调用接口重回的属性在本文书档案中或者会没有描述,那种处境下请直接忽略被忽略描述的属性值。本文书档案中描述的性质是实际上重回内容的二个子集,没有描述到的始末对集花费系统没有影响。
带分页数据的音讯
一经回去数据较多,服务器会对回到的数据开始展览分页,客户端能够根据页码请求钦定范围的数量。带分页消息的回到数据结构如下:

    {
    "code":0,
    "data":{
        "page":1,
        "page_size":"20",
        "pages":"1",
        "total":"2",
        "count":2,
        "items":[...]
                }
}

分页数据音讯在data成分下,意义如下:
page 当前页码
page_size 每页数据记录条数
pages 总共的页数
total 总数据条数
count 当前回去页的多寡条数
万二回去的数量带有分页新闻,则能够在调用接口时使用page参数来呼吁钦点页码的数额。

图片 3

image

//清除登录音讯
UserInfo.clear = function(){
    plus.storage.removeItem(‘username’);
    plus.storage.removeItem(‘password’);
    plus.storage.removeItem(‘token’);
}

5.登录验证

你大概感兴趣的稿子:

[password:aaaaaaaa];{“errorCategory”:”Three_time_err”,”csrf_param”:”VKGTylVILQA9SFsTyYdpkHv8qfJPIIw”,”count”:3,”csrf_token”:”MTQLBcWQN+1DJjAP+A6xC4AUSXciBod”}

你是还是不是真正需求登录效能?
把这些标题放在最前方并不是灌水,而是真的见过很多并不要求登录的APP去做了登录作用,可能是并不需求强制登录的APP把登录作为运转页。
用户对您的APP一窍不通,你就须要对方注册并报到,除非APP本人已经很有信誉大概是用户有强须求,不然平常人应有会直接把它删掉。
正如温和的形式是将某些并不须要登录,但能够给用户带来帮衬的东西,第权且间呈现给他们,让她们发生兴趣,再在相当的机遇教导他们注册(比如动用供给接纳更高级的功用,或用户须求收藏有个别喜欢的消息时)。

1.3.接口请求

接口地址是三个HTTP协议的url地址,具体格式是:

ip替换来实际服务器的ip或域名,若是端口不是暗中认可端口,供给把端口加上。
token是验证字符串,在报到接口中赢得,假如没有登录则省略。
任何剧情参见接口的定义。
当U兰德PAJEROL请求参数值中包涵UMuranoL地址保留字符时,应对参数值实行U翼虎L编码。
实际参见“奥德赛FC2396: Uniform Resource Identifiers (UEnclaveI): Generic
Syntax”。
当呼吁参数包罗粤语字符时,应对汉语字符采取UTF-8编码。

所以大家的代码,要求在首先次呼吁的时候获得这些sessionID。第一回呼吁的时候把那些sessionID一起传过去。而requests厉害的地点正是,一句简单requests.Session(),就能利用这么些会话对象。

图片 4

var onSuccess = function(data){
    UserInfo.username(username);
    UserInfo.password(pwd_hash);
    UserInfo.token(data.token); //把获取到的token保存到storage中
    var wc = plus.webview.currentWebview();
    wc.hide(‘slide-out-bottom’);   
//此处假使是隐藏登录页回到从前的页面,实际你也足以干点儿其余
}

5.1.断定是还是不是必须登录

请求

{
    "code": 0,
    "err_desc": "no"
}

err_desc 属性描述了对登录的渴求。no 代表不强制要求, yes
表示必须须要登录。

以上正是本文的全部内容,希望对大家的上学抱有扶助,也期望大家多多帮助脚本之家。

image

登录和挂号要丰盛简单
那是纤维手机端,用再好的输入法,打字也是不方便人民群众的,所以别把登录页设计得必要填很多事物。假使有可能的话,只填手提式无线电话机号,让用户收到短信验证码就到位注册是极致不过的了。想获得越多消息?想想大商厦的APP是如何是好的,他们会报告用户,以后的个人资料完善程度是十分之三,借使想获取更加多积分,你须要填完。
tips:假诺你想昭示在Appstore并且同时含有注册功用,那么注册页面必须做叁个用户许可协议的链接,不然有大概通可是审核。

4.1.查询播放地址

{
    "code": 0,
    "data": {
        "count": 1,
        "items": [
            {
                "id": 104,
                "resource_id": 39,
                "web_url": "/mp4/vod/yellowstone/yellowstone.mp4",
                "web_io_protocol": "http-mp4",
                "add_time": "2017-08-25 16:35:16"
            }
        ]
    }
}

再次回到0个或四个广播地址,2个财富可能有多少个例外协商的播放地址。
resource_id 能源编号
web_url 播出地址
“web_io_protocol 播出协议

爬虫的不可或缺第①步,分析指标网站。那里运用谷歌浏览器的开发者者工具分析。

图片 5

;function UserInfo(){
};

3.1.查询媒体财富

{
    "code": 0,
    "data": {
        "page": 1,
        "page_size": "20",
        "pages": 9,
        "total": "18",
        "count": 2,
        "items": [
            {
                "id": 79,
                "catalog_id": 2,
                "title": "vod - 8898",
                "sub_title": "G3视频",
                "abstract": null,
                "text": null,
                "resource_type": "vod",
                "cover": "/mserver/cms/covers/res_cover_79.jpg?1515729601",
                "duration": 98,
                "add_time": "2018-01-08 19:19:26",
                "view_times": 0,
                "open_status": 0
            },
            ...
        ]
    }
}

再次来到0个或八个财富消息。
id 能源编号
catalog_id 所属分类编号
title 标题
sub_title 小标题
abstract 摘要描述
text 描述
resource_type vod或live
cover 封面地址
duration 播放时间长度
add_time 添加时间
view_times 观望次数
open_status 开放景况

到那,应该都精晓了,即使要登录成功,要求化解什么让服务相信三回呼吁是同3个用户。那里须求使用http会话(不通晓的能够活动百度,那里大致介绍)。

核心Python代码:

登录 保存密码 安全 加密
不久前意识群内大伙对用Hbuilder做的APP怎么办登录功能以及维护登录状态十二分纳闷,而自身前一段时间正好稍微商讨了瞬间,所以把本人清楚的报告咱们,节约大家找找资料的时刻。

2.查询分类

注明:因为模仿登陆的是自笔者的村办网站,所以以下代码对个体网站和账号密码做了拍卖。

从地点抓包的结果来看,Password字段是透过加密的,所以只要大家要Python暴力破解,供给把那么些password的变型算法找出来。

程序员总能给本身找到偷懒的不二法门,有的程序为了省事,会在用户登录后,直接把用户名和密码保存在地面,然后每回调用后端接口时作为参数字传送递。真省事儿啊!可那种格局不难易行就好像拿着一兜子钱在中途边走边喊“快来抢笔者啊!快来抢作者哟!”,五个纤维的嗅探器就能把用户的密码获得手,若是用户习惯在有着地点用三个密码,那么您闯大祸了,黑客通过撞库的措施能把用户的富有消息一锅端。

3.查询媒体能源

由代码能够通晓,requests.Session()运营会话对象后,首次呼吁会活动把上贰次的sessionID一起传过去。

拥有的数额都准备好了,下一步,正是从头选用Python写程序了。

那种气象是成都百货上千偷懒的程序员也许傻X的CEO娘选用的主意,因为做起来其实太快。借使本人网站是响应式布局,那么很有大概不供给做什么变动,就即使在开发时打初始页就好了,那样Hybird的APP外壳就纯粹成为了3个浏览器。
但比起这么做带来的浩大捷笔来,开发速度快的独到之处差不离能够忽略不计。
先是,在网络环境不好时,纯大白页,用户体验0;
下一场,CSS和JS等能源不在本地,供给长途载入,假使运用了bootstrap之类的框架,那用户为了开一下APP而消耗的流量真是让人感动;
再然后,网页里常用的jquery,在手提式有线电电话机的webview里速度并适得其反,而只假设非ajax的网页那就更烦躁了,每一遍操作都要跳转和页面渲染,要令人把它当成APP那实在是笑话。
再再然后,那样的所谓APP,要通过Appstore的稽核,那是美好的梦的(除非审核员当天闹肚子严重,拿着纸巾奔向厕所前误点了通过……),苹果的渴求是,那得是APP,而不可能是有个别网站做成APP的榜样,那样的图景适合做Web
APP。而据小编所知,国内多少个较大的Android市镇,那样的APP也是无能为力透过查处的。

2.1.询问分类

{
    "code": 0,
    "data": {
        "count": 2,
        "items": [
            {
                "id": 1,
                "name": "公共栏目",
                "comment": "",
                "upper_catalog_id": 0
            },
            {
                "id": 2,
                "name": "私有栏目",
                "comment": "",
                "upper_catalog_id": 0
            }
        ]
    }
}

id 编号
name 名称
comment 备注
“upper_catalog_id 上级分类编号, 0 表示最近分类是一流分类。

网站分析

image

//这里如果你曾经通过DOM操作获取到了用户名和密码,分别保存在username和password变量中。
var username = xxx;
var password = xxx;
var pwd_hash = get_pwd_hash(password);

1.2.通讯协商

客户端和服务器通过HTTP协议通讯,客户端应用HTTP
Get向服务器发送请求,服务器重临json格式的政工数据或操作结果给客户端。

先是份代码

剖析进程

刚刚的格局,机智一点儿的读者大致会心存疑虑:那获取token时不还是得明白传输1回密码吗?
是的,你能够将以此得到token的地点,用SSL来保安(比如),那样黑客正是截了包,近期半会儿也解不出什么音信。
SSL证书的取得渠道很多,笔者相信您总有艺术查到,所以不赘述了。可是话说namecheap上的SSL证书比godaddy的要有利得多……(这是吐槽)
tips:前段时间OpenSSL漏洞让洋洋服务器遭殃,所以只要自个儿搭服务器,一定记得装补丁。
tips:能够把全部接口都弄成SSL的吗?能够。但会拖慢服务器,尽管是布局并不自信的VPS,建议不折腾。

5.4.logout

{
    "code": 0,
}
#!/usr/bin/env python2.7
# -*- coding: utf-8 -*-

import requests
import re

# 头部信息
headers = {
 'Host':"localhost",
 'Accept-Language':"zh-CN,zh;q=0.8",
 'Accept-Encoding':"gzip, deflate",
 'Content-Type':"application/x-www-form-urlencoded",
 'Connection':"keep-alive",
 'Referer':"http://localhost/login",
 'User-Agent':"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36"
}

# 登陆方法
def login(url,csrf):
 data = {
 "_csrf" : csrf,
 "username": "xiedj",
 "password": "***"
 }

 response = requests.post(url, data=data, headers=headers)
 return response.content


# 第一次访问获取csrf值
def get_login_web(url):
 page = requests.get('http://localhost/login')
 reg = r'<meta name="csrf-token" content="(.+)">'
 csrf = re.findall(reg,page.content)[0]
 login_page = login(url,csrf)
 print login_page


if __name__ == "__main__":
 url = "http://localhost/login/checklogin"
 get_login_web(url)

ip地址被限制,需求等待1分钟的唤醒:

再插点代码,基于plus.storage的用户音讯类,注意:供给在plusReady之后再利用。

1.1.用途

向集成客户端提供查询数据和登录服务。
即使财富须求授权才能查看和接纳,请首先阅读“5.登录验证”小节。

后天试了一下,模拟登八人网站。发现也相比较简单。读懂本文须要对http协议和http会话有必然的通晓。

在庭院里面看到了3个没人用的路由器(ws860s),看起来像个黑科技(science and technology)的玩意儿,就想着进去看看,到底有啥样好玩的。看到前面的价签上有web界面包车型大巴地点,然后登陆进去看看,发现有密码,然后自个儿想,路由器的密码应该都以足以reset的,然后我就用笔戳那贰个reset键,奇迹没有发出,原来这一个reset键坏了。

if(UserInfo.has_login()){
    //打开需求出示给用户的页面,恐怕是调用远端接口
}
else{
    wv_login.show(‘slide-in-up’);   //从底层向上海滑稽剧团出登录页面
}
在登录页面中,用户输入了用户名和密码后,并点击了”登录“按钮,大家下一步做如何?再插段代码(注意:此处使用的是自我刚刚代码中增加的web_query函数,你也能够平昔运用mui的ajax):

概述

其次份代码

image

那是个很好的目前,因为随便后端你是用Java、PHP,还是node.js,都得以经过xml、json来和APP通信。遥想当年写服务端要团结写包结构,然后为了消除出现难题还折腾了7个月IOCP模型,真心觉得未来太甜蜜了。
把刚刚格外用APP当浏览器使的案例的全部缺点反过来看,正是这般做的优点,在优化完善的景色下体验接近原生,而且通信流量极少,通过各样审查批准也是妥妥的。
tips:通过plus对象中的XMLHttpRequest来Get、Post远程的后端接口,只怕应用Mui中封装好的AJAX相关函数。

2.2.查询分类树

{
    "code": 0,
    "data": {
        "count": 2,
        "items": [
            {
                "id": 1,
                "name": "公共栏目",
                "comment": "",
                "upper_catalog_id": 0,
                "sub_items": [
                                {
                                    "id": 5,
                                    "name": "二级分类1",
                                    "comment": "",
                                    "upper_catalog_id": 1
                                },
                                ...
                    ]
            },
            ...
        ]
    }
}

id 编号
name 名称
comment 备注
“upper_catalog_id 上级分类编号, 0 表示方今分门别类是超级分类。
sub_items 下级分类数组,包涵 0 或多少个下级分类。

透过登陆抓取,看到这般1个伸手。

抓包

//检查是还是不是已登录
UserInfo.has_login = function(){
    var username = UserInfo.username();
    var pwd = UserInfo.password();
    var token = UserInfo.token();
    if(!username || !pwd || !token){
        return false;
    }
    return true;
};

1.5.参考

[1] RFC 2616, Hypertext Transfer Protocol — HTTP/1.1[S].
[2] RFC 3986, Uniform Resource Identifier (URI): Generic
Syntax[S].
[3] Introducing JSON

http协议是3个种无状态的商业事务。为了使那种无状态变得有状态,因而引进了对话。简单的说,通过session去记录那几个情景。当叁个用户率先次呼吁web服务的时候,服务器会生成一个session,用于保存那几个用户的音讯。同时,在重回给用户端时,把那些sessionID保存在cookies里。当用户再2遍呼吁的时候,浏览器会把那一个cookies带上。因而在劳动器端就能知道数次呼吁是不是为同四个用户。

image

//检查是或不是含有自动登录的新闻
UserInfo.auto_login = function(){
    var username = UserInfo.username();
    var pwd = UserInfo.password();
    if(!username || !pwd){
        return false;
    }
    return true;
}

上面部分为请求头,上边部分为呼吁是传的参数。由图片能够见到,页面通过表单提交了多少个参数。分别为_csrf,usermane,password。

image

报到时呼吁三回token,之后用token调用接口

代码看起来好像从没什么样难题。可是执行的时候出错了。核对了弹指间,错误的缘由是,csrf验证战败!

image

UserInfo.username = function(){
    if(arguments.length == 0){
        return plus.storage.getItem(‘username’);
    }
    if(arguments[0] === ”){
        plus.storage.removeItem(‘username’);
        return;
    }
    plus.storage.setItem(‘username’, arguments[0]);
};

前段时间喜欢用python去抓一些页面玩,但都大约都以用get请求一些页面,再通过正则去过滤。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图