Python进阶(1)

Python进阶(1)

文章目录

  • Python进阶(1)
    • 一:发送请求(GET/POST)
      • 1.1、方式一:http.client,以https方式为例
        • 1.1.1、GET
        • 1.1.2、POST
      • 1.2、方式二:requests,以https方式为例
        • 1.2.1、GET
        • 1.2.2、POST
    • 二、整合LOG日志
    • 三、整合定时任务
    • 四、写CSV文件
    • 五、整合Redis
    • 六、整合Mysql
    • 七、AES加密
    • 八、国密GMSM2,以JS方式
    • 九、滑块验证码,滑块距离破解

Python版本:Python 3.10.0

一:发送请求(GET/POST)

1.1、方式一:http.client,以https方式为例

所需库文件:依赖内置库文件

1.1.1、GET

import http.client
import jsondef test(sessionId,pdate,p_):conn = http.client.HTTPSConnection("服务地址,例:abc.com.cn", "端口号 例 8080")payload = ''headers = {'Cookie' : sessionId,'Accept' : 'application/json, text/javascript, */*; q=0.01','User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'}conn.request("GET", "/test.do?pdate=" + pdate + '&_=' + p_, payload, headers)res = conn.getresponse()data = res.read()dataStr = data.decode("utf-8")return json.loads(dataStr)

1.1.2、POST

import http.client
import jsondef get():conn = http.client.HTTPSConnection("服务地址,例:abc.com.cn")payload = {'type': 'type0'}headers = {'Content-Type': 'application/json;charset=UTF-8','Accept' : 'application/json, text/plain, */*','User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'}conn.request("POST", "/get", json.dumps(payload), headers)res = conn.getresponse()data = res.read()return json.loads(data.decode("utf-8"))

1.2、方式二:requests,以https方式为例

所需库文件:requests

pip install requests

1.2.1、GET

import requests
import jsondef changeDate(sessionId,pdate,p_):url = "https://abc.com.cn:8080/test.do?pdate=" + pdate + '&_=' + p_payload={}headers = {'Cookie' : sessionId,'Accept' : 'application/json, text/javascript, */*; q=0.01','User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'}response = requests.request("GET", url, headers=headers, data=payload)dataStr = response.textreturn json.loads(dataStr)

1.2.2、POST

import requests
import jsondef get():url = "https://abc.com.cn/get"payload = json.dumps({"type": "type0"})headers = {'Content-Type': 'application/json;charset=UTF-8','Accept' : 'application/json, text/plain, */*','User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'}response = requests.request("POST", url, headers=headers, data=payload)jsonData = json.loads(response.text)return jsonData

二、整合LOG日志

需求:一天一个日志文件,保存30天

所需库文件:不需要下载库文件,依赖内置库文件

LOG配置,单例

import os
import logging
import re
from logging.handlers import TimedRotatingFileHandler# ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓当前配置需要更改↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
folderPath = './log'
log_name = 'appLog'
Log = Nonedef setup_log():global Logif Log is not None:return Logelse:isExist = os.path.exists(folderPath)if not isExist:os.makedirs(folderPath)# 创建logger对象。传入logger名字logger = logging.getLogger(log_name)log_path = os.path.join(folderPath + '/',log_name)# 设置日志记录等级logger.setLevel(logging.INFO)# interval 滚动周期,# when="MIDNIGHT", interval=1 表示每天0点为更新点,每天生成一个文件# backupCount  表示日志保存个数file_handler = TimedRotatingFileHandler(filename=log_path, when="MIDNIGHT", interval=1, backupCount=30)# filename="mylog" suffix设置,会生成文件名为mylog.2020-02-25.logfile_handler.suffix = "%Y-%m-%d.log"# extMatch是编译好正则表达式,用于匹配日志文件名后缀# 需要注意的是suffix和extMatch一定要匹配的上,如果不匹配,过期日志不会被删除。file_handler.extMatch = re.compile(r"^\d{4}-\d{2}-\d{2}.log$")# 定义日志输出格式file_handler.setFormatter(logging.Formatter("[%(asctime)s] [%(process)d] [%(levelname)s] - %(module)s.%(funcName)s (%(filename)s:%(lineno)d) - %(message)s"))logger.addHandler(file_handler)Log = loggerreturn logger

其他文件引用即可

abc.py

import NativeLogging# 使用日志记录器
logger = NativeLogging.setup_log()def start():logger.info('--------------------------------------')

三、整合定时任务

需求:每分钟执行一次

所需库文件:apscheduler

pip install apscheduler

from apscheduler.schedulers.blocking import BlockingSchedulerdef start():# 在这里定义你想要执行的任务逻辑print("Task executed!")scheduler = BlockingScheduler()
scheduler.add_job(start, 'cron', minute='*/1')try:scheduler.start()
except KeyboardInterrupt:pass

四、写CSV文件

需求:将两列多行数据写入到CSV文件

所需库文件:依赖内置库文件

import csvcsvFolder = './csv'# 写入到CSV文件
def writeCsv(currentYmd,data):outArr = []innArr = ['title1','title2']outArr.append(innArr)for element in data:innArr = [element['key1'],element['key2']]outArr.append(innArr)isExistFolderAndCreate(csvFolder)filename = csvFolder + '/' + currentYmd.replace('-','') + '.csv'with open(filename, 'w', newline='') as csvfile:writer = csv.writer(csvfile)writer.writerows(outArr)print('CSV文件写入成功')# 判断文件目录是否存在并创建
def isExistFolderAndCreate(folderPath):isExist = os.path.exists(folderPath)if not isExist:os.makedirs(folderPath)

五、整合Redis

需求:与Java Redis工具类一样,Redis只连接一次,通过共通方法调用

所需库文件:redis

pip install redis

import redis# ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓当前配置需要更改↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
host = 'localhost'
port = 6379
username = None
password = Noneclass RedisConfig:_instance = Nonedef __new__(cls, host, port, db, username=None, password=None):if not cls._instance:cls._instance = super().__new__(cls)return cls._instancedef __init__(self, host, port, db, username=None, password=None):if not hasattr(self, 'redis'):self.redis = redis.Redis(host=host, port=port, db=db, username=username, password=password)def publish(self, channel, message):self.redis.publish(channel, message)def set(self, key, value):self.redis.set(key, value)def get(self, key):return self.redis.get(key).decode('utf-8') if self.redis.get(key) else ''def publish(channel, message):# 创建 RedisConfig 实例并连接到 RedisredisConfig = RedisConfig(host=host, port=port, db=0, username=username, password=password)# 调用 publish() 方法进行发布redisConfig.publish(channel, message)def setString(key, value):# 创建 RedisConfig 实例并连接到 RedisredisConfig = RedisConfig(host=host, port=port, db=0, username=username, password=password)# 调用 publish() 方法进行发布redisConfig.set(key, value)def getString(key):# 创建 RedisConfig 实例并连接到 RedisredisConfig = RedisConfig(host=host, port=port, db=0, username=username, password=password)# 调用 publish() 方法进行发布return redisConfig.get(key)

六、整合Mysql

需求:与Java Mybatis一样,通过连接池,共通方法调用

所需库文件:mysql-connector-python

pip install mysql-connector-python

import mysql.connector
from mysql.connector import pooling# ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓当前配置需要更改↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
host = 'localhost'
username = 'root'
password = '123456'
database = 'db'class MySQLUtils:def __init__(self, host, user, password, database, pool_name='mypool', pool_size=5):self.host = hostself.user = userself.password = passwordself.database = databaseself.pool_name = pool_nameself.pool_size = pool_sizeself.pool = Nonedef connect(self):self.pool = mysql.connector.pooling.MySQLConnectionPool(pool_name=self.pool_name,pool_size=self.pool_size,host=self.host,user=self.user,password=self.password,database=self.database)def insert_data(self, sql, data):if self.pool is None:self.connect()connection = self.pool.get_connection()cursor = connection.cursor()insert_query = sqlcursor.execute(insert_query, data)connection.commit()cursor.close()connection.close()def insert_batch_data(self, sql, data):if self.pool is None:self.connect()connection = self.pool.get_connection()cursor = connection.cursor()insert_query = sqlcursor.executemany(insert_query, data)connection.commit()cursor.close()connection.close()def close(self):if self.pool is not None:self.pool.closeall()# 创建全局的 MySQLUtils 实例
utils = MySQLUtils(host, username, password, database)def insertBatch(sql, data):global utilsutils.insert_batch_data(sql, data)# sql = "INSERT INTO table (company_id, value1, value2) VALUES (%s, %s, %s) ON DUPLICATE KEY UPDATE company_id = VALUES(company_id), value2 = values(value2)"
# insDataArr = [(1,2,3),(1,2,3)]

七、AES加密

需求:一段文字,需要通过AES进行加密处理

所需库文件:pycryptodome

pip install pycryptodome

from Crypto.Cipher import AES
import base64def Encrypt(secretKey,jsonXy):key = secretKey.encode('utf-8')iv = b'0000000000000000'cipher = AES.new(key, AES.MODE_ECB)plaintext = jsonXy.encode('utf-8')# 明文需要按照AES块大小(16)进行补全text_len = len(plaintext)padding_len = AES.block_size - text_len % AES.block_sizepadding = bytes([padding_len]) * padding_lenplaintext += paddingciphertext = cipher.encrypt(plaintext)# 返回base64格式的密文return base64.b64encode(ciphertext).decode('utf-8')

八、国密GMSM2,以JS方式

需求:一段文字,需要通过国密GMSM2进行加密处理,但是Python中的gmsm2加密不符合需求,JS中的库文件加密符合要求,通过Python调用JS代码的方式

所需库文件:PyExecJS

pip install PyExecJS

安装nodejs,版本v16.15.0

npm install -g sm-crypto

import execjs# ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓当前配置需要更改↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
cwd=r"C:/Users/Administrator/AppData/Roaming/npm/node_modules"js = """const smCrypto  = require("sm-crypto");function doEncrypt(msgString, publicKey) {let msg = msgString;if (typeof (msgString) !== "string") {msg = JSON.stringify(msgString);}let sm2 = smCrypto.sm2;// 1 - C1C3C2;	0 - C1C2C3;	默认为1let cipherMode = 1; // 特别注意,此处前后端需保持一致// 加密结果let encryptData = sm2.doEncrypt(msg, publicKey, cipherMode);// 加密后的密文前需要添加04,后端才能正常解密console.log("04" + encryptData)return "04" + encryptData;}
"""
def execute_sm2(pwd,key):# ctx = execjs.compile(js)ctx = execjs.compile(js, cwd=cwd)res = ctx.call('doEncrypt', pwd, key)# print(res)return res;

九、滑块验证码,滑块距离破解

需求:计算网站登录时,滑块验证中小滑块在大背景中所需要移动的距离,图片为base64
计算出的该距离在有些场景的滑块验证码中并不是绝对正确,可能需要在计算出的距离之后 加减 偏差值,比如计算的距离为156,实际距离是166,需要 + 10,这个加减的偏差值在此场景的验证码中通用,只需要对该计算的距离加减即可,因为此场景所有的验证码可能都会出现此问题

所需库文件:opencv-python ,Pillow

pip install opencv-python Pillow

import base64
import cv2
import numpy as np
from PIL import Image
from io import BytesIOdef blockPuzzleCal(large_image_base64,small_image_base64):# Base64编码的大图和小图large_image_base64 = large_image_base64small_image_base64 = small_image_base64# 解码大图large_image_data = base64.b64decode(large_image_base64)large_image = Image.open(BytesIO(large_image_data))large_image = cv2.cvtColor(np.array(large_image), cv2.COLOR_RGB2BGR)# 解码小图small_image_data = base64.b64decode(small_image_base64)small_image = Image.open(BytesIO(small_image_data))small_image = cv2.cvtColor(np.array(small_image), cv2.COLOR_RGB2BGR)# 使用OpenCV的模板匹配result = cv2.matchTemplate(large_image, small_image, cv2.TM_CCOEFF_NORMED)min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)# 输出最匹配的坐标return max_loc

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/61760.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

音视频 ffplay命令播放媒体

播放本地文件 ffplay -window_title "test time" -ss 2 -t 10 -autoexit test.mp4 ffplay buweishui.mp3播放网络流 ffplay -window_title "rtmp stream" rtmp://202.69.69.180:443/webcast/bshdlive-pc强制解码器 mpeg4解码器:ffplay -vco…

Mac安装Dart时,Homebrew报错 Error: Failure while executing

前言: 最近准备开发Flutter项目时,在安装环境时,安装Homebew时遇到了以下报错信息,在这里分享一下。 报错信息: ~ % brew tap dart-lang/dart > Tapping dart-lang/dart Cloning into /opt/homebrew/Library/Tap…

Java-集合框架-List,Set,Map,队列

文章目录 Java集合框架:List,Set,Map,队列Java集合框架是什么?如何使用?ListSetMap队列 什么场景使用?优缺点是什么?ListSetMap队列 Java示例List示例Set示例Map示例队列示例 对比 J…

BMC相关知识

简介 BMC(Baseboard Management Controller),基板管理控制器,普通PC没有,服务器产品必备。BMC是一个独立的系统,只要通电即可运行,服务器无需开机,不依赖其它软硬件,如O…

Unity音频基础概念

一、音源与音频侦听器 游戏画面能够被观众看到,是因为有渲染器和摄像机,同样音频能够被听到,也要有声音的发出者与声音的接收者。声音的发出者叫做音源,接收者叫做音频侦听器。Audio Source与Audio Listener都是组件,…

webrtc 的Bundle group 和RTCP-MUX

1,最近调试程序的时候发现抱一个错误 max-bundle configured but session description has no BUNDLE group 最后发现是一个参数设置错误 config.bundle_policy webrtc::PeerConnectionInterface::BundlePolicy::kBundlePolicyMaxBundle; 2,rtcp-mu…

Linux之Shell(一)

Linux之Shell Shell概述Linux提供的Shell解析器bash和sh的关系Centos默认的解析器是bash Shell脚本入门脚本格式第一个脚本脚本常用的执行方式 变量系统预定义变量自定义变量特殊变量$n$#\$*、\$$? 运算符条件判断流程控制(▲)if判断case语句for循环while循环 read读取控制台输…

macos安装zsh

https://www.cnblogs.com/xuLessReigns/p/11005435.html mac下安装autojump brew install autojump 1,安装zsh,执行 sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)" 2,将zsh设置…

并发容器11

一 JDK 提供的并发容器总结 JDK 提供的这些容器大部分在 java.util.concurrent 包中。 ConcurrentHashMap: 线程安全的 HashMap CopyOnWriteArrayList: 线程安全的 List,在读多写少的场合性能非常好,远远好于 Vector. ConcurrentLinkedQueue: 高效的并…

设计模式入门笔记

1 设计模式简介 在IT这个行业,技术日新月异,可能你今年刚弄懂一个编程框架,明年它就不流行了。 然而即使在易变的IT世界也有很多几乎不变的知识,他们晦涩而重要,默默的将程序员划分为卓越与平庸两类。比如说&#xff…

unity 之参数类型之引用类型

文章目录 引用类型引用类型与值类型的差异 引用类型 在Unity中,引用类型是指那些在内存中存储对象引用的数据类型。以下是在Unity中常见的引用类型的介绍: 节点(GameObject): 在Unity中,游戏对象&#xff…

无重叠区间【贪心算法】

无重叠区间 给定一个区间的集合 intervals ,其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。 class Solution {public int eraseOverlapIntervals(int[][] intervals) {//先排序,按照左边界升序,注…

【爬虫】实验项目一:文本反爬网站的分析和爬取

目录 一、实验目的 二、实验预习提示 ​编辑 三、实验内容 四、实验要求 五、实验过程 1. 基本要求: 2. 改进要求A 3. 改进要求B: 六、资料 1.实验框架代码: 2.OpenSSL:Win32/Win64 OpenSSL Installer for Windows - Shining Light…

Node与Express后端架构:高性能的Web应用服务

在现代Web应用开发中,后端架构的性能和可扩展性至关重要。Node.js作为一个基于事件驱动、非阻塞I/O的平台,以及Express作为一个流行的Node.js框架,共同构建了高性能的Web应用服务。 在本文中,我们将深入探讨Node与Express后端架构…

Windows笔记本电脑开机黑屏

Windows笔记本电脑开机黑屏 最近,我遇到了一件奇怪的事情。我的Windows笔记本电脑在开机时出现了一个黑屏,没有任何反应。我尝试了多种方法,包括重启和恢复出厂设置,但都无济于事。 我开始感到担心,因为这只会影响到…

污水厂数字孪生 | 3D可视化管理系统助力污水企业数字化管理

随着城市化进程的不断加快,污水处理成为了城市环境保护的重要组成部分。传统的污水处理方式往往存在诸多问题,如信息不对称、安全隐患等。为了解决这些问题,污水处理3D可视化管控平台应运而生,它通过结合数字孪生技术和远程指导技…

【行为树】py_trees 学习笔记

学习资料 《Introduction to behavior trees》 1. 概念说明 1.1 Action:pt.behaviour.Behaviour 在一个行为树中,Action 是一个叶节点(Leaf Node),它实际执行某种行为或任务,并返回成功、失败或运行中的…

Unity关键概念

Unity是一款跨平台的游戏引擎和开发工具,用于创建2D和3D游戏、交互式内容和应用程序。它提供了一个强大的开发环境,使开发者能够轻松地设计、开发和部署高质量的游戏和应用程序。 以下是Unity的几个关键概念: 游戏对象(Game Obj…

【逻辑运算符】在Java中 和的区别 ||和|的区别

&&和&都表示与运算符,结果为有假则假,&&为短路与运算符,如果表达式A的值为假,则表达式B不执行;&表示逻辑与运算符,表达式A和表达式B都会执行 ||和|都表示或运算符,结果为有真则真&…

C# 静态构造函数未执行 .net core框架

代码如下&#xff0c;在执行Encoding.GetEncoding(“gb2312”);方法后报错&#xff0c;说没有找到对应编码&#xff0c;经测试&#xff0c;发现是静态构造函数未执行。 public static class Encodings {/// <summary>/// 注册相关编码/// </summary>static Encodi…