Python 使用 Requests 发送携带 Cookies 的请求详解

周予安
周予安
发布时间:2026-10-14 | 4人浏览过
原创

本文介绍如何在 Python 的 Requests 库中正确发送携带 Cookies 的请求。通过构造 RequestsCookieJar 对象并更新 Session,实现 Cookie 的持久化与复用。结合具体监控平台消息下发的案例,展示了从加载 Cookie、发送带时间戳的消息到根据状态码触发邮件报警的完整流程,适用于需要维持登录状态的接口自动化测试场景。

一、缘 起

近期在研读【悠悠课堂】的接口自动化教程时,了解到利用 Requests 库发送携带 Cookies 请求的具体方法。笔者将该技巧应用于实际项目中,主要实现逻辑如下所示。

二、背 景

实际业务需求在于监控平台侧下发的消息是否存在异常情况。一旦检测到异常,系统需自动触发报警并发送邮件通知。由于项目中下发消息的接口要求必须携带有效的 Cookies 才能正常访问,因此需要解决 Cookie 传递的问题。

三、说 明

该脚本的工程名称为 ynJxhdSendMsg,其整体项目结构大致如下图所示。

  1. 其中,sendMsg.py 是主程序文件。该文件中定义了 checkMsg 函数,用于在已发送消息列表中检索特定的下发记录;同时定义了 sendMsg 函数,用于执行消息发送操作,并根据返回结果生成相应的状态标识。
  2. sendAlertEmail.py 负责处理邮件发送逻辑。在 sendMsg.py 中,程序会根据 sendMsg 返回的不同状态标识,调用 sendAlertEmail.py 中的 send_alert_email 函数来发送报警邮件。

四、实 现

【重点】在发起 HTTP 请求之前,必须先加载 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 函数负责执行具体的消息发送动作,并根据 HTTP 响应状态或返回内容,生成对应的业务标识符。
  4. 程序导入 sendAlertEmail 模块中的 send_alert_email 方法。在 sendMsg.py 中,根据业务逻辑判断不同的状态标识,若需要报警,则调用该函数发送预警邮件。

#!/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 平台并配置定时构建任务。这样即可实现对平台侧消息下发情况的实时监控,并在出现异常时及时通过邮件反馈报警信息。

以上就是 Python 实现 Requests 发送带 Cookies 请求的详细内容,更多关于 Python Requests 发送带 Cookies 请求的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表