Python自動登入指令碼
阿新 • • 發佈:2019-02-02
一、環境
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)