2015-07-10 2 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 содержит реальное сообщение запроса. Как я могу имитировать это с помощью urllib Python? Я использую Python 3.4

+0

Я бы рекомендовал использование запросов (http://docs.python-requests.org/) для таких задач, как этот –

+0

Как @Daniel состояния для запроса GET вы должны добавить параметры url. Использование аргумента 'data' фактически отправит данные в тело запроса. Также для использования 'headers' вы можете использовать заголовки аргументов ключевых слов, например. 'urlopen (url, headers = my_headers)'. – Amyth

ответ

0

Чтобы продлить @ ответ Даниила, вы можете использовать urllib.urlencode метод, чтобы подготовить строку параметров прибудут, а также 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() 'result. Убедитесь, что данные, которые вы передаете методу '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/Он имеет '? B' в начале и окружен цитатой mark – zl2003cn

+0

Я не уверен, что вы делаете, чтобы получить это. Вы передаете весь вызов «urlopen» где-то? Пожалуйста, покажите свой полный код. –

Смежные вопросы