基于python實(shí)現(xiàn)數(shù)組格式參數(shù)加密計(jì)算
代碼示例
#輸入 '''order_id:31489 join_course[0][join_tel]:13130999882 join_course[0][join_name]:任學(xué)雨 join_course[0][join_card_afterfour]:043X join_course[0][join_school]:銘博教育咨詢 join_course[1][join_tel]:13130999883 join_course[1][join_name]:任學(xué)雨 join_course[1][join_card_afterfour]:043X join_course[1][join_school]:銘博教育咨詢 join_course[2][join_tel]:13130999884 join_course[2][join_name]:任學(xué)雨 join_course[2][join_card_afterfour]:043X join_course[2][join_school]:銘博教育咨詢 join_course[3][join_tel]:13130999885 join_course[3][join_name]:任學(xué)雨 join_course[3][join_card_afterfour]:043X join_course[3][join_school]:銘博教育咨詢 timestamp:1574921552698 sign:8936b324e417b31d97f0c3e9a904dssss3''' #輸出 join_course[{"join_tel":"13130999882","join_name":"任學(xué)雨","join_card_afterfour":"043X","join_school":"銘博教育咨詢"},{"join_tel":"13130999883","join_name":"任學(xué)雨","join_card_afterfour":"043X","join_school":"銘博教育咨詢"},{"join_tel":"13130999884","join_name":"任學(xué)雨","join_card_afterfour":"043X","join_school":"銘博教育咨詢"},{"join_tel":"13130999885","join_name":"任學(xué)雨","join_card_afterfour":"043X","join_school":"銘博教育咨詢"}]order_id31489timestamp1575001757726994(str_encrypt)固定加密字符串
大概思路:
1.將輸入字符串切割為list
2.提取數(shù)組指定參數(shù)
3.提取除sign之外的非數(shù)組指定參數(shù)并排序(asicc碼排序)
4.處理數(shù)組參數(shù)拼接問(wèn)題(先處理數(shù)組內(nèi)參數(shù),將key與value轉(zhuǎn)換為字典,再將字典添加至list,最后拼接字符串'join_course‘,拼接非數(shù)組參數(shù)與加密字符串)
5.計(jì)算加密字符串sign并提取輸入的字符串
6.拼接最終的字符串,并處理請(qǐng)求數(shù)據(jù)格式
def fwh_sign_sha1_Array(self,str_in):#服務(wù)請(qǐng)求簽名處理封裝(請(qǐng)求格式為數(shù)組時(shí)的封裝) search_time_str='timestamp:' search_sign_str='sign:' str_inSource=re.search('(%s.+)'%(search_time_str),str_in)#匹配字段時(shí)間戳(timestamp) if str_inSource is not None: time_str=self.get_timestamp()#最終需要的時(shí)間戳,13位 str_inSource=str_inSource.group() search_str_inSource=re.search('\s',str_inSource) #匹配時(shí)間戳,key與value是否包含空格 #如果包含空格,替換時(shí)加上空格,如果不處理會(huì)有問(wèn)題(字符串格式與其他地方不一致) 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)#將輸入的時(shí)間戳替換為需要的時(shí)間戳,并加上匹配出來(lái)得空格 else: str_equalSource=re.sub(str_inSource,'%s%s'%(search_time_str,time_str), str_in)#將輸入的時(shí)間戳替換為需要的時(shí)間戳 input_list_source=str_equalSource.split('\n')#以換行符分隔字符串并轉(zhuǎn)換位列表 input_list=[a for a in input_list_source if (search_sign_str or '%s\s'%(search_sign_str) ) not in a]#列表過(guò)濾字段sign out_str='\n'.join(input_list)#將排序后的list拼接為字符串 out_list_join_course=[a for a in input_list if ('[' and ']') in a ]#去除數(shù)組外的其他參數(shù) input_list_other=sorted([a for a in input_list if ('[' or ']') not in a ])#獲取數(shù)組外的其他參數(shù)并排序 input_list_other_str='\n'.join(input_list_other)#將排序后的list拼接為字符串 input_out_list_other_str=self.requestDataToStr_firefoxAndChrome(input_list_other_str,'','').decode()#獲取拼接完成后的請(qǐng)求參數(shù)字符串(sign) join_course_list=[]#數(shù)組 join_course_dict={}#數(shù)組中的dict for index,i in enumerate(out_list_join_course): join_course_index=i.find('[') join_course=i[:join_course_index]#匹配join_course Array_index=i[join_course_index:].find(']')#匹配[index]的下標(biāo) Array=i[join_course_index:][:Array_index+1]#取出[index] Array_key_data=i[join_course_index:][Array_index+1:]#取出[0]后面的值 search_colon=Array_key_data.find(':')#匹配出冒號(hào)的index Array_key=Array_key_data[1:search_colon-1]#匹配key(冒號(hào)前面的值)并去除[] Array_value=Array_key_data[search_colon+1:]#匹配value(冒號(hào)后面的值) join_course_dict[Array_key]=Array_value#將匹配出來(lái)的key與value添加至dict if index+1<len(out_list_join_course): #判斷上一個(gè)元素的部分內(nèi)容(索引前的內(nèi)容)是否包含于list下一個(gè)元素的內(nèi)容 #(如果不包含那么說(shuō)明當(dāng)前元素就是本組數(shù)據(jù)的最后一個(gè),此時(shí)將dict添加至對(duì)應(yīng)的list) #并清空字典(不清除會(huì)導(dǎo)致最終插入的值是重復(fù)的,因?yàn)閗ey是一樣的) if join_course+Array not in(out_list_join_course[index+1]): join_course_list.append(join_course_dict) join_course_dict={} else:#如果當(dāng)前元素是list中的最后一個(gè)元素那么直接添加將dict至對(duì)應(yīng)的list join_course_list.append(join_course_dict) join_course_dict={} #將list里面的數(shù)組轉(zhuǎn)換為json格式,這里只能對(duì)list進(jìn)行使用,不用對(duì)數(shù)組中的dict使用 #ensure_ascii:防止中文被轉(zhuǎn)義,separators:去除字符串中多余的空格 join_course_list=json.dumps(join_course_list,ensure_ascii=False,separators=(',', ':')) #拼接加密前的請(qǐng)求字符串,用換行符區(qū)分?jǐn)?shù)組參數(shù)與非數(shù)組參數(shù)(目的是方便轉(zhuǎn)換為list) join_course_str=join_course+str(join_course_list)+'\n'+input_out_list_other_str join_course_str_list=sorted(join_course_str.split('\n'))#對(duì)list進(jìn)行排序處理 join_course_last_str=''.join(join_course_str_list)#對(duì)排序后的list拼接為字符串 out_sign_str=self.sha1_Encry(join_course_last_str)#得到加密后的加密字符串 str_inSource_sign=re.search('(%s.+)'%(search_sign_str),str_in)#匹配字段簽名驗(yàn)證(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是否包含空格 #如果包含空格,替換時(shí)加上空格,如果不處理會(huì)有問(wèn)題(字符串格式與其他地方不一致) 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)#將輸入的時(shí)間戳替換為需要的時(shí)間戳 else: str_last_sign=re.sub(str_inSource_sign,'%s%s'%(search_sign_str,out_sign_str), str_equalSource)#將輸入的時(shí)間戳替換為需要的時(shí)間戳 # print(str_last_sign) str_give=self.requestDataToStr_firefoxAndChrome(str_last_sign) return str_give else: print('輸入字符串沒(méi)有sign對(duì)象:sign,無(wú)法完成數(shù)據(jù)轉(zhuǎn)換') return None else: print('輸入字符串沒(méi)有時(shí)間戳對(duì)象:timestamp,無(wú)法完成數(shù)據(jù)轉(zhuǎn)換') return None
期間遇到的問(wèn)題:
1.dict的單引號(hào)在使用json解析時(shí)會(huì)出問(wèn)題,需要轉(zhuǎn)換為雙引號(hào)("),使用json.dumps可處理為這樣的格式
2.json.dumps方法的問(wèn)題:1.中文會(huì)自動(dòng)轉(zhuǎn)義,需指定參數(shù)ensure_ascii=false,默認(rèn)時(shí)true;2.轉(zhuǎn)換是會(huì)自動(dòng)產(chǎn)生空格,然而開發(fā)加密時(shí)沒(méi)有空格,需要去掉,需指定參數(shù)separators=(',', ':')
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python 輸出列表元素實(shí)例(以空格/逗號(hào)為分隔符)
今天小編就為大家分享一篇python 輸出列表元素實(shí)例(以空格/逗號(hào)為分隔符),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12Python中g(shù)etpass模塊無(wú)回顯輸入源碼解析
這篇文章主要介紹了Python中g(shù)etpass模塊無(wú)回顯輸入源碼解析,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01Python局部函數(shù)及用法詳解(含nonlocal關(guān)鍵字)
局部函數(shù)有哪些特征,在使用時(shí)需要注意什么呢?接下來(lái)就給讀者詳細(xì)介紹?Python?局部函數(shù)的用法,對(duì)Python局部函數(shù)相關(guān)知識(shí)感興趣的朋友跟隨小編一起看看吧2022-12-12Pycharm無(wú)法正常安裝第三方庫(kù)的幾條應(yīng)對(duì)方法匯總
在使用pycharm學(xué)習(xí)python的時(shí)候,經(jīng)常需要第三方庫(kù),沒(méi)有第三方庫(kù)程序就會(huì)報(bào)錯(cuò),下面這篇文章主要給大家介紹了關(guān)于Pycharm無(wú)法正常安裝第三方庫(kù)的幾條應(yīng)對(duì)方法,需要的朋友可以參考下2023-04-04python for循環(huán)輸入一個(gè)矩陣的實(shí)例
今天小編就為大家分享一篇python for循環(huán)輸入一個(gè)矩陣的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11Python利用atexit模塊實(shí)現(xiàn)優(yōu)雅處理程序退出
Python的atexit模塊提供了一種方便的方式來(lái)注冊(cè)這些退出時(shí)執(zhí)行的函數(shù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03python unichr函數(shù)知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家整理的是一篇關(guān)于python unichr函數(shù)的知識(shí)點(diǎn)總結(jié)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2020-12-12基于keras輸出中間層結(jié)果的2種實(shí)現(xiàn)方式
今天小編就為大家分享一篇基于keras輸出中間層結(jié)果的2種實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01python 寫函數(shù)在一定條件下需要調(diào)用自身時(shí)的寫法說(shuō)明
這篇文章主要介紹了python 寫函數(shù)在一定條件下需要調(diào)用自身時(shí)的寫法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06