Requests發送帶cookies請求


一、緣 起

最近學習【悠悠課堂】的接口自動化教程,文中提到Requests發送帶cookies請求的方法,筆者隨之也將其用於手頭實際項目中,大致如下

二、背 景

實際需求是監控平台側下發消息有無異常,如有異常便觸發報警推送郵件,項目中下發消息接口需要帶cookies

三、說 明

腳本的工程名為ynJxhdSendMsg,大致結構如下圖
腳本結構

  1. sendMsg.py為主程序,函數checkMsg為在已發消息列表中查找已下發消息,函數sendMsg為發消息並根據結果返回對應的標識
  2. sendAlertEmail.py為發送郵件程序,在sendMsg.py中根據不同標識調用sendAlertEmail.py下的send_alert_email函數發報警郵件

四、實 現

  • 【重點】發請求之前先加載cookies,方法如下
~
......
~
# 加載cookies
# 第一步,引入RequestsCookieJar()
coo = requests.cookies.RequestsCookieJar()
# 第二步,設置cookies參數,coo.set('key', 'value')
coo.set('__utma', '82342229.1946326147.***.1545556722.1545556733.4')
coo.set('JSESSIONID', 'D898010550***ADB0600BF31FF')
# 第三步,引入seeeion(),並update
sess = requests.session()
sess.cookies.update(coo)
~
......
~
  • sendMsg.py
  1. 發送帶當前時間戳的特定消息,在發送成功后便於通過時間戳檢索
  2. 函數checkMsg為在已發消息列表中查找已下發消息
  3. 函數sendMsg為發消息並根據結果返回對應的標識
  4. 導入sendAlertEmail模塊的send_alert_email方法,在sendMsg.py中根據不同標識調用send_alert_email函數發報警郵件
#!/usr/bin/python
# coding=utf-8
# author: 葛木瓜
# 2018.12.20

import requests
import time
import re
import sys
sys.path.append('./')
from sendAlertEmail import send_alert_email

now = time.strftime('%Y.%m.%d %H:%M:%S')  # 獲取當前時間
sendMsg_url = 'http://*.*.*.*/interactive/sendMessage.action'
msgList_url = 'http://*.*.*.*/interactive/sendedMessageList.action'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0',
    'Content-Type': 'application/x-www-form-urlencoded'
    }
payload = {
    'showFlag': '0',
    'type': '1',
    'fsnl': 'on',
    'receiversId_': '63110542',
    'receiveName': '9705家長;',
    'content': 'Test msg sending,time ' + now,
    'templateType': '1',
    'addTeachername': '0',
    'isGreed': '0',
    'send': '1',
    'startDayTime': '2018-12-20',
    'hourss': '22',
    'munit': '29',
    'selectRole': '2',
    'receiversIds': '63110542',
    'templateFlag': '0'
}

# 加載cookies
coo = requests.cookies.RequestsCookieJar()
coo.set('__utma', '82342229.1946326147.***.1545556722.1545556733.4')
coo.set('JSESSIONID', 'D898010550***ADB0600BF31FF')
sess = requests.session()
sess.cookies.update(coo)


def checkMsg():
    """
    在已發送短信列表檢查已發送短信
    :return:
    """
    i = 1
    while True:
        try:
            cm_resp = sess.get(msgList_url, headers=headers, allow_redirects=False)
        except Exception as e:
            return str(e)
        else:
            time.sleep(1)
            cm_key = re.findall('Test msg sending,time33 ' + now, cm_resp.text)
            i += 1
            if i <= 30:
                if len(cm_key):
                    break
            else:
                cm_key = ['More than 30 times,no result']
                break
    print('Request %d times' % i)
    return cm_key


def sendMsg():
    """
    send message
    :return:
    """
    try:
        resp = sess.post(sendMsg_url, headers=headers, data=payload, allow_redirects=False)
    except Exception as e:
        return str(e)
    else:
        if resp.status_code == 200:
            key = re.findall('通知發送已成功', resp.text)
            cm_key = checkMsg()
            # print(key, cm_key)
            if len(key) and len(cm_key):
                if cm_key[0] == 'Test msg sending,time ' + now:
                    return 200
                elif cm_key[0] == 'More than 30 times,no result':
                    return 'More than 30 times,no result'
                else:
                    # print('Check Msg connect fail:' + str(cm_key))
                    return 'Check Msg connect fail: ' + cm_key
        elif resp.status_code == 302:
            return 302
        else:
            return resp.status_code


if __name__ == '__main__':

    receiver = ['**@***.com']  # 收件人郵件列表
    status = sendMsg()
    print(status)
    if status == 200:
        alert_content = "normal"
        print('Test Success!')
    elif status == 'More than 30 times,no result':
        alert_content = "短信已發送,查詢已發狀態失敗!"
    elif 'Check Msg connect fail:' in str(status):
        alert_content = "短信已發送,無法查詢已發狀態,報錯信息:%s" % status.split(':')[-1]
    elif status == 302:
        alert_content = "Session失效,請重新獲取'JSESSIONID'!"
    else:
        alert_content = "短信下發失敗,報錯信息:%s" % status
    if alert_content != "normal":
        send_alert_email(receiver, alert_content)

  • sendAlertEmail.py,方法較常見,此處略

五、最 后

完成以上,將腳本放在jenkins上定時構建,即可實現實時監控平台側消息下發情況並及時反饋報警郵件的需求

OK!

~
~
~

不積跬步,無以至千里


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM