1. 程式人生 > 其它 >架構師的成長之路初片~Python-郵件(smtplib)、requests模組、API介面呼叫

架構師的成長之路初片~Python-郵件(smtplib)、requests模組、API介面呼叫

官網:

https://pypi.org/

https://pypi.org/project/requests/

郵件模組(smtplib)

設定郵件傳送的前提:在QQ郵箱或者163郵箱開啟SMTP,否則沒用。

案例:編寫傳送郵件件程式,發件人為root,收件人是本機的bob和alice帳戶

  1. [root@ localhost day12]# vim mail_client.py
  2. #!/usr/bin/env python3
  3. import smtplib
  4. from getpass import getpass
  5. from email.mime.text import MIMEText
  6. from email.header import Header
  7. mail_host = 'ahao.126.com'#發件人郵箱賬號
  8. mail_user = '[email protected]'#收件人郵箱賬號
  9. mail_pwd = getpass()#獲取密碼
  10. #郵件正文有三個引數:第一個為文字內容,第二個設定文字格式plain,第三個utf-8設定編碼保證多語言相容性
  11. message = MIMEText('Python郵件傳送測試\n', 'plain', 'utf8')
  12. #傳送者資訊
  13. message['From'] = Header('[email protected]', 'utf8')
  14. #接收者資訊
  15. message['To'] = Header('[email protected]', 'utf8')
  16. #主題資訊
  17. message['Subject'] = Header('python 1802 mail test', 'utf8')
  18. sender = '[email protected]'#傳送方
  19. receivers = ['[email protected]']#接收方
  20. smtp_obj = smtplib.SMTP()#建立SMTP物件
  21. smtp_obj.connect(mail_host)#將SMTP物件與傳送人郵件簡歷連線建立連線
  22. smtp_obj.login(mail_user, mail_pwd)#登入使用者名稱密碼
  23. # SMTP 物件使用 sendmail 方法傳送郵件
  24. 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內部的小冰進行相應的控制,可以正對某個人或者群體傳送相應的訊息。