zoukankan      html  css  js  c++  java
  • 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

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

    from urllib import parse
    import hashlib
    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
  • 相关阅读:
    IOS 沙盒机制 浅析
    IOS CALayer(二)
    IOS CALayer(一)
    IOS 二维码扫描
    IOS 二维码生成
    UIView属性
    JSON 与 XML 的比较
    Xcode 中 pch 文件配置
    Error:linker command failed with exit code 1 (use -v to see invocation)
    开发常用宏
  • 原文地址:https://www.cnblogs.com/emilyliu/p/9096630.html
Copyright © 2011-2022 走看看