2015-07-10 23 views
0

我想用Python來模擬一個登錄動作,它通過HTTP GET方法獲取一些消息。所以我寫這樣的事情使用Python urllib.urlopen準確發送數據

from urllib.request import urlopen, Request 

urlopen(Request(URL, data=data_for_verify.encode(), method='GET')) 

的問題是,它不會做同樣作爲一個真正的登錄操作,其像這樣(從從無到有Wireshark的,HTTP打印數據只)

GET /rjsdcctrl?mac%3dfcaa14ec56f3%26ipv4%3d1681312010%26ipv61%3d0%26ipv62%3d0%26ipv63%3d0%26ipv64%3d0%26product%3d33554432%26mainver%3d67108864%26subver%3d1610612736 HTTP/1.1 
Accept: text/* 
User-Agent: HttpCall 
Accept-Language: en-us 
Host: 10.0.6.251 
Cache-Control: no-cache 

而且什麼我的程序所做的是:

GET/HTTP/1.1 
Accept-Encoding: identity 
Content-Type: application/x-www-form-urlencoded 
Host: 10.0.6.251:80 
User-Agent: Python-urllib/3.4 
Connection: close 
Content-Length: 161 
rjsdcctrl?mac%3dfcaa14ec56f3%26ipv4%3d1681312010%26ipv61%3d0%26ipv62%3d0%26ipv63%3d0%26ipv64%3d0%26product%3d33554432%26mainver%3d67108864%26subver%3d1610612736 

一個真正的登錄操作有頭至上,不具備行GET/HTTP /1.1

或者它只是一個沒有內容的頭,而第一行GET包含真正的請求消息。我怎樣才能模擬使用Python的urllib? 我使用Python 3.4

+0

我會建議使用請求(http://docs.python-requests.org/)像這樣 –

+0

任務作爲@Daniel的GET請求規定應將參數添加到網址。使用'data'參數實際上會發送請求主體中的數據。同樣要使用'headers',你可以使用關鍵字參數標題例如'urlopen(url,headers = my_headers)'。 – Amyth

回答

0

爲了延長@丹尼爾的回答,您可以利用urllib.urlencode方法來準備GET參數字符串,也headers關鍵字參數覆蓋默認頭。因此,例如:

import urllib 

url = 'http://www.example.com/' 
data = { 
    'key1': 'value1', 
    'key2': 'value2', 
    'key3': 'value3' 
} 
headers = { 
    'Overriden-Header': 'Overriden Header Value' 
} 

## Update the url and make the actual requests 
url = '%s?%s' % (url, urllib.urlencode(data)) 
response = urllib.urlopen(url, headers=headers) 
+0

結果就像這樣'GET /?b'rjsdcctrl?mac%3dfcaa14ec56f3%26ipv4%3d1681312010%26ipv61%3d0%26ipv62%3d0%26i pv63%3d0%26ipv64%3d0%26product%3d33554432%26mainver%3d67108864%26subver%3d1610612 736'HTTP/1.1'它有一個'?b'開頭,並且被引號 – zl2003cn

+0

包圍,這是因爲你的'data_to_verify.encode()'方法的結果。確保傳遞給'urlencode'方法的數據是一個python字典,並且尚未編碼。看看我如何在上面的例子中將數據傳遞給'urllib.urlencode'方法。 – Amyth

+0

你可以使用'data_for_verify.encode()'方法返回什麼來更新你的問題嗎? – Amyth

1

如果您不想將數據作爲主體的一部分發送,則不應使用data參數。價值附加到URL:

full_url = "%s?%s" % (URL, data_for_verify.encode()) 
urlopen(full_url) 
+0

我試過你的代碼。它就像這樣'GET /?b'rjsdcctrl?mac%3dfcaa14ec56f3%26ipv4%3d1681312010%26ipv61%3d0%26ipv62%3d0%26ipv63%3d0%26ipv64%3d0%26product%3d33554432%26mainver%3d67108864%26subver%3d1610612736'HTTP/1.1'它有一個'?b'在開頭,並被引號標記 – zl2003cn

+0

我不確定你在做什麼來獲得它。你在某處通過了「urlopen」呼叫嗎?請顯示您的完整代碼。 –