from urllib import parse
url='http://www.baidu.com?qurey=python基础教程 @@@'
# url_str=parse.quote_plus(url) #url编码
print(parse.quote_plus(url))
from urllib import parse
baidu_url='https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&rsv_idx=1
&tn=baidu&wd=python%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B&
oq=python&rsv_pq=b6c92ffc00023232&rsv_t=be4d%2FdgIVLHbmdj5jU9bfpJTXGIAcO4y2u
%2BfKsxWWJW2wIKbEuXL6tNXiug&rqlang=cn&rsv_enter=1&inputT=878&
rsv_sug3=9&rsv_sug1=3&rsv_sug7=100&rsv_sug2=0&
prefixsug=python&rsp=1&rsv_sug4=2134&rsv_sug=1'
print(parse.unquote_plus(baidu_url)) #url解码
# 1、请求数据获取到
# 2、提取到商家编码
# 3、将商家编码进程2次md5 得到astr
# 4、再将请求数据进行一次urldecode,urlstr
# 5、astr+url_str MD5
from urllib import parse
import hashlib
def my_md5(s):
md=hashlib.md5()
md.update(s.encode()) #加密必须传btye类型
return md.hexdigest()
def get_vendorid(req_data):
data_dict={}
sub_list=req_data.split('&')
#['vendorId=1697', 'posCode=pos006', 'ip=127.0.0.1', 'posVersion=2.1.1.1.1']
for i in sub_list:
k,v=i.split('=')
#[verid,1607]
# data_dict.setdefault(k,v)
data_dict[k]=v #{'posVersion': '2.1.1.1.1', 'vendorId': '1697'……}
return data_dict.get('vendorId')
def sign(req_data):
verid=get_vendorid(req_data) #调用获取veriodid函数
first=my_md5(verid)
astr=my_md5(first) #两次MD5
url_str=parse.quote_plus(req_data) #url编码
res=my_md5(astr+url_str)
return res
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'
print(sign(s))
#方法二 用类来写
from urllib import parse
import hashlib
class Sign(object): #定义类名,新式类
def __init__(self,req_data):
self.req_data=req_data #这写了self的话,在其他函数里面了可以用self.xx
self.ger_verid()
self.get_sign()
def md5(self,s):
md = hashlib.md5()
md.update(s.encode())
return md.hexdigest()
def ger_verid(self):
data_dict = {}
sub_list = self.req_data.split('&')
# [vendorId=1697,posCode=pos006]
for i in sub_list:
k, v = i.split('=')
data_dict[k] = v
self.verid= data_dict.get('vendorId')
def get_sign(self):
first = self.md5(self.verid)
astr = self.md5(first) # 两次MD5
url_str = parse.quote_plus(self.req_data) # url编码
self.sign = self.md5(astr + url_str)
return self.sign
print('__nam__',__name__)
if __name__ =='__main__':
# 判断这个python是在别的地方导入的,还是直接运行的这个python文件
# 这句话一般是做调试的时候用的。
# 1、如果是直接运行这个python文件的时候,这句话一点用都没有
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'
abc=Sign(s)
print(abc.sign)
# abc.get_sign()
# print(abc.sign)
# print('我是sign')