架構師的成長之路初片~Python-郵件(smtplib)、requests模組、API介面呼叫
官網:
https://pypi.org/
https://pypi.org/project/requests/
郵件模組(smtplib)
設定郵件傳送的前提:在QQ郵箱或者163郵箱開啟SMTP,否則沒用。
案例:編寫傳送郵件件程式,發件人為root,收件人是本機的bob和alice帳戶
- [root@ localhost day12]# vim mail_client.py
- #!/usr/bin/env python3
- import smtplib
- from getpass import getpass
- from email.mime.text import MIMEText
- from email.header import Header
- mail_host = 'ahao.126.com'#發件人郵箱賬號
- mail_user = '[email protected]'#收件人郵箱賬號
- mail_pwd = getpass()#獲取密碼
- #郵件正文有三個引數:第一個為文字內容,第二個設定文字格式plain,第三個utf-8設定編碼保證多語言相容性
- message = MIMEText('Python郵件傳送測試\n', 'plain', 'utf8')
- #傳送者資訊
- message['From'] = Header('[email protected]', 'utf8')
- #接收者資訊
- message['To'] = Header('[email protected]', 'utf8')
- #主題資訊
- message['Subject'] = Header('python 1802 mail test', 'utf8')
- sender = '[email protected]'#傳送方
- receivers = ['[email protected]']#接收方
- smtp_obj = smtplib.SMTP()#建立SMTP物件
- smtp_obj.connect(mail_host)#將SMTP物件與傳送人郵件簡歷連線建立連線
- smtp_obj.login(mail_user, mail_pwd)#登入使用者名稱密碼
- # SMTP 物件使用 sendmail 方法傳送郵件
- smtp_obj.sendmail(sender, receivers, message.as_string())
SMTP是傳送郵件的協議,Python內建對SMTP的支援,可以傳送純文字郵件、HTML郵件以及帶附件的郵件。
Python對SMTP支援有smtplib和email兩個模組,email負責構造郵件,smtplib負責傳送郵件。
Python SMTP 物件使用 sendmail 方法傳送郵件:
smtp_obj.sendmail(sender, receivers, message.as_string())
requests模組
案例:利用json和requests與sys模組向釘釘機器人發起請求。
[root@ localhost day12]# vim dingtalk.py import json import requests import sys def send_msg(url, reminders, msg): headers = {'Content-Type': 'application/json;charset=utf-8'} data = { "msgtype": "text", # 傳送訊息型別為文字 "at": { "atMobiles": reminders, "isAtAll": False, # 不@所有人 }, "text": { "content": msg, # 訊息正文 } } r = requests.post(url, data=json.dumps(data), headers=headers) return r.text if __name__ == '__main__': msg = sys.argv[1] reminders = ['15055667788'] # 特殊提醒要檢視的人,就是@某人一下 url = 此處填寫上面webhook的內容 print(send_msg(url, reminders, msg))
案例三:
>>> url = 'http://jisutqybmf.market.alicloudapi.com/weather/query' #得到url >>> headers = {'Content-Type': 'application/json; charset=UTF-8', 'Authorization': 'APPCODE 你管理後臺中查詢到的appcode'} //修改編碼型別 >>> params = {'citycode': '101010100'} //取出想要地區的地方編碼 >>> r = requests.get(url, headers=headers, params=params) >>> data = r.json() //取出資料轉化為json格式 >>> import pprint //匯入pprint模組 >>> pprint.pprint(data) # 取出後天最高、最低溫度 >>> pprint.pprint(data['result']['daily'][2]['day']['temphigh']) //列印時間 '8' >>> pprint.pprint(data['result']['daily'][2]['night']['templow'])
最後案例:
作為參考得出思路即可:
1.定義一個字典,該字典中鍵‘0’和‘1’對應的值為天氣網址中城市對應的id,城市不同id則不同
2.執行程式時,螢幕將出現你所在城市名字
3.當用戶指定查詢某城市(即輸入0或1時)
4.呼叫get_weather函式,函式的實際引數為city_codes字典對應值(即對應的城市id)
5. 開啟天氣網頁,使用urllib模組的urlopen函式開啟url,賦值給html
6.讀html獲取的資料,用json.loads()獲取天氣資訊,獲取到的資訊為字典形式
7.從獲取到的字典資料中提取氣溫、溼度、風向、風速等資訊,儲存在output變數中
8.將output變數作為get_weather函式的返回值,列印在螢幕上
#!/usr/bin/python from urllib.request import urlopen import json def get_weather(city_code): #定義一個輸入城市id的函式 5.開啟天氣網頁,使用urllib模組的urlopen函式開啟url,賦值給html url = 'http://www.weather.com.cn/data/sk/%s.html' % city_code html = urlopen(url) 6.讀html獲取的資料,用json.loads()獲取我們想要的資訊 #json.loads()是將json格式資料轉換為字典 #(可以理解為json.loads()函式是將字串轉化為字典) data = json.loads(html.read()) 7.output為返回值,即最終螢幕顯示的資訊 output = '風向:%s, 風力: %s, 溫度:%s, 溼度:%s' % ( #data獲取到的天氣資訊為字典,該字典中weatherinfo鍵對應的值還是一個字典,這個字典中‘WD’鍵對應的值是風向,‘WS’鍵對應的值是風力,'temp'鍵對應的值是溫度,'SD'鍵對應的值是溼度,利用鍵值對關係將相應資料顯示出來即可 data['weatherinfo']['WD'], data['weatherinfo']['WS'], data['weatherinfo']['temp'], data['weatherinfo']['SD'] ) return output if __name__ == '__main__': 1.定義字典:鍵對應的值為天氣網站網址介面中城市ID city_codes = { '0': '101010100', '1': '101121404'} 2.程式碼執行後,螢幕給出的提示資訊 prompt = """(0) 北京 (1) 臺兒莊 請選擇(0/1): """ 3.根據提示資訊,輸入0或1 choice = input(prompt) 4.呼叫get_weather函式,其實際引數為city_codes字典對應值 8.列印呼叫get_weather函式返回值 print(get_weather(city_codes[choice]))
結論:我們可以通過郵件(smtplib)模組群體傳送內容相同的資訊,節省時間。
我最喜歡的還是最為報警機制,通過shell指令碼檢測linux系統中的各項引數,達到或者超過預設定的值後觸發相應的郵箱指令碼。(跟zabbix一樣)
requests模組可以用來測試介面API,可以利用多執行緒(thread和threading)結合requests模組對測壓的伺服器進行壓力測試,和各種檢測
API介面呼叫:可以利用現有的模組向需要的釘釘機器人,或者QQ內部的小冰進行相應的控制,可以正對某個人或者群體傳送相應的訊息。