python完成加密参数sign计算并输出指定格式的字符串
加密规则:
1.固定加密字符串+字符串组合(key/value的形式,并通过aissc码排序),
2.通过sha1算法对排序后的字符串进行加密,
3.最终输出需要的参数sign
4.完成请求参数数据的格式输出(因为浏览器复制出来的格式直接用python是不能请求的所以我用了之前写的一个方法来完成请求数据格式的转换)
例如:
输入:
'''course_finance_id[0]:252638
total_price:0
state:1
finan_rmk:343
timestamp:122
sign:11'''xxx
输出:
'course_finance_id[0]=252638&total_price=0&state=1&finan_rmk=343×tamp=1572505825134&sign=feab1228e93329b4e4adcebc7bcx'x'x2c4225a1eccba'
不废话,上代码:
- def fwh_sign_sha1(self,str_in):#服务号请求签名处理封装
- '''主要过程:
- 1.替换输入字符串中的时间戳为最新的时间戳
- 2.将字符串中的sign字段过滤掉并通过ascii对其进行排序,因为加密时不需要此字段
- 3.将排序且处理后的字符串通过sha1算法,得到加密字符串
- 4.将得到的加密字符串替换至原字符串'''
- search_time_str='timestamp:'
- search_sign_str='sign:'
- str_inSource=re.search('(%s.+)'%(search_time_str),str_in)#匹配字段时间戳(timestamp)
- if str_inSource is not None:
- time_str=self.get_timestamp()#最终需要的时间戳,13位
- str_inSource=str_inSource.group()
- search_str_inSource=re.search('\s',str_inSource)
- #匹配时间戳,key与value是否包含空格
- #如果包含空格,替换时加上空格,如果不处理会有问题(字符串格式与其他地方不一致)
- if search_str_inSource is not None:
- str_equalSource=re.sub(str_inSource,'%s%s%s'%(search_time_str,search_str_inSource.group(),time_str),
- str_in)#将输入的时间戳替换为需要的时间戳,并加上匹配出来得空格
- else:
- str_equalSource=re.sub(str_inSource,'%s%s'%(search_time_str,time_str),
- str_in)#将输入的时间戳替换为需要的时间戳
- input_list_source=str_equalSource.split('\n')#以换行符分隔字符串并转换位列表
- input_list=[a for a in input_list_source
- if (search_sign_str or '%s\s'%(search_sign_str) ) not in a]#列表过滤字段sign
- out_list=sorted(input_list)#对list进行排序
- out_str='\n'.join(out_list)#将排序后的list拼接为字符串
- input_sign_str=self.requestDataToStr_firefoxAndChrome(out_str,'','').decode()#获取拼接完成后的请求参数字符串(sign)
- '''这个方法默认对请求参数进行了编码处理,所以这里需手动解码'''
- out_sign_str=self.sha1_Encry(input_sign_str)#得到加密后的加密字符串
- str_inSource_sign=re.search('(%s.+)'%(search_sign_str),str_in)#匹配字段签名验证(sign)
- if str_inSource_sign is not None:
- str_inSource_sign=str_inSource_sign.group()
- search_inSource_sign=re.search('\s',str_inSource)
- #匹配sign,key与value是否包含空格
- #如果包含空格,替换时加上空格,如果不处理会有问题(字符串格式与其他地方不一致)
- if search_inSource_sign is not None:
- str_last_sign=re.sub(str_inSource_sign,'%s%s%s'%(search_sign_str,search_inSource_sign.group(),
- out_sign_str),str_equalSource)#将输入的时间戳替换为需要的时间戳
- else:
- str_last_sign=re.sub(str_inSource_sign,'%s%s'%(search_sign_str,out_sign_str),
- str_equalSource)#将输入的时间戳替换为需要的时间戳
- # print(str_last_sign)
- str_give=self.requestDataToStr_firefoxAndChrome(str_last_sign)
- # print(str_give)
- return str_give
- else:
- print('输入字符串没有sign对象:sign,无法完成数据转换')
- return None
- else:
- print('输入字符串没有时间戳对象:timestamp,无法完成数据转换')
- return None
- #字符串进行sha1算法加密方法
def sha1_Encry(self,str_in,Encay_strOne=Encay_str):#对字符串进行加密- str_out=hashlib.sha1() #采用sha1加密
- str_out.update(str('%s%s'%(str_in,Encay_str)).encode(encoding='utf-8'))
- return str_out.hexdigest()
- #输出13位时间戳方法
def get_timestamp(self):#输出当前时间的13位时间戳- current_milli_time = lambda: int(round(time.time() * 1000))#输出13位时间戳,round:对浮点数进行四舍五入
- return str(current_milli_time())
- #字符串格式处理方法
def requestDataToStr_firefoxAndChrome(self,str_in,space_one='=',space_two='&'):- try:
- str_colon=re.search(':\W?|\s*:\W?',str_in) #匹配出字符串中所有的冒号
- if not str_colon==None:
- str_colon=str_colon.group()
- str_equal=re.sub(str_colon,space_one,str_in) #将字符串中的冒号替换为等于号(: >>> =)
- str_lin=re.search("(\s\n*){2,}|(\s\n*)",str_equal) #匹配出字符串中所有的换行符与空格,不写表示不限定匹配次数
- if not str_lin==None:
- str_lin=str_lin.group()
- str_give=re.sub(str_lin,space_two,str_equal) #将字符串中的换行符替换为& (\n >>> &)
- str_lin2=re.search('\s.*',str_give)
- if str_lin2 is not None:
- str_lin2=str_lin2.group()
- str_lin3=re.search('=',str_lin2)
- if str_lin3 is not None and 'time' in str_give: #对请求参数含有时间字段进行特殊处理
- try:
- str_lin3=str_lin3.group()
- str_give2=re.sub(str_lin3,':',str_lin2)
- str_give3=re.sub(str_lin2,str_give2,str_give)
- # print(str_give3)
- return str_give3.encode() #返回字符串,并对数据进行编码处理
- except Exception as error:
- print(error)
- else:
- # print(str_give)
- return str_give.encode()
- else:
- # print(str_give)
- return str_give.encode()
- else:
- return str_equal.encode()
- else:
- print("字符串格式匹配错误")
- return None
- except Exception as error:
- print("数据处理失败,原因为:\n%s"%(error))
写这个方法的时候遇到了一些问题,所以各位再实践的过程中一定要细心,字符串处理时一定要注意对空格的处理,最好保持格式的统一(参数替换时如果其他参数带有空格,替换时不要全给替换掉了,因为正则匹配时匹配不到就会使转换后的字符串达不到预期效果,看后续能不能想到更好的解决方法把),这样能避免一些问题
python完成加密参数sign计算并输出指定格式的字符串的更多相关文章
- 使用printf输出各种格式的字符串( 转载)
1. 原样输出字符串: printf("%s", str); 2. 输出指定长度的字符串, 超长时不截断, 不足时右对齐: printf("%Ns" ...
- Java 输出指定编码的字符串
Java Sting类有个根据byte,字符编码来输出的构造函数.以下为java文档中的解释.public String(byte[] bytes, String charsetName) throw ...
- 爬虫破解js加密(一) 有道词典js加密参数 sign破解
在爬虫过程中,经常给服务器造成压力(比如耗尽CPU,内存,带宽等),为了减少不必要的访问(比如爬虫),网页开发者就发明了反爬虫技术. 常见的反爬虫技术有封ip,user_agent,字体库,js加密, ...
- Python学习(三) 输出任意格式的字符串以及字符串的切片
在Python中想要输出一句话,如下 a='hello world' print a //打印出的是hello world print 'hello \n world' //打印出的是 //hello ...
- Python读取文本,输出指定中文(字符串)
因业务需求,需要提取文本中带有检查字样的每一行. 样本如下: 1 投入10kVB.C母分段820闭锁备自投压板 2 退出10kVB.C母分段820备投跳803压板 3 退出10kVB.C母分段820备 ...
- Python中将(字典,列表等)变量格式化成字符串输出
比如原始的List变量的值是这种: [{"]}] 而想要将其输出为带缩进的,树状的,很漂亮的效果,那么可以通过这样的方法: import json #demoDictList is the ...
- python print的参数介绍
参考print的官方文档 print(...) print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False) Prints th ...
- Week08_day01 (Hive实现按照指定格式输出每七天的消费平均数)
Hive实现按照指定格式输出每七天的消费平均数 数据准备 2018/6/1,10 2018/6/2,11 2018/6/3,11 2018/6/4,12 2018/6/5,14 2018/6/6,15 ...
- python json.dumps()函数输出json格式,使用indent参数对json数据格式化输出
在python中,要输出json格式,需要对json数据进行编码,要用到函数:json.dumps json.dumps() :是对数据进行编码 #coding=gbkimport json dict ...
随机推荐
- 浅析 Java 中的继承和重写
浅析 Java 中的继承和重写 Java 中的构造方法不能被继承. Java 中 static 修饰的方法可以被继承,但不能被子类重写. Java 中 final 修饰方法不允许被子类重写,但是可以被 ...
- Java开发笔记(一百四十九)引入预报告的好处
前面介绍了各种SQL语句的调用过程,虽然例子代码写死了每个SQL串,但是完全可以把查询条件作为方法参数传进来.比如现在想删除某个课程的教师记录,那么在编写删除方法时,就把课程名称作为该方法的一个输入参 ...
- STL源码剖析——序列式容器#3 Deque
Deque是一种双向开口的连续线性空间.所谓的双向开口,就是能在头尾两端分别做元素的插入和删除,而且是在常数的时间内完成.虽然Vector也可以在首端进行元素的插入和删除(利用insert和erase ...
- 【Tyvj2046】掷骰子
好水一道题 掷骰子Description Rainbow和Freda通过一次偶然的机会来到了魔界.魔界的大门上赫然写着:小盆友们,欢迎来到魔界~!乃们需要解决这样一个问题才能进入哦lala~有N枚骰子 ...
- day54——jquery补充、bootstrap
day54 jquery 页面载入 window.onload: 原生js的window.onload事件:// onload 等待页面所有内容加载完成之后自动触发的事件 window.onload ...
- golang 之 sql
golang提供了sql包查询数据 建立连接 导入第三方包 import( "database/sql" _"github.com/go-sql-driver/mysql ...
- Locust性能测试-参数化批量注册
前言 实现场景:所有并发虚拟用户共享同一份测试数据,并且保证虚拟用户使用的数据不重复. 例如,模拟10用户并发注册账号,总共有100个手机号,要求注册账号不重复,注册完毕后结束测试 准备数据 虚拟用户 ...
- 微信小程序与Django<一>
小程序开发的准备工作 1. 小程序开发者账号 a) 邮箱注册 b) 开发者配置与AppID c) https://mp.weixin.qq. ...
- HBase 系列(三)—— HBase 基本环境搭建
一.安装前置条件说明 1.1 JDK版本说明 HBase 需要依赖 JDK 环境,同时 HBase 2.0+ 以上版本不再支持 JDK 1.7 ,需要安装 JDK 1.8+ .JDK 安装方式见本仓库 ...
- busybox测试dns问题
获取svc [root@master01 ~]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL- ...