簡介
前面雖然實現了引數的關聯,但是那種只是記流水賬的完成功能,不便於維護,也沒什麼可讀性,隨著水平和技能的提升,再返回頭去看前邊寫的程式碼,簡直是慘不忍睹那樣的程式碼是初級入門的程式碼水平都達不到。接下來這篇由我帶領小夥伴們把每一
個滑鼠點選動作寫成一個函式,這樣更方便維護了,而且可讀性也高,後期其他維護人員在維護程式碼的時候看起來賞心悅目,就不會罵娘了。
引數化的思維只需記住一點:不要寫死,這樣就便於維護,否則就會牽一髮而動全身,一處修改導致處處修改,不便於維護。
登入函式
1、s 引數是 session 的一個例項類,先放這裡,方便寫後面程式碼
2、登入函式傳三個引數,s 是需要呼叫前面的 session 類,所以必傳,可以傳個登入的 url,然後 payload 是賬號和密碼
儲存草稿
1、編輯內容的標題 title 和正文 body_data 引數化了,這樣後面可以方便傳不同值
2、這裡返回了獲取到新的 url 地址,因為後面的 postid 引數需要在這裡提取
提取 postid
1、這裡用正規表示式提取 url 裡面的 postid
刪除草稿
1、傳個 url 和 postid 就可以了
參考程式碼
1 # coding=utf-8 2 #1.先設定編碼,utf-8可支援中英文,如上,一般放在第一行 3 4 #2.註釋:包括記錄建立時間,建立人,專案名稱。 5 ''' 6 Created on 2019-5-13 7 @author: 北京-巨集哥 8 Project:學習和使用封裝與呼叫--函式和引數化 9 ''' 10 #3.匯入模組 11 import requests 12 13 def login(s, url, payload): 14 15 headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0", 16 17 "Accept": "application/json, text/javascript, */*; q=0.01", 18 "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3", 19 "Accept-Encoding": "gzip, deflate, br", 20 "Content-Type": "application/json; charset=utf-8", 21 "X-Requested-With": "XMLHttpRequest", 22 "Content-Length": "385", 23 "Cookie": "xxx 已省略", 24 "Connection": "keep-alive" 25 } 26 r = s.post(url, json=payload, headers=headers, verify=False) 27 result = r.json() 28 print (result) 29 return result['success'] # 返回 True 或 False 30 31 def save_box(s, url2, title, body_data): 32 '''# 獲取報存之後 url 地址''' 33 body = {"__VIEWSTATE": "", 34 "__VIEWSTATEGENERATOR": "FE27D343", 35 "Editor$Edit$txbTitle": title, 36 "Editor$Edit$EditorBody": "<p>"+body_data+"</p>", 37 "Editor$Edit$Advanced$ckbPublished": "on", 38 "Editor$Edit$Advanced$chkDisplayHomePage": "on", 39 "Editor$Edit$Advanced$chkComments": "on", 40 "Editor$Edit$Advanced$chkMainSyndication": "on", 41 "Editor$Edit$lkbDraft": "存為草稿", 42 } 43 r2 = s.post(url2, data=body, verify=False) 44 print(r2.url) 45 return r2.url 46 def get_postid(u): 47 '''正則提取 postid''' 48 import re 49 postid = re.findall(r"postid=(.+?)&", u) 50 print (postid) # 這裡是 list 51 if len(postid) < 1: 52 return '' 53 else: 54 return postid[0] 55 def delete_box(s,url3, postid): 56 '''刪除草稿箱''' 57 json3 = {"postId": postid} 58 r3 = s.post(url3, json=json3, verify=False) 59 print (r3.json()) 60 if __name__ == "__main__": 61 #-------------由於部落格園的登入機制改變這部分程式碼僅作為參考start------- 62 ''' 63 #登入url 64 url = "https://passport.cnblogs.com/user/signin" 65 payload = { 66 "input1": "xxx", 67 "input2": "xxx", 68 "remember": True 69 } 70 s = requests.session() 71 login(s, url, payload) 72 ''' 73 # -------------由於部落格園的登入機制改變這部分程式碼僅作為參考end------- 74 75 #編輯隨筆url 76 url2 = "https://i.cnblogs.com/EditPosts.aspx?opt=1" 77 u = save_box(s, url2, "北京-巨集哥學習和使用封裝與呼叫--函式和引數化", "1、學習和使用封裝與呼叫--函式和引數化") 78 postid = get_postid(u) 79 # 刪除隨筆url 80 url3 = "https://i.cnblogs.com/post/delete" 81 delete_box(s, url3, postid)
由於部落格園的登入機制改變,我們想要讓程式碼跑起來還需要用老辦法繞過驗證碼通過cookie登入替換登入這個動作
改造程式碼如下
第一步:將登入方法註釋掉
第二步:將登入方法所傳的引數和呼叫登入的方法註釋掉
第三步:通過cookie登入繞過驗證碼,實現登入
第五步:直接執行程式碼,檢視結果
第六步:由於我們新增又刪除,所以看到的介面看到的效果還是不太明顯,為了讓小夥伴們看到明顯效果,我們這裡還是通過老方法:打斷點
第七步:在呼叫刪除隨筆的方法前打斷點,雙擊方法前邊出現一個大紅點
第八步:debug執行程式碼,點選右上角的昆蟲
第九步:瀏覽器登入檢視隨筆頁面
postid
第十步:繼續執行。執行刪除隨筆的方法
程式碼執行結果
第十一步:重新整理隨筆頁面,檢視剛剛新增的那條隨筆消失了
改造後參考程式碼
1 # coding=utf-8 2 #1.先設定編碼,utf-8可支援中英文,如上,一般放在第一行 3 4 #2.註釋:包括記錄建立時間,建立人,專案名稱。 5 ''' 6 Created on 2019-5-13 7 @author: 北京-巨集哥 8 Project:學習和使用封裝與呼叫--函式和引數化 9 ''' 10 #3.匯入模組 11 import requests 12 # # 先開啟登入首頁,獲取部分cookie 13 # url = "https://passport.cnblogs.com/user/signin" 14 # # 登入成功後儲存編輯內容 15 # url2= "https://i.cnblogs.com/EditPosts.aspx?opt=1" 16 # s = requests.session() #s引數作為全域性變數 17 #-------------由於部落格園的登入機制改變這部分程式碼僅作為參考start------- 18 ''' 19 def login(s, url, payload): 20 21 headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0", 22 23 "Accept": "application/json, text/javascript, */*; q=0.01", 24 "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3", 25 "Accept-Encoding": "gzip, deflate, br", 26 "Content-Type": "application/json; charset=utf-8", 27 "X-Requested-With": "XMLHttpRequest", 28 "Content-Length": "385", 29 "Cookie": "xxx 已省略", 30 "Connection": "keep-alive" 31 } 32 r = s.post(url, json=payload, headers=headers, verify=False) 33 result = r.json() 34 print (result) 35 return result['success'] # 返回 True 或 False 36 ''' 37 # -------------由於部落格園的登入機制改變這部分程式碼僅作為參考end------- 38 def save_box(s, url2, title, body_data): 39 '''# 獲取報存之後 url 地址''' 40 body = {"__VIEWSTATE": "", 41 "__VIEWSTATEGENERATOR": "FE27D343", 42 "Editor$Edit$txbTitle": title, 43 "Editor$Edit$EditorBody": "<p>"+body_data+"</p>", 44 "Editor$Edit$Advanced$ckbPublished": "on", 45 "Editor$Edit$Advanced$chkDisplayHomePage": "on", 46 "Editor$Edit$Advanced$chkComments": "on", 47 "Editor$Edit$Advanced$chkMainSyndication": "on", 48 "Editor$Edit$lkbDraft": "存為草稿", 49 } 50 r2 = s.post(url2, data=body, verify=False) 51 print(r2.url) 52 return r2.url 53 def get_postid(u): 54 '''正則提取 postid''' 55 import re 56 postid = re.findall(r"postid=(.+?)&", u) 57 print (postid) # 這裡是 list 58 if len(postid) < 1: 59 return '' 60 else: 61 return postid[0] 62 def delete_box(s,url3, postid): 63 '''刪除草稿箱''' 64 json3 = {"postId": postid} 65 r3 = s.post(url3, json=json3, verify=False) 66 print (r3.json()) 67 if __name__ == "__main__": 68 #-------------由於部落格園的登入機制改變這部分程式碼僅作為參考start------- 69 ''' 70 #登入url 71 url = "https://passport.cnblogs.com/user/signin" 72 payload = { 73 "input1": "xxx", 74 "input2": "xxx", 75 "remember": True 76 } 77 s = requests.session() 78 login(s, url, payload) 79 ''' 80 # -------------由於部落格園的登入機制改變這部分程式碼僅作為參考end------- 81 url = "https://passport.cnblogs.com/user/signin" 82 headers = { 83 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0" 84 } # get方法其它加個ser-Agent就可以了 85 s = requests.session() 86 r = s.get(url, headers=headers, verify=False) 87 print(s.cookies) 88 # 新增登入需要的兩個cookie 89 c = requests.cookies.RequestsCookieJar() 90 c.set('.CNBlogsCookie', 91 'XXX') # 填上面抓包內容 具體檢視前邊的cookie登入,這裡不贅述 92 c.set('.Cnblogs.AspNetCore.Cookies', 93 'XXX') # 填上面抓包內容 具體檢視前邊cookie登入,這裡不贅述 94 c.set('AlwaysCreateItemsAsActive', "True") 95 c.set('AdminCookieAlwaysExpandAdvanced', "True") 96 s.cookies.update(c) 97 print(s.cookies) 98 result = r.content 99 100 #編輯隨筆url 101 url2 = "https://i.cnblogs.com/EditPosts.aspx?opt=1" 102 u = save_box(s, url2, "北京-巨集哥學習和使用封裝與呼叫--函式和引數化", "1、學習和使用封裝與呼叫--函式和引數化") 103 postid = get_postid(u) 104 # 刪除隨筆url 105 url3 = "https://i.cnblogs.com/post/delete" 106 delete_box(s, url3, postid)
小結
1、封裝好處:
第一:重用;
第二:不必關心具體的實現;
第三:物件導向三大特徵之一;
第四,具有安全性!
2、哈哈,各位小夥伴們,封裝與呼叫--函式和引數化就是這麼簡單!!!小編能力有限歡迎各位批評指正。