技術學得好,老婆加班少!
國慶本來打算好好休息下的,沒想到第一天就被領導的電話叫醒,說微信服務掛了,抓緊修復。
mmp…
這就是我老婆的第一天假期,問題修復後,老婆心有餘悸,一直手動在那測試微信服務,就是往他們公眾號發個訊息,看是不是能夠正常返回。
我看著心疼,立志要用技術手段實現微信介面的巡檢。
我先捋了下思路,技術實現的話,大概需要解決如下幾個問題:
1、微信後臺介面如何測試? 2、如何用 Python 實現? 3、如何及時獲取測試結果? 4、如何定時執行測試?
下面開始!
1 微信介面如何測試?
最開始,我比較鬧心的就是微信介面怎麼測,因為之前基本沒有接觸過。
我先去他們微信後臺找到了配置的服務介面資訊,然後又再往上各種找如何測試。
於是我打開了瀏覽器開發者工具,檢視後臺請求資訊:
然後,我用我們熟悉的 Postman 進行介面測試,果然,OK!
能夠得到我們想要的資料。
返回資料長這樣:
2 Python 如何實現介面測試?
經過上面的分析,如何測試介面,流程已經很清晰,我們接下來要做的就是資料解析。
由上圖可見,返回的其實是一個 HTML,我們想要的資料在其中的 resultData 變數中。
resultData 變數對應的是一個 json 資料,其中的 body
是我們最想要的內容,它還是一個 XML 格式的資料。
resultData 對應的資料如下(已經過 UrlDecode):
{
"status_line" : "200\tOK",
"header": ["Cache-Control: private",
"Date: Tue, 02 Oct 2018 07:50:50 GMT",
"X-Powered-By: ASP.NET",
"Set-Cookie: ASPSESSIONIDCCRCTCTQ=DPFLKAJBFOJLDAFAFNOCDDFI; path=\/",
"Server: WWW Server\/1.1",
"Content-Type: text\/html; Charset=utf-8",
"Content-Length: 270"],
"body": "<xml><ToUserName><![CDATA[xxx]]></ToUserName><FromUserName><![CDATA[xxx]]></FromUserName><CreateTime>2018/10/2 15:50:50</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[您所查詢的數碼不存在,請仔細確認,謹防假冒。]]></Content></xml>" ,
"hint": "請求成功"
}
因此,主要需要做的工作就是:
1、從返回資料中解析出 resultData 對應的資料;
2、從 body 資料中解析出 <Content>
標籤對應的內容;
## 解析 resultData
本來打算用 BeautifulSoup 解析返回的 HTML 資料,但是 resultData 其實是其中 js 程式碼中的一個變數,我不知道怎麼處理,於是想到了用正則直接解析字串。
需要做的就是用正則匹配出 resultData =
和 }
之間的內容。
參考正則:匹配兩個字串 A 與 B 中間的字串包含 A 但是不包含 B:
表示式: A.*?(?=B)
寫出來我們的正則就是:
pattern = re.compile(r'(?<=resultData = ).*?}')
看著有點懵吧,正則的一大頭疼問題就是難看,難懂!
body 內容的解析
resultData 對應資料解析完成後,我們得到了一個 json 資料,然後很容易可以獲取到 body 資料。
接下來就是解析 body 對應的 xml 資料了。
這裡,我們使用的是 xml.etree.ElementTree
,解析 xml 非常簡單:
xml_data = ET.fromstring(body)
text = xml_data.find('Content').text
這個元件在之前的文章 《Python 助你填寫高考志願》也有用過,有興趣的可以點選查閱。
重要資訊我們都獲取到了,下面我們就要想怎麼把介面結果發出去了。
3 如何及時獲取測試結果?
這裡,我首先想到的還是之前用過的 pushbear 的微信推送服務,因為實現很簡單,而且也不是正式場合使用。
def send_wechat(tiele, text):
url = "https://pushbear.ftqq.com/sub?sendkey=xxx5&text={}&desp={}".format(tiele, text)
resp = requests.get(url)
通過上面的函式,就可以將資訊推送到微信了,不懂得可以參考之前的文章:1 行程式碼,實現微信訊息傳送。
4 如何定時執行介面測試?
介面測試程式碼也有了,訊息推送也有了,下面就是如何定時執行介面測試了,比如半小時執行一次?
一種方案是使用 Linux 系統自帶的 crontab
模組。
還有就是 Python 也有定時任務的模組,我找到了一個輕量級的定時任務排程的庫:schedule
。
import schedule
import time
def job():
print("I'm working...")
schedule.every(10).minutes.do(job)
schedule.every().hour.do(job)
schedule.every().day.at("10:30").do(job)
schedule.every(5).to(10).days.do(job)
schedule.every().monday.do(job)
schedule.every().wednesday.at("13:15").do(job)
while True:
schedule.run_pending()
time.sleep(1)
這個栗子簡單到我不需要怎麼解釋。而且,通過這個栗子,我們也可以知道,schedule 其實就只是個定時器。
在 while True 死迴圈中,schedule.run_pending()
是保持 schedule
一直執行,去查詢上面那一堆的任務,在任務中,就可以設定不同的時間去執行。跟 crontab 是類似的。
我們只要把我們的測試介面方法放在上面的 job() 方法裡,然後通過 schedule.every(30).minutes.do(job)
就可以實現半小時一次執行啦!
總結
至此,我的任務基本完畢,雖然功能簡單,也沒有什麼高階的架構。
但是涉及的東西還是挺多的,網路互動、XML 解析、JSON 解析、正則表示式、微信推送、定時任務等。
這次,就到這吧,大家節日快樂~
如果覺得有用,歡迎關注我的微信,一起學習,共同進步,不定期推出贈書活動~
![你的關注是對我最大的鼓勵!][33]
最近蒐集到傳智播客 2018 最新 Python 和 Java 教程!關注本公眾號,後臺回覆「2018」即可獲取下載地址。