IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 【转载】Python使用POST方法实现开机自动登陆大连海事校园网 -> 正文阅读

[Python知识库]【转载】Python使用POST方法实现开机自动登陆大连海事校园网

本文代码来自:Python 实现大连海事校园网登录

今天打开电脑发现之前的登陆脚本挂了,重启也没用,尝试根据报错修改xpath,还是无法定位元素,又重试了其他方法,发现还是无法定位到元素(其实最开始用xpath就是因为其他方法定位失败了),而很巧的是在昨天我的评论区出现了一个老哥给我发了他的方法:Python 实现大连海事校园网登录

我测试了一下发现确实好用。仔细阅读了一下代码,发现老哥的功底确实好,好几处我认为可以优化或者需要修改的地方在我改完之后都不能用了。仔细研究了原理之后发现我的理解是错的,原本的代码就是最简洁的写法。

# -*- coding:utf-8 -*-
 
import binascii
import re
import time
import requests
from pyDes import ECB, PAD_PKCS5, des

def des_encrypt(s, key):
    """
    DES 加密
    :param key: 秘钥
    :param s: 原始字符串
    :return: 加密后字符串,16进制
    """
    secret_key = key
    k = des(secret_key, mode=ECB, pad=None, padmode=PAD_PKCS5)
    en = k.encrypt(s)
    return en  # 得到加密后的16位进制密码 <class 'bytes'>
def encrypt(pd, key):
    """
    密码加密过程:
    1 从认证页面中可获得base64格式的秘钥
    2 将秘钥解码成bytes格式
    3 输入明文密码
    4 通过des加密明文密码
    5 返回base64编码格式的加密后密码
    :param pd: 明文密码
    :param key: 秘钥
    :return: 加密后的密码(base64格式)
    """
    key = binascii.a2b_base64(key.encode('utf-8'))  # 先解码 <class 'bytes'>
    pd_bytes = des_encrypt(pd, key)  # 得到加密后的16位进制密码 <class 'bytes'>
    pd_base64 = binascii.b2a_base64(pd_bytes, newline=False).decode('utf-8')
    return pd_base64

 
def login(username, password):
    start_time = time.process_time()
    session = requests.session()
    headers = {
        'Connection': 'keep-alive',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,'
                  'application/signed-exchange;v=b3;q=0.9',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/95.0.4638.69 Safari/537.36',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Content-Type': 'application/x-www-form-urlencoded'
    }
    session.headers = headers
 
    # 访问任意网址,返回包含认证页面链接的内容(自动跳转)
    url = 'http://bilibili.com/'
    resp = session.get(url, verify=False)
 
    # 提取认证链接并访问,经历一次重定向得到认证页面,且会返回一个cookie值:session
    url = re.search(r"href='(.*?)'</script>", resp.text).group(1)
    resp = session.get(url)
 
    # '''从认证页面正则得到 croypto(密钥 base64格式) 与 execution(post参数)的值 '''
    croypto = re.search(r'"login-croypto">(.*?)<', resp.text, re.S).group(1)
    execution = re.search(r'"login-page-flowkey">(.*?)<', resp.text, re.S).group(1)
    # 构建post数据 填入自己的学号 密码
    data = {
        'username': username,  # 学号
        'type': 'UsernamePassword',
        '_eventId': 'submit',
        'geolocation': '',
        'execution': execution,
        'captcha_code': '',
        'croypto': croypto,  # 密钥 base64格式
        'password': encrypt(password, croypto)  # 密码 经过des加密 base64格式
    }
 
    # 添加cookie值
    session.cookies.update({'isPortal': 'false'})
 
    # 提交数据,进行登录,这里禁止重定向,因为会有cookie限制
    url = 'https://id.dlmu.edu.cn/login'
    resp = session.post(url, data=data, allow_redirects=False)
 
    # 得到上一步返回的重定向网址,继续访问(需要清空cookie值)
    # 这里实际经过了三次重定向
    url = resp.headers['Location']
    session.cookies.clear()
    resp = session.get(url)
 
    end_time = time.process_time()
    print(end_time - start_time)
    if resp.status_code == 200:
        print('成功登录')
 
 
if __name__ == '__main__':
    username = ''
    password = ''
    login(username, password)

有几点是值得提一下的:
1.des_encrypt和encrypt当中的函数方法的返回值的类型是非常值得注意的,因为对于bytes和string两种数据类型方法是不同的。而数据处理过程中也并不是所有的数据都能转换为string,因为密钥原本就不是可打印字符,而是使用了base64变成了可打印字符。
2.自定义的encrypt方法和des实例里的encrypt方法重名了,但其实不是一个方法,调用的形式也不一样。阅读代码时注意区分即可。
3.原文代码当中自定义的encrypt方法中形参有默认值,估计是测试用的,我删除了。
4.今天下午仔细研读了老哥的代码,发现没有可以优化的地方了,但是我的水平也有限,如果有优化建议可以到原文留言区留言,也非常欢迎跟我讨论。

开机自启

可以将代码的快捷方式复制到开机自启文件夹,win+r,输入shell:startup即可打开。

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-12-04 13:24:12  更:2021-12-04 13:25:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 2:16:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码