【Python】模拟登录上海西南某高校校园网 (jaccount)

好久没写东西了,最近学习了一下模拟登录,以校园网为例,作一记录。

去年的时候写过一篇模拟登录的文章,用的是登录后的cookies,这种操作比较傻瓜,也不智能,不够自动化,本质还是手动登录。
这次我尝试把登录过程用python进行,预先提供账号、密码即可。

众所周知(本校兄弟姐妹),本校所有身份认证现已完全由jaccount进行,只要通过了这一层验证,就相当于登录成功了。

以登录校园邮箱为例,先分析一下登录流程:

  1. 输入邮箱网址mail....edu.cn
  2. 跳转到jaccount验证页
  3. 输入账号、密码、验证码登录
  4. 跳转回邮箱页面,登录完成

难点分析:

  1. 跳转过程中有哪些数据需要携带?
  2. 验证码如何获取?如何识别?

刚开始想用requests解决所有问题,直到试了许多次也未能成功解决登录跳转的问题,只好放弃,转用更简单的selenium。selenium是一款可见即可得的自动化测试工具,在爬虫上用起来十分方便,它通过模拟人实际的操作实现对浏览器的控制,比如输入、点击、拖动等事件。

依次按照上述流程,进行编码(完整代码见文末):

步骤一、打开浏览器,输入邮箱网址

browser.get('https://mail.sjtu.edu.cn')

此时,会弹出浏览器,自动打开该网页,当然,也会自动跳转到jaccount验证页面。

步骤二、输入账号、密码、验证码

账号、密码都比较好搞定,自己预设好就行了。然后通过开发者工具定位文本框位置,由以下命令可以输入到相应的文本框内。

input_user = browser.find_element_by_id('user')
input_user.send_keys(user)
input_pass = browser.find_element_by_id('pass')
input_pass.send_keys(pswd)

麻烦的还是验证码。首先要找到验证码图片源,再通过OCR工具进行识别。
通过分析,发现验证码是由https://jaccount.sjtu.edu.cn/jaccount/captcha这个站点生成的。要获取到正确的验证码,需要传入相应的uuid参数,以及cookies。OCR工具目前比较好用的是tesseract,所幸我们这个验证码比较简单,识别率很高。

通过对源码进行搜索,终于找到uuid了,就在这个登录表单里,通过xpath获取一下,拿到value

uuid = browser.find_element_by_xpath('//form/input[@name="uuid"]')
params = {
    'uuid': uuid.get_attribute('value')
}

此处为了便捷,我使用requests进行验证码下载,而selenium的cookies也和requests不同,selenium是比较完整的信息,如下:

[{'domain': 'mail.sjtu.edu.cn', 'httpOnly': True, 'name': 'JSESSIONID', 'path': '/', 'secure': False, 'value': '12l9qesot3vw61sz8brl8i74ir'}, {'domain': 'mail.sjtu.edu.cn', 'httpOnly': True, 'name': 'ZM_AUTH_TOKEN', 'path': '/', 'secure': False, 'value': '0_7b1bfd5665cabda2816d04d7e4f8438022c54538_69643d33363a35373935373238652d346539362d346434372d383837332d6331666264356130343337643b6578703d31333a313536393836323130303632323b747970653d363a7a696d6272613b753d313a613b7469643d31303a323134323231343838363b76657273696f6e3d31333a382e382e395f47415f333031393b'}, {'domain': '.sjtu.edu.cn', 'expiry': 1569818955, 'httpOnly': False, 'name': '_gat', 'path': '/', 'secure': False, 'value': '1'}, {'domain': '.sjtu.edu.cn', 'expiry': 1569905295, 'httpOnly': False, 'name': '_gid', 'path': '/', 'secure': False, 'value': 'GA1.3.452166840.1569818896'}, {'domain': '.sjtu.edu.cn', 'expiry': 1632890895, 'httpOnly': False, 'name': '_ga', 'path': '/', 'secure': False, 'value': 'GA1.3.1066557857.1569818896'}]

而我们传入requests的只需要cookie名字和值即可,故可通过字典推导式,生成requests所需的cookies:

cookies = browser.get_cookies()
cookies = {i["name"]: i["value"] for i in cookies}

这样一来就可以获取验证码了,

response = requests.get(captcha_url, cookies=cookies, params=params)
with open('img.jpeg', 'wb+') as f:
    f.writelines(response)

这样验证码就被保存到img.jpeg文件中,识别验证码只需要以下两行代码即可:

image = Image.open('img.jpeg')
code = pytesseract.image_to_string(image)

最后,输入验证码,并确定,就可以跳转回登录后的邮箱界面。

input_code = browser.find_element_by_id('captcha')
input_code.send_keys(code)
input_code.send_keys(Keys.ENTER)

如果你用的是可视化浏览器,这时候就可以看到自己的邮箱了。
可以再看看当前的url,是不是已经跳转回邮箱的url了呢?

print(browser.current_url)

成功登录之后,要爬取什么东西都很简单了,比如课程表、好大学在线的课件等等~

完整代码

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import requests
import pytesseract
from PIL import Image

browser = webdriver.Chrome()

url = "https://mail.sjtu.edu.cn/"
captcha_url = "https://jaccount.sjtu.edu.cn/jaccount/captcha"
user = 'ben'
pswd = '********'

def get_captcha(captcha_url, cookies, params):
    response = requests.get(captcha_url, cookies=cookies, params=params)
    with open('img.jpeg', 'wb+') as f:
        f.writelines(response)

try:
    browser.get(url)
    cookies = browser.get_cookies()
    cookies = {i["name"]: i["value"] for i in cookies}
    uuid = browser.find_element_by_xpath('//form/input[@name="uuid"]')
    params = {
        'uuid': uuid.get_attribute('value')
    }
    get_captcha(captcha_url, cookies, params)
    image = Image.open('img.jpeg')
    code = pytesseract.image_to_string(image)
    print(code)
    input_user = browser.find_element_by_id('user')
    input_user.send_keys(user)
    input_pass = browser.find_element_by_id('pass')
    input_pass.send_keys(pswd)
    input_code = browser.find_element_by_id('captcha')
    input_code.send_keys(code)
    input_code.send_keys(Keys.ENTER)
    print(browser.current_url)
finally:
    print('success!')

原文地址:https://www.cnblogs.com/ben-future/p/11612309.html

时间: 2024-10-11 02:25:59

【Python】模拟登录上海西南某高校校园网 (jaccount)的相关文章

Python模拟登录后爬取网站内容(小说)

最近有个好友让我帮忙爬取个小说,这个小说是前三十章直接可读,后面章节需要充值VIP可见.所以就需要利用VIP账户登录后,构造Cookie,再用Python的获取每章节的url,得到内容后再使用 PyQuery 解析内容. 注意:构造Cookie的过程中,需要你在 Chrome/Firefox 登录,然后自己在控制台查看 cookie,然后手动加入. 第一步:手动构造cookie,绕过登录 [我这里不是破解账户,想破解请出门左拐] 1 #version 2.7 2 3 #!/usr/bin/pyt

【Python数据分析】Python模拟登录(一) requests.Session应用

最近由于某些原因,需要用到Python模拟登录网站,但是以前对这块并不了解,而且目标网站的登录方法较为复杂, 所以一下卡在这里了,于是我决定从简单的模拟开始,逐渐深入地研究下这块. 注:本文仅为交流学习所用. 登录特点:明文传输,有特殊标志数据 会话对象requests.Session能够跨请求地保持某些参数,比如cookies,即在同一个Session实例发出的所有请求都保持同一个cookies,而requests模块每次会自动处理cookies,这样就很方便地处理登录时的cookies问题.

【Python模拟登录】RSA加密与重放方式登录 -以模拟登录博客园为例

Python模拟登录第一弹见:[Python数据分析]Python模拟登录(一) requests.Session应用上次的登录是最基本的,全部是明文,而且在浏览器中就可以看到POST的数据.接下来我们来个稍微难一点的–模拟登录博客园(http://www.cnblogs.com) 登录特点:用户名密码都进行了RSA加密,且在浏览器中无法看到POST数据 图1如上图,在post数据中不能显式看到POST内容. 模拟登录步骤 既然浏览器调试功能无法探测到POST数据,那么采用Fiddler试试看,

python模拟登录知乎

这是一个模拟登录知乎的爬虫.运行后输入用户名密码以及和程序同一目录下的验证码图片,登陆成功后能够显示你在豆瓣地昵称. #! /usr/bin/env python #! -*-coding: utf-8 -*- import json import urllib import urllib2 import cookielib class Zhihu_login(object): """登陆知乎的一个演示程序""" def __init__(sel

Python模拟登录wap版百度贴吧+自动回贴

模拟登录的原理都差不多,大致都是这样: 打开首页获取相关cookie: 提交登陆表单(即用户名与密码): 确认是否登录成功: 如果想了解更具体的原理与相关知识,推荐到详解抓取网站,模拟登陆,抓取动态网页的原理和实现(Python,C#等).(不过这系列博文实在太绕太绕太绕,数十篇文章互相穿插让人头晕眼花,我前后断断续续历时几个月才搞懂并编码测试成功) 模拟登录的关键点有两个,一是使用抓包工具(如chrome开发者控制台)分析表单提交的真实链接与相关get/post参数,二是编写管理cookie的

python模拟登录开源中国

我的个人博客( 肥龙的博客)发表了新文章了! 欢迎大家过来阅读,以下是文章的连接地址 http://www.comingcode.com/?p=371 继上一篇文章模拟登录百度空间(http://www.comingcode.com/?p=357)后,为了多点推广自己的博客,通过上网搜索资料和分析http数据包,我再次使用python模拟了开源中国的登录操作,能够发表博客同时也能发送动弹. 具体的实现过程也是和登录百度空间的差不多,都是需要去分析http发送的数据包内容. 通过这两篇文章的模拟登

Python模拟登录cnblogs

Python利用requests.Session对象模拟浏览器登录cnblogs request.Session对行可以跨请求的保持cookie,非常方便的用于模拟登录. cnblogs登录页面分析: 登录页面https://passport.cnblogs.com/user/signin 使用抓包工具fiddler(wireshark无法抓取)可以抓取到登录时post的数据: 共三个字段,分别是input1.input2和remember(用户名.密码.是否记住登录信息). 其中,input1

python模拟登录的实现

本文主要用python实现了对网站的模拟登录.通过自己构造post数据来用Python实现登录过程. 当你要模拟登录一个网站时,首先要搞清楚网站的登录处理细节(发了什么样的数据,给谁发等...).我是通过HTTPfox来抓取http数据包来分析该网站的登录流程.同时,我们还要分析抓到的post包的数据结构和header,要根据提交的数据结构和heander来构造自己的post数据和header. 分析结束后,我们要构造自己的HTTP数据包,并发送给指定url.我们通过urllib2等几个模块提供

python模拟登录http basic authentication网站

当访问需要认证的网站时会提示输入正确的用户和密码 如果密码错误会返回401的状态码 401 Authorization Required 通过python脚本模拟登录 #!/usr/bin/python #-*-coding:utf-8-*- import urllib2 #登录的用户名和密码 username = "root" password = "redhat" url="http://192.168.209.200/" def Func(