使用python模拟登录

  • 运行环境
  • 步骤
  • 浏览器阶段
  • 思路
  • 编码
  • 使用Java模拟登录


该方法是一个比较麻烦的方法,但是它不需要浏览器的配合,适合爬虫之类。
而另一种,使用webdriver的,使用比这个简单,可以用来做每日签到、打卡之类,使用python + 相关浏览器的webdriver驱动浏览器进行操作。

运行环境

本次开发在Windos和Linux上均成功,运行环境为:
Linux:python 3.7.2
Windows:python 3.7.1

注意,在Linux下make install时候,一定要提前安装好ssl、zlib等,前者使得python支持https,后者保证能顺利安装。别忘了gcc也要提前安装。
以上两个问题可能的解决方案:

yum install openssl-devel
yum install zlib*

步骤

浏览器阶段

本次模拟网站:https://www.bbaaz.com 其登录界面网址为:https://www.bbaaz.com/member.php?mod=logging&action=login

先使用浏览器打开,输入用户名、密码,然后F12打开Dev Tools,选择Network选项卡,注意勾选Preserve log,不然可能的情况是,你点了登录,由于package太多的原因,或者跳转新页面,关键的包已经舍弃掉了。
找到关键包,如下图,可以看到很多信息。

python模拟点击安卓手机代码 python模拟安卓app登录_模拟登录


从package中可以获取到:

Request URL: https://www.bbaaz.com/member.php?mod=logging&action=login&loginsubmit=yes&loginhash=Lm0Hi&inajax=1

Set-Cookie:xxxxx

Form Data
formhash: xxxxx
referer: https://www.bbaaz.com/
loginfield: username
username: xxxxx
password: xxxxx
questionid: 0
answer:

仔细观察,发现了什么,首先,Request URL带有了一个loginhash,再Form Data中带有了formhash,这些应该是防止非法登录的,那么这些数据哪里来的呢?经过注销,重新打开登陆界面,分析登录界面,可以得知这些信息,都是原登录界面的隐藏信息。

思路

那么我们的思路就是,首先,打开登录界面,从登录界面获取两个Hash值,再打开一个能存放Cookie的Request,给登录URL发送表单,记录返回的Cookie,再打开别的页面的时候,就可以通过Cookie进行访问。

编码

import urllib.request
import http.cookiejar

form = {'formhash': '',
        'referer': 'https://www.bbaaz.com/',
        'loginfield': 'username',
        'username': 'xxxxx',
        'password': 'xxxxx',
        'questionid': '0',
        'answer': ''}
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3562.0 Safari/537.36'}
loginURL = "https://www.bbaaz.com/member.php?mod=logging&action=login"
query = "&loginsubmit=yes&frommessage&loginhash=xxx&inajax=1"

"""为什么刚开始就直接使用带Cookie的opener呢,经过测试,在打开登录界面的时候,服务器就会向客户端发送3个Cookie,这些Cookie同样有验证作用,如果不带上,那么登录的时候,服务器会返回,含有非法字符,无法登录"""
cookie = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cookie))

req = urllib.request.Request(loginURL, headers = headers)
resp = opener.open(req)
s = resp.read().decode('utf-8')

#获取登录界面的Hash值
s = s.split('<form method=\"post\"', 1)[1].split('name=\"formhash\" value=\"', 1)
suffix = s[0].split("loginform_", 1)[1].split("\"", 1)[0]
formhash = s[1].split("\" />", 1)[0]
query = query.replace('xxx', suffix)
form['formhash'] = formhash
post_form = urllib.parse.urlencode(form).encode('UTF-8')


req = urllib.request.Request(loginURL + query, headers = headers, data = post_form)
opener.open(req)

#你要访问的网页
req = urllib.request.Request(form['referer'], headers = headers)
resp = opener.open(req)
s = resp.read().decode('UTF-8')

经测试,使用该方法,成功模拟登录。

使用Java模拟登录