设计基于HTML5的APP登录作用及平安调用接口的办法(原理篇)

② 、输入用户名密码后:

function get_pwd_hash(pwd){
    var salt = ‘hbuilder’; 
//此处的salt是为着制止黑客撞库,而在md5在此之前对原作做一定的变形,可以设为自身喜好的,只要和服务器验证时的salt一致即可。
    return md5(salt + pwd);
//此处要是你早就引用了md5相关的库,比如github上的JavaScript-MD5
}

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

明天试了一下,模拟登7人网站。发现也相比不难。读懂本文要求对http协议和http会话有一定的驾驭。

图片 1

插一段代码,笔者把mui的ajax又做了特其余卷入,对过期举办了全自动重试,而对invalid_token等状态也做相应处理:

1.概述

#!/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)

抓包

mui.web_query = function(func_url, params, onSuccess, onError,
retry){
    var onSuccess = arguments[2]?arguments[2]:function(){};
    var onError = arguments[3]?arguments[3]:function(){};
    var retry = arguments[4]?arguments[4]:3;
    func_url = ‘’ + func_url;
    mui.ajax(func_url, {
        data:params,
        dataType:’json’,
        type:’post’,
        timeout:3000,
        success:function(data){
            if(data.err === ‘ok’){
                onSuccess(data);
            }
            else{
                onError(data.code);
            }
        },
        error:function(xhr,type,errorThrown){
            retry–;
            if(retry > 0) return mui.web_query(func_url, params,
onSuccess, onError, retry);
            onError(‘FAILED_NETWORK’);
        }
    })
};
var onError = function(errcode){
    switch(errcode){
    case ‘FAILED_NETWORK’:
        mui.toast(‘互连网倒霉’);
        break;
    case ‘INVALID_TOKEN’:
        wv_login.show();
        break;
    default:
        console.log(errcode);
    }
};
var params = {per:10, pageno:coms_current_pageno};
mui.web_query(‘get_com_list’, params, onSuccess, onError, 3);
调用后端接口怎么样才安然?
在APP中保存登录数据,每便调用接口时传输

5.3.login2

  • 用途
    接纳login1重临的chcode总括出一个hash值,提交给本接口申请到1个token。该token值用于别的接口的证实。
    请求

    id login1接口回到的id值,原样带入。
    hash 依据预订计算出的hash值。算法:
    hash=md5(md5(password)+chcode)
    讲述:首先总结出密码的hash值,然后在云谲波诡的密码hash值底部拼接上挑衅字符串形成新的字符串,最终总计这一个新字符串的hash值。
    hash算法接纳md5算法,生成的摘要选拔16进制编码,编码生成的字符选取小写字母。
    例如,字符串111111的hash值是 96e79218965eb72c92a549dd5a330112

  • 响应

{
    "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,usermane,password。

图片 2

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.2.login1

  • 用途
    交由注解申请,接口再次回到挑衅字符串。
    请求

    username 登录用户名。

  • 响应

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

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

图片 3

图片 4

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]);
};

2.询问分类

代码看起来好像没有怎么难点。然则执行的时候出错了。查对了刹那间,错误的来由是,csrf验证退步!

壹 、打开路由的web页面:192.168.3.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.3.接口请求

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

ip替换到实际服务器的ip或域名,要是端口不是默许端口,必要把端口加上。
token是阐明字符串,在登录接口中收获,假若没有登录则省略。
任何内容参见接口的定义。
当UHavalL请求参数值中蕴藏U库罗德L地址保留字符时,应对参数值实行U奥迪Q3L编码。
实际参见“QashqaiFC2396: Uniform Resource Identifiers (U逍客I): Generic
Syntax”。
当呼吁参数包蕴中文字符时,应对汉语字符接纳UTF-8编码。

http协议是二个种无状态的商议。为了使这种无状态变得有状态,由此引进了对话。简单来说,通过session去记录那么些状态。当三个用户率先次呼吁web服务的时候,服务器会转移一个session,用于保存这么些用户的新闻。同时,在回去给用户端时,把这些sessionID保存在cookies里。当用户再叁遍呼吁的时候,浏览器会把这么些cookies带上。因而在劳务器端就能明了多次请求是或不是为同三个用户。

签到成功的提示:

登录和挂号要丰富简单
那是纤维手机端,用再好的输入法,打字也是不便宜的,所以别把登录页设计得供给填很多事物。假如有恐怕的话,只填手机号,让用户收到短信验证码就实现登记是极其然而的了。想取得越来越多音讯?想想大商店的APP是如何做的,他们会报告用户,将来的个人资料完善程度是百分之三十,假使想博得更加多积分,你需求填完。
tips:要是您想昭示在Appstore并且还要含有注册功效,那么注册页面必须做2个用户许可协议的链接,不然有大概通可是审核。

4.1.询问播放地址

  • 用途
    询问有些媒体财富的播报地址。
    请求

    media_id 财富编号。
    protocol
    播出协议,点播财富能够是hls,http-flv或http-VCD;直播能源得以是
    rtmp或hls。假诺不难,再次来到全部协议的地址。
    客户端请依照终端类型选拔合适的热播协议:
    android、ios或其余协理H5的浏览器,能够选取:hls, http-mp3协议
    PC选用http-flv或rtmp协议

  • 响应

{
    "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个或多少个广播地址,三个能源大概有多少个例外协商的播音地址。
resource_id 能源编号
web_url 播出地址
“web_io_protocol 播出协议

网站分析

图片 5

刚刚的艺术,机智一点儿的读者差不离会心存疑虑:那获取token时不还是得精通传输壹遍密码吗?
是的,你能够将以此获得token的地点,用SSL来珍惜(比如),那样黑客就是截了包,近来半会儿也解不出什么消息。
SSL证书的取得渠道很多,作者深信您总有措施查到,所以不赘述了。可是话说namecheap上的SSL证书比godaddy的要有利得多……(那是吐槽)
tips:前段时间OpenSSL漏洞让众多服务器遭殃,所以即便本身搭服务器,一定记得装补丁。
tips:能够把全部接口都弄成SSL的吧?能够。但会拖慢服务器,假诺是陈设并不自信的VPS,提出不折腾。

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成分的质量时,会简单一些性质的叙述,即事实上调用接口再次来到的习性在本文书档案中恐怕会并未描述,那种场馆下请直接忽略被忽视描述的属性值。本文书档案中描述的属性是事实上重回内容的1个子集,没有描述到的内容对集费用系统尚未影响。
带分页数据的音信
假若回到数据较多,服务器会对回到的数目举行分页,客户端能够依照页码请求钦定范围的数码。带分页消息的回来数据结构如下:

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

分页数据信息在data成分下,意义如下:
page 当前页码
page_size 每页数据记录条数
pages 总共的页数
total 总数据条数
count 当前回来页的数据条数
只要回去的数码带有分页消息,则足以在调用接口时行使page参数来呼吁钦定页码的多寡。

其间csrf是为着防范跨域脚本伪造。原理很简短,便是每3回呼吁,服务器生成一串加密字符串。放在隐藏的input表单中。再二次呼吁的时候,把那么些字符串一起传过去,为了求证是还是不是为同四个用户的请求。

图片 6

那种景况是家常便饭偷懒的程序员可能傻X的小业主选择的艺术,因为做起来实在太快。借使笔者网站是响应式布局,那么很有大概不要求做怎么着改观,就要是在支付时打早先页就好了,那样Hybird的APP外壳就纯粹成为了2个浏览器。
但比起那样做带来的众多瑕疵来,开发进程快的优点大致能够忽略不计。
第2,在网络环境倒霉时,纯大白页,用户体验0;
接下来,CSS和JS等财富不在本地,要求中远距离载入,假使接纳了bootstrap之类的框架,那用户为了开一下APP而消耗的流量真是令人感动;
再然后,网页里常用的jquery,在二弟大的webview里速度并不优异,而假如是非ajax的网页那就更干扰了,每一趟操作都要跳转和页面渲染,要令人把它当成APP那其实是调侃。
再再然后,这样的所谓APP,要因此Appstore的审查,那是痴心妄想的(除非审核员当天闹肚子严重,拿着纸巾奔向厕所前误点了通过……),苹果的要求是,那得是APP,而无法是某些网站做成APP的规范,那样的动静符合做Web
APP。而据小编所知,国内几个较大的Android商场,那样的APP也是力不从心通过核查的。

概述

  • 1)登录的渴求和含义
    客户端应当首要选拔判断服务器是或不是须求必须登录。假若须求,则应率先调用登录接口登录,然后再请求其他接口。
    是还是不是供给强制登录,跟运行须要有关,网站运营者能够透过管制平台安装那么些选项。
    假设没有强制供给,客户端可以登录,也能够不登陆。
    用户正确登录后,会收获贰个token值,在此起彼伏的接口中,应当将该token值带入。例如:

  • 2)登录的流程
    服务器和客户端通过“挑战->应答”格局(challenge-response)进行身份认证交互,在那几个进度中,客户端须求调用一次接口向服务器注明身份。认证进度中不必要传递密码,密码用于签名验证。
    身份认证的过如下:
    1)客户端应用“用户名”作为参数调用“login1”接口,向服务器发出身份注明请求
    1.1)服务器确认用户是还是不是是有效的用户:
    1.2)若不是,则不做进一步处理,重临错误音信
    1.3)要是,服务器发生二个“随机数(挑衅字符串)”发送给客户端
    2)客户端应用“用户密码”和“随机数(挑衅字符串)”作为输入,按预订的算法生成贰个hash值,用该hash值作为
    调用“login2”接口的参数,请求login2接口。
    2.1)服务器用收到的hash值与团结的持筹握算结果相比,若二者相同,则经过验证;不然,认证退步
    2.2)若评释通过,服务器再次来到“token”给客户端,否者再次回到错误音讯。

由代码能够知晓,requests.Session()运行会话对象后,第②遍呼吁会自动把上2次的sessionID一起传过去。

图片 7

 

5.4.logout

  • 用途
    脱离登录,退出应用前请尽大概调用该接口。
    请求

    =abcdefg
    token 登录接口中拿走的token

  • 响应

{
    "code": 0,
}

上述正是本文的全体内容,希望对我们的学习抱有帮助,也冀望大家多多扶助脚本之家。

ip地址被限定,供给等待1分钟的唤醒:

再插点代码,基于plus.storage的用户音信类,注意:要求在plusReady之后再选择。

2.1.查询分类

  • 用途
    查询CMS上的分类消息。
    请求

    parent 上级分类编号。假设大意,会回到顶尖分类列表。
    一经要询问超级分类,请去掉parent参数。

  • 响应

{
    "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 表示近期分门别类是一级分类。

由此登陆抓取,看到那样一个请求。

叁 、路由器重临数据

您是还是不是真正要求报到功效?
把那些难题放在最前边并不是灌水,而是真的见过很多并不供给登录的APP去做了登录成效,或许是并不要求强制登录的APP把登录作为运行页。
用户对您的APP一窍不通,你就供给对方注册并报到,除非APP自身已经很有声望可能是用户有强必要,不然符合规律人应有会直接把它删掉。
正如温和的主意是将一些并不需求登录,但能够给用户带来支持的东西,第最近间显示给她们,让她们产生兴趣,再在妥帖的时机指点他们注册(比如利用需求运用更高级的功效,或用户供给收藏有个别喜欢的音讯时)。

1.2.通讯磋商

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

就此大家的代码,必要在第③次呼吁的时候获得这些sessionID。第三遍呼吁的时候把那个sessionID一起传过去。而requests厉害的地点正是,一句简单requests.Session(),就能使用那几个会话对象。

图片 8

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

3.询问媒体能源

成功赢得登陆后的页面

image

程序员总能给自个儿找到偷懒的点子,有的程序为了省事,会在用户登录后,间接把用户名和密码保存在地头,然后每便调用后端接口时作为参数字传送递。真省事儿啊!可那种艺术不难易行就好像拿着一袋子钱在旅途边走边喊“快来抢作者哟!快来抢笔者哟!”,四个细小的嗅探器就能把用户的密码得到手,倘诺用户习惯在享有地点用三个密码,那么你闯大祸了,黑客通过撞库的法子能把用户的富有新闻一锅端。

4.询问播放地址

你或者感兴趣的稿子:

  • python模拟今日头条天涯论坛登陆功用(果壳网新浪爬虫)
  • python使用paramiko模块达成ssh远程登陆上传文件并施行
  • Python爬虫利用cookie完毕模拟登陆实例详解
  • python3.3课程之模拟百度登陆代码分享
  • python实现带验证码网站的自发性登陆达成代码
  • python完成四线程暴力破解登陆路由器作用代码分享
  • Python实现SSH远程登陆,并执行命令的点子(分享)
  • python完毕的登陆Discuz!论坛通用代码分享
  • python模拟登陆Ali阿娘生成商品推广链接
  • python完毕登陆微博得到个人珍藏并保留为word文件

图片 9

还记得刚才APP向服务器请求token时,能够出席的用户音讯呢?比如用户的设备deviceid。
倘若我们在调用接口时,还顺带3个当下时间戳参数timestamp,同时,用deviceid和那么些时刻戳再生成三个参数sign,比如
md5(deviceid timestamp
token)那样的样式。而服务端首先验证一下参数中的时间戳与最近服务器时间是还是不是相同(误差保持在客观界定内即可,比如6分钟),然后依据用户保存在服务器中的deviceid来对参数中的时间戳实行同样的变形,验证是不是匹配,那便自然“更更安全”了。
tips:假诺对一切调用请求中的参数进行排序,再以deviceid和timestamp加上排序后的参数来对全部调用生成三个sign,黑客正是截获sign,不相同的时间点、参数请求所使用的sign也是见仁见智的,难以伪造,自然会更安全。当然,写起来也更麻烦。
tips:驾驭了规律,整个验证进度是足以依照本人的要求改造的。

5.登录验证

爬虫的画龙点睛第②步,分析指标网站。那里运用谷歌(谷歌)浏览器的开发者者工具分析。

image

登录 保存密码 安全 加密
近年来察觉群内大伙对用Hbuilder做的APP咋做登录效能以及维护登录境况至极纳闷,而本身前一段时间正好稍微研讨了一下,所以把自个儿了然的告知我们,节约大家找找资料的岁月。

1.1.用途

向集成客户端提供查询数据和登录服务。
要是能源要求授权才能查看和使用,请首先阅读“5.登录验证”小节。

图片 10

图片 11

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

5.1.判断是或不是必须登录

  • 用途
    认清是或不是须要必须登录。
    若果供给必须登录,则需求首先登场录,否者查询数据的接口会回到没有权限的一无所长。

请求

  • 响应

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

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

注明:因为模仿登陆的是本身的私人住房网站,所以以下代码对私有网站和账号密码做了拍卖。

image

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

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 或多少个下级分类。

#!/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)

image

;function UserInfo(){
};

3.1.询问媒体能源

  • 用途
    询问媒体能源。
    能够查询有些编号的能源的新闻,也能够查询有个别分类下的持有财富音讯。
    请求

    parent
    分类编号,假诺要查询某些分类下的兼具财富,请忽略下3个参数。
    media_id
    财富编号,如若给出该参数,则只询问号码为media_id的四个财富的音信,并忽略parent参数。

  • 响应

{
    "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 开放意况

到那,应该都理解了,如若要登录成功,需求缓解哪些让服务相信四遍呼吁是同三个用户。那里须要利用http会话(不知晓的能够活动百度,那里大致介绍)。

image

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

其次份代码

image

那是个很好的一世,因为无论是后端你是用Java、PHP,依然node.js,都能够通过xml、json来和APP通信。遥想当年写服务端要协调写包结构,然后为了缓解出现难点还折腾了3个月IOCP模型,真心觉得未来太幸福了。
把刚刚丰盛用APP当浏览器使的案例的有着缺点反过来看,就是这么做的长处,在优化完善的情景下体验接近原生,而且通信流量极少,通过种种审查批准也是妥妥的。
tips:通过plus对象中的XMLHttpRequest来Get、Post远程的后端接口,只怕利用穆伊中封装好的AJAX相关函数。

所以,我们的代码逻辑就有了。首先请求三次登录页面。然后分析页面,得到csrf字符串。最终把那一个字符串和账号密码一起传给服务器用来报到。

图片 12

报到时呼吁2遍token,之后用token调用接口

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

发表评论

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