1. 程式人生 > >Python自動登入指令碼

Python自動登入指令碼

一、環境

Python 2.7.x

pip 8.1.1

注意:pip升級後下載依賴包會報certificate verifyfailed

      解決辦法是加入--trusted-host pypi.python.org

例如:pip install --trusted-host pypi.python.org Exception 

二、urllib2
1)Get方式:
# 登入的主頁面
hosturl = 'https://10.64.66.137/mdm/web/Login.htm'  # 自己填寫
# post資料接收和處理的頁面(我們要向這個頁面傳送我們構造的Post資料)
posturl = 'https://10.64.66.137/mdm/cgi/web_service.dll'

# 設定一個cookie處理器,它負責從伺服器下載cookie到本地,並且在傳送請求時帶上本地的cookie
cj = cookielib.LWPCookieJar()
cookie_support = urllib2.HTTPCookieProcessor(cj)
opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)
urllib2.install_opener(opener)
# get方式需要給資料編碼
getData = urllib.urlencode({'name': '測試', 'id': 1})
# 開啟登入主頁面(他的目的是從頁面下載cookie,這樣我們在再送post資料時就有cookie了,否則傳送不成功)
request = urllib2.urlopen("%s?%s" % (hosturl, getData))

2)Post方式:

# 構造header,一般header至少要包含一下兩項。這兩項是從抓到的包裡分析得出的。
headers = {
    'Host': '10.64.66.137',
    'X-Requested-With': 'XMLHttpRequest',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
    'Content-Type': 'application/json',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'zh-CN,zh;q=0.8'}
# 構造Post資料,他也是從抓大的包裡分析得出的。
postData = {"tmms_action": "login", "data": {"username": "root", "password": "123456", "time": 1482282759}}
# post 方式需要將資料轉換成對應資料格式,這裡是json
postData = json.dumps(postData)
# 通過urllib2提供的request方法來向指定Url傳送我們構造的資料,並完成登入過程
request = urllib2.Request(posturl, postData, headers)
# context = ssl._create_unverified_context()
response = urllib2.urlopen(request)
text = response.read()
print text
注意:
a)  urlopen如果有dataurl引數,預設是採用post方式請求,所以如果要採用get方式,引數要和url拼接到一起,並且引數要經過轉碼
b)  post方式請求時,資料轉換成json需要用json.dumps而不是urllib.urlencode 
三、requests
1)Get方式:
# requests方式進行get請求
request = requests.get(hosturl,
                       params={'gid': '測試'},
                       headers=headers,
                       verify=False)

2)Post方式:
# 第二種方式:requests方式傳送請求
response = requests.post(posturl,
                         data=json.dumps({"tmms_action": "login",
                                          "data": {"username": "root", "password": "123456", "time": 1482282759}}),
                         headers=headers,
                         verify=False)

text = response.content
 
注意:
a)  requests方式比urllib2來的簡潔,不過它進行https請求時如果不處理會報
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed,因此需要在請求最後一個引數加上verify=False就可以解決
b)requests方式在params裡面的引數會自動進行轉碼,不需要再處理了 
四、完整程式碼:
# -*- coding:utf-8 -*-
import HTMLParser
import urlparse
import urllib
import urllib2
import cookielib
import string
import re
import ssl
import json
import requests

# 登入的主頁面
hosturl = 'https://10.64.66.137/mdm/web/Login.htm'  # 自己填寫
# post資料接收和處理的頁面(我們要向這個頁面傳送我們構造的Post資料)
posturl = 'https://10.64.66.137/mdm/cgi/web_service.dll'

# 設定一個cookie處理器,它負責從伺服器下載cookie到本地,並且在傳送請求時帶上本地的cookie
cj = cookielib.LWPCookieJar()
cookie_support = urllib2.HTTPCookieProcessor(cj)
opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)
urllib2.install_opener(opener)
try:
    # get方式需要給資料編碼
    getData = urllib.urlencode({'name': '測試', 'id': 1})
    # 開啟登入主頁面(他的目的是從頁面下載cookie,這樣我們在再送post資料時就有cookie了,否則傳送不成功)
    request = urllib2.urlopen("%s?%s" % (hosturl, getData))

    # 構造header,一般header至少要包含一下兩項。這兩項是從抓到的包裡分析得出的。
    headers = {
        'Host': '10.64.66.137',
        'X-Requested-With': 'XMLHttpRequest',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
        'Content-Type': 'application/json',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.8'}
    # 構造Post資料,他也是從抓大的包裡分析得出的。
    postData = {"tmms_action": "login", "data": {"username": "root", "password": "123456", "time": 1482282759}}
    # post 方式需要將資料轉換成對應資料格式,這裡是json
    postData = json.dumps(postData)
    # 通過urllib2提供的request方法來向指定Url傳送我們構造的資料,並完成登入過程
    request = urllib2.Request(posturl, postData, headers)
    # context = ssl._create_unverified_context()
    response = urllib2.urlopen(request)
    text = response.read()
    print text

    # requests方式進行get請求
    request = requests.get(hosturl,
                           params={'gid': '測試'},
                           headers=headers
                           )

    # 第二種方式:requests方式傳送請求
    response = requests.post(posturl,
                             data=json.dumps({"tmms_action": "login",
                                              "data": {"username": "root", "password": "123456", "time": 1482282759}}),
                             headers=headers,
                             verify=False)

    text = response.content
    print text
except Exception, e:
    print str(e)