一、分析页面
首次登录到北大bbs首页,会发现是以游客身份登录的,只能访问部分内容;
页面左侧有登录模块,找个账号登录进去,就能看到个人登录信息以及内部人员能够访问的模块了。
- 我们需要分析点击“登录”按钮,触发什么操作?
点开js,代码如下
function() {
var t = ($(".have-login"), $(".not-login"));
t.addClass("logging");
var e = t.find("input[name=username]"),
a = t.find("input[name=password]"),
i = e.val(),
n = a.val();
if (0 == i.length) return BDWM.alert({
text: "请输入用户名",
callback: function() {
e.focus()
}
}), !1;
if (0 == n.length) return BDWM.alert({
text: "请输入密码",
callback: function() {
a.focus()
}
}), !1;
var o = CryptoJS.MD5(n + i + n).toString().toLowerCase();
$.post("ajax/login.php", {
username: i,
password: n,
keepalive: $('input[name="keepalive"]').prop("checked") ? 1 : 0,
t: o
}, function(e) {
if (e.success) location.reload();
else {
t.removeClass("logging");
var a = t.find("input[name=username]"),
i = t.find("input[name=password]");
switch (e.error) {
case 4:
BDWM.alert("您输入的用户名不存在"), a.val(""), i.val(""), a.focus();
break;
case 5:
BDWM.alert("您输入的密码有误,请重新输入"), i.val(""), i.focus();
break;
default:
BDWM.alert("其他错误发生,错误码" + e.error)
}
}
}, "json").error(function() {
BDWM.alert("网络错误,请重试")
})
}
分析找到"ajax/login.php"
,js请求登录的网址为https://bbs.pku.edu.cn/v2/ajax/login.php
,其中post内容为
var o = CryptoJS.MD5(n + i + n).toString().toLowerCase();
$.post("ajax/login.php", {
username: i,
password: n,
keepalive: $('input[name="keepalive"]').prop("checked") ? 1 : 0,
t: o
}
username: 用户名
password: 密码
keepalive :下次是否自动登录
t :加密
二、Postman模拟登陆请求
使用postman发送登录请求(post),如下图
返回结果
cookie
最主要的是拿到cookie,拿到cookie后,再访问北大bbs主页,就能够显示内部成员访问内容了。
三、Python代码实现
思路一
一开始想法是post请求,获取cookie并解析保存,然后带上保存的cookie访问访问主页
思路二
直接用session请求登录,返回的cookie直接保存在session中,用session访问主页
代码实现如下
# -*- coding: utf-8 -*-
__author__ = 'iccool'
import hashlib
import requests
from requests import RequestException
import json
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36'
}
# 用户名
i = 'your username'
# 密码
n = 'your password'
# 结合用户名和密码 md5加密
o = str(hashlib.md5((n+i+n).encode(encoding='UTF-8')).hexdigest()).lower()
# post 请求体
data = {
'username':i,
'password':n,
'keepalive':1,
't':o,
}
proxy ={
'http':'your proxy',
'https':'your proxy'
}
def get_session():
try:
# session 请求
session = requests.session()
# 设置代理
# session.proxies = proxy
# post请求 返回的cookie保存在session中
post = session.post('https://bbs.pku.edu.cn/v2/ajax/login.php', data=data, headers=headers)
# 判断返回状态
if post.status_code == 200:
# 解析 登录是否成功
status = json.loads(post.text)['success']
# 登录成功 返回session
if status is True:
return session
else:
print('请核实用户名和密码!')
return None
else:
print('请求失败')
return None
except RequestException:
print('请求失败')
def main():
# 获取 登录session
session = get_session()
if session is not None:
# session 请求主页 登录cookie已保存在session中
response = session.get('https://bbs.pku.edu.cn/v2/home.php', headers=headers)
# 拿到返回数据 下一步就是解析页面内容
print(response.text)
if __name__ == '__main__':
main()
response.text内容如下 (只截取用户部分)