python Requests送信バンドcookiesの要求を実現します。


一、縁起
最近は「ヨーヨーヨー教室」のインターフェース自動化教程を勉強していますが、レクズがcookiesの要求を送る方法について言及しました。筆者もそれを実際のプロジェクトに使っています。大体次の通りです。
二、背景
実際の需要は監視プラットフォームの側でメッセージを送るのに異常がないかということです。異常があれば、アラームを起こしてメールを送ります。プロジェクトの中でメッセージを送るインターフェースはcookiesを持つ必要があります。
説明する
脚本の工程名はynJxhdSendMsgで、大体の構造は下図の通りです。
  • sendMsg.pyをメインプログラムとして、関数checkMsgは既報のリストでメッセージを検索し、関数sendMsgはメッセージを送信し、結果に基づいて対応する識別子
  • を返します。
  • 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
  • は、現在のタイムスタンプを有する特定メッセージを送信し、成功後にタイムスタンプで
  • を検索するのに便利である。
  • 関数checkMsgは、送信済みメッセージリストの中で、送信済みメッセージを検索する
  • である。
  • 関数sendMsgはメッセージであり、結果に基づいて対応する識別情報
  • を返す。
  • sendAlertEmailモジュールのsend_を導入する。alert_emailメソッドは、sendMsg.pyにおいて、異なる標識に従ってsend(u)を呼び出します。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に置いてタイミングで構築すれば、リアルタイムでプラットフォーム側のメッセージを監視して状況を送り、警報メールの要求をタイムリーにフィードバックすることができます。
    以上はpythonがRequestsを実現してcookies要求の詳しい内容を発送して、更にpython Requestsに関してcookies要求の資料を発送します。他の関連記事に注目してください。