python学习(二十八)URL编码和解码&签名规则需求练习

1、url编码和url解码

打开浏览器,输入"python基础教程",点击搜索后,地址栏会有一长串的类似于 %DFBGN这种 就是url编码对应的搜索内容,具体如下:

https://www.so.com/s?q=python%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B&src=srp&fr=360chrome_newtab_search&psid=9fcfb50581a9a0358a7459af7832c302

那么如何用代码来进行url编码和url解码呢

from urllib import parse
url=‘http://www.baidu.com?query=python基础教程‘
url_str=parse.quote_plus(url)   #url编码
print(url_str)
baidu_url=‘https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=06074089_4_pg&wd=python%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B&oq=python%25E5%259F%25BA%25E7%25A1%2580%25E6%2595%2599%25E7%25A8%258B&rsv_pq=bc14fc45000148d3&rsv_t=1cc4H7YnCOtNC5%2FEjW6ufW%2FaB8kLFjbeoWXNaE8ogbhH8tOwWQhoY4bKRcKPQ6XRa2jquQ&rqlang=cn&rsv_enter=0‘
print(parse.unquote_plus(baidu_url))   #url解码

输出的结果为:

http%3A%2F%2Fwww.baidu.com%3Fquery%3Dpython%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B

https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=06074089_4_pg&wd=python基础教程&oq=python%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B&rsv_pq=bc14fc45000148d3&rsv_t=1cc4H7YnCOtNC5/EjW6ufW/aB8kLFjbeoWXNaE8ogbhH8tOwWQhoY4bKRcKPQ6XRa2jquQ&rqlang=cn&rsv_enter=0

解码后可以看出来搜索的是python基础教程

2、签名规则需求

需求如下:

A、输入数据:
1、请求数据:
vendorId=1697&posCode=pos006&ip=127.0.0.1&posVersion=2.1.1.1.1&mac=;D4-81-D7-CA-20-29;7C-67-A2-9A-06-05;7C-67-A2-9A-06-06;7C-67-A2-9A-06-09;00-00-00-00-00-0000E0
2:商家编码:
1697
B、计算规则:
1、将商家编码(vendorId)1697进行两次MD5加密得到一个字符串 Astr:09B764965CE4E92BED8BD3140E22D5CF
2、将请求数据
vendorId=1697&posCode=pos006&ip=127.0.0.1&posVersion=2.1.1.1.1&mac=;D4-81-D7-CA-20-29;7C-67-A2-9A-06-05;7C-67-A2-9A-06-06;7C-67-A2-9A-06-09;00-00-00-00-00-0000E0
进行urlDecode处理(编码格式为utf-8)得到一个字符串urlDecodeStr:
vendorId=1697&posCode=pos006&ip=127.0.0.1&posVersion=2.1.1.1.1&mac=;D4-81-D7-CA-20-29;7C-67-A2-9A-06-05;7C-67-A2-9A-06-06;7C-67-A2-9A-06-09;00-00-00-00-00-0000E0
3、urlDecodeStr + Astr 拼接得到一个待加密的字符串 beforeMD5
vendorId=1697&posCode=pos006&ip=127.0.0.1&posVersion=2.1.1.1.1&mac=;D4-81-D7-CA-20-29;7C-67-A2-9A-06-05;7C-67-A2-9A-06-06;7C-67-A2-9A-06-09;00-00-00-00-00-0000E009B764965CE4E92BED8BD3140E22D5CF
然后将 beforeMD5字符串进行加密得到最终的签名:
6F811B63B11D92BA4A359E6DC98EEE31

对以上需求进行分解,需要做的步骤如下:

1、请求数据获取到
2、提取商家编码
3、将商家编码进行两次MD5,得到astr
4、再将请求数据进行一次urldecode,得到url_str
5、astr+url_str进行 md5

接下来按照步骤进行代码编写


s = ‘vendorId=1697&posCode=pos006&ip=127.0.0.1&posVersion=2.1.1.1.1&mac=;D4-81-D7-CA-20-29;7C-67-A2-9A-06-05;7C-67-A2-9A-06-06;7C-67-A2-9A-06-09;00-00-00-00-00-0000E0‘
class Sign(object):
    def __init__(self,req_data):
        self.req_data=req_data  #这写了self的话,其他函数里面也可以用self.xx
        self.get_vendorid()   #在get_sign里面调用或者在此调用都可以
        self.get_sign()
    def md5(self,s):
        md = hashlib.md5()
        md.update(s.encode())
        return md.hexdigest()
    def get_vendorid(self):
        data_dict = {}
        sub_list = self.req_data.split(‘&‘)
        # [vendorId=1697,posCode=pos006,ip=127.0.0.1]
        for i in sub_list:
            k, v = i.split(‘=‘)
            data_dict[k] = v
        self.vendorid= data_dict.get(‘vendorId‘)
    def get_sign(self):
        #self.get_vendorid()
        first=self.md5(self.vendorid)
        astr=self.md5(first)
        url_str=parse.quote_plus(self.req_data)
        self.sign=self.md5(astr+url_str)
        return self.sign

看这段代码,首先这个类需要将请求数据作为参数传入,作为类变量。接下来几个函数,分别为MD5加密函数,这个在之前已经学习过了。

获取商家编码函数:

在获取商家编码函数时,先将请求数据根据&符号进行分割,分割后的结果是一个list,分割为:

[vendorId=1697,posCode=pos006,ip=127.0.0.1] (list的值后面还有,就不写了,主要是找第一个),再对这个list的元素按照=进行分割,

并把分割的结果存到字典里,这个时候vendorId就是key,1697就是value,然后从字典中取出vendorId的值1697

签名函数:

把获取的商家编码进行两次MD5加密,得到astr,再将请求的数据进行url编码,得到url_str,最后将astr+url_str进行MD5,就是需要的签名

因为构造函数是在实例化时就会执行,我们在构造函数里面就调用获取商家编码及签名函数,那么在实例化后,直接调用sign,就能输出签名

abc=Sign(s)
print(abc.sign)

当然也还是可以按照之前的方式,调用获取签名的函数

abc=Sign(s)
print(abc.get_sign())

输出结果都为:

2e8d260f14fc05a2881470504fb6f9d5

原文地址:https://www.cnblogs.com/emilyliu/p/9096630.html

时间: 2024-11-05 12:25:57

python学习(二十八)URL编码和解码&签名规则需求练习的相关文章

python接口自动化测试十三:url编码与解码

# url编码与解码 from urllib import parse url = 'http://zzk.cnblogs.com/s/blogpost?Keywords=中文' a = '中文' b = parse.quote(a)  # 转urlencode编码 print(b) print(parse.quote(b))   # 转第二次(若有需求) # 解码 c = '%E4%B8%AD%E6%96%87' d = parse.unquote(c) print(d) # 解码 f = '

笨办法学Python(二十八)

习题 28: 布尔表达式练习 上一节你学到的逻辑组合的正式名称是"布尔逻辑表达式(boolean logic expression)".在编程中,布尔逻辑可以说是无处不在.它们是计算机运算的基础和重要组成部分,掌握它们就跟学音乐掌握音阶一样重要. 在这节练习中,你将在 python 里使用到上节学到的逻辑表达式.先为下面的每一个逻辑问题写出你认为的答案,每一题的答案要么为 True 要么为 False.写完以后,你需要将python 运行起来,把这些逻辑语句输入进去,确认你写的答案是否

python 学习二十五天(python内置模块之序列化模块)

今日主要内容 1.python内置模块-序列化模块 python中的序列化模块 json 所有的编程语言都通用的序列化格式....它支持的数据类型非常有限 数字 字符串 列表 字典 pickle 只能在python语言的程序之间传递数据用的..pickle支持python中所有的数据类型 shelve python3.* 之后才有的 2.摘要模块---hashlib 3.一道经典面试题 第一.python内置模块---序列化 ***所有的导入模块都需要把import放在文件首位 什么叫序列化 能

学习二十八

七周二次课(3月20日)10.6 监控io性能10.7 free命令10.8 ps命令10.9 查看网络状态10.10 linux下抓包扩展tcp三次握手四次挥手 http://www.doc88.com/p-9913773324388.html 监控io性能ps命令 查看网络状态 linux下抓包 原文地址:http://blog.51cto.com/13583139/2089228

winform学习日志(二十八)----------将汉字转化为拼音,正则表达式和得到汉字的Unicode编码

一:上图,不清楚的看代码注解,很详细了 二:具体代码 窗体代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Text.RegularExpressio

马哥学习笔记二十八——nginx反向代理,负载均衡,缓存,URL重写及读写分离

Nginx反向代理 Nginx通过proxy模块实现反向代理功能.在作为web反向代理服务器时,nginx负责接收客户请求,并能够根据URI.客户端参数或其它的处理逻辑将用户请求调度至上游服务器上(upstream server).nginx在实现反向代理功能时的最重要指令为proxy_pass,它能够将location定义的某URI代理至指定的上游服务器(组)上.如下面的示例中,location的/uri将被替换为上游服务器上的/newuri. location /uri { proxy_pa

javaweb学习总结(二十八)——JSTL标签库之核心标签【转】

原文地址:javaweb学习总结(二十八)——JSTL标签库之核心标签 一.JSTL标签库介绍 JSTL标签库的使用是为弥补html标签的不足,规范自定义标签的使用而诞生的.使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码 二.JSTL标签库的分类 核心标签(用得最多) 国际化标签(I18N格式化标签) 数据库标签(SQL标签,很少使用) XML标签(几乎不用) JSTL函数(EL函数) 三.核心标签库使用说明 JSTL的核心标签库标签共13个,使用这些标签能够完成JSP页面的

angular学习笔记(二十八)-$http(6)-使用ngResource模块构建RESTful架构

ngResource模块是angular专门为RESTful架构而设计的一个模块,它提供了'$resource'模块,$resource模块是基于$http的一个封装.下面来看看它的详细用法 1.引入angular-resource.min.js文件 2.在模块中依赖ngResourece,在服务中注入$resource var HttpREST = angular.module('HttpREST',['ngResource']); HttpREST.factory('cardResource

angular学习笔记(二十八-附1)-$resource中的资源的方法

通过$resource获取到的资源,或者是通过$resource实例化的资源,资源本身就拥有了一些方法,比如$save,可以直接调用来保存该资源: 比如有一个$resource创建的服务: var service = angular.module('myRecipe.service',['ngResource']); service.factory('Recipe',['$resource',function($resource){ return $resource('/recipe/:id',