🗒️python读取本地session
2024-3-12
| 2024-3-12
0  |  0 分钟
type
status
date
slug
summary
tags
category
icon
password
如果每次都要登录拿到新的session(其实是新的cookie),如果是脚本或者服务则会导致登录频繁,可能会被系统限制,或者挤掉本地其他会话。下面是一个读取本地session的范例:本地session不存在则登录并保存,同时设置自定义的过期,下次登录先校验是否登录+过期。
#!/usr/bin/env python # --*-- conding:utf-8 --*-- # @Time : 2024/3/11 10:24 # @Author : chawn # @File : mysso.py # @Software : PyCharm import json import requests from utils.iniread import ini_read import time import pickle import os import datetime url = login_url headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36' } class SessionManager: def __init__(self, session_db_file='session_db.pkl', default_expiry=2592000): """ :param session_db_file: session db,不传则使用默认值 :param default_expiry: session过期时间,2592000s 是30天 """ self.session_db_file = session_db_file self.default_expiry = default_expiry #绝对路径写入,避免被其他目录调用时失败 self.folder_path = 建议写绝对路径 self.file_path = self.folder_path + self.session_db_file self.folderNew() def folderNew(self): # 创建session目录 if not os.path.exists(self.folder_path): os.makedirs(self.folder_path) def save_session(self, session): with open(self.file_path, 'wb') as file: pickle.dump(session, file) def load_session(self): try: with open(self.file_path ,'rb') as file: print("---校验本地session db---") session = pickle.load(file) if self.is_session_expired(session): print("---session已过期---") return None print("---session未过期---") return session except FileNotFoundError: print("无session db") return None def is_session_expired(self, session): if session is None: return True #print("校验session是否过期:",vars(session)) #expiry_time = session.get('expiry_time', 0) expiry_time = session.cookies["expiry_time"] normal_time = datetime.datetime.fromtimestamp(float(expiry_time)) #print("过期时间",normal_time) return time.time() > float(expiry_time) def login(self, session): username,password = ini_read() # 设置登录信息,包括用户名、密码和_csrf_token等 post_data = { 'username': username, 'password': password } post_url = url #更新headers,避免是默认'User-Agent': 'python-requests/2.27.1' session.headers.update(headers) response = session.post(post_url, data=post_data) #print(vars(session)) # 获取 cookie 并将其设置为 session 中的值 session_cookie = None for cookie in response.cookies: if cookie.name == 'session_id': session_cookie = cookie break if session_cookie is None: session.cookies.set('session_id', 'new_session_id') else: session.cookies.set_cookie(session_cookie) # 设置过期时间 expiry_time = time.time() + self.default_expiry session.cookies['expiry_time'] = str(expiry_time) # 保存 session self.save_session(session) return session def get_session(self): session = self.load_session() if session is None or self.is_session_expired(session): session = requests.session() session = self.login(session) #print("当前登录session:",vars(session)) return session # 使用示例 session_manager = SessionManager() session = session_manager.get_session() rs = session.get(url=test_url) print(rs.text) # print("当前会话信息:", vars(session))
 
pycharm 相关python html表格样式参考
目录