python接口自動化(三十四)-封裝與調用--函數和參數化(詳解)

簡介

  前面雖然實現了參數的關聯,可是那種只是記流水帳的完成功能,不便於維護,也沒什麼可讀性,隨着水平和技能的提高,再返回頭去看前邊寫的代碼,簡直是慘不忍睹那樣的代碼是初級入門的代碼水平都達不到。接下來這篇由我帶領小夥伴們把每一javascript

個鼠標點擊動做寫成一個函數,這樣更方便維護了,並且可讀性也高,後期其餘維護人員在維護代碼的時候看起來賞心悅目,就不會罵娘了。java

  參數化的思惟只需記住一點:不要寫死,這樣就便於維護,不然就會牽一髮而動全身,一處修改致使到處修改,不便於維護。正則表達式

登陸函數

一、s 參數是 session 的一個實例類,先放這裏,方便寫後面代碼json

二、登陸函數傳三個參數,s 是須要調用前面的 session 類,因此必傳,能夠傳個登陸的 url,而後 payload 是帳號和密碼
瀏覽器

保存草稿

一、編輯內容的標題 title 和正文 body_data 參數化了,這樣後面能夠方便傳不一樣值安全

二、這裏返回了獲取到新的 url 地址,由於後面的 postid 參數須要在這裏提取cookie

提取 postid

一、這裏用正則表達式提取 url 裏面的 postidsession

刪除草稿

一、傳個 url 和 postid 就能夠了app

參考代碼

 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, "北京-宏哥學習和使用封裝與調用--函數和參數化", "一、學習和使用封裝與調用--函數和參數化")
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, "北京-宏哥學習和使用封裝與調用--函數和參數化", "一、學習和使用封裝與調用--函數和參數化")
103  postid = get_postid(u)
104  # 刪除隨筆url
105  url3 = "https://i.cnblogs.com/post/delete"
106  delete_box(s, url3, postid)

小結

一、封裝好處:

第一:重用;

第二:沒必要關心具體的實現;

第三:面向對象三大特徵之一;

第四,具備安全性!

二、哈哈,各位小夥伴們,封裝與調用--函數和參數化就是這麼簡單!!!小編能力有限歡迎各位批評指正。

相關文章
相關標籤/搜索