Эмуляция HTTP Post-запроса в Python

#php #python #http #post #request

#php #python #http #Публикация #запрос

Вопрос:

Я пытаюсь отправить HTTP post-запрос на странице PHP. Я попробовал как Java, так и Python (это был первый раз, когда я использовал Python), и я могу сказать, что оба они работали у меня почти нормально. На самом деле, они отлично работали только для моей тестовой PHP-страницы. По какой-то причине ни один из них не работал для моей целевой страницы PHP.

На мой взгляд, две причины, которые могут вызвать проблему неудачного post-запроса, могут быть:

  1. может произойти своего рода перенаправление
  2. серверу требуется правильный файл cookie

Далее вы найдете HTML-код целевой страницы и код Python, который должен работать.

HTML:

 <form id="m713a0moduleform_2" method="post" action="http://www.X.Y/index.php?page=login" class="cms_form">
<input type="hidden" name="mact" value="FrontEndUsers,m713a0,do_login,1" />
<input type="hidden" name="m713a0returnid" value="794" />
<input type="hidden" name="page" value="794" />
<input type="hidden" name="m713a0form" value="login" />
<input type="text" class="cms_textfield" name="m713a0feu_input_username" id="m713a0feu_input_username" value="" size="10" maxlength="40" />
<input type="password" class="cms_password" name="m713a0feu_input_password" value="" size="10" maxlength="10" />
<input class="cms_submit" name="m713a0feu_btn_login" id="m713a0feu_btn_login" value="Sign in" type="submit" class="signin_button" />
</form>
  

Python:

 import urllib
params = urllib.urlencode({"mact":"FrontEndUsers,m713a0,do_login,1","m713a0returnid":"18","page":"18","m713a0form":"login","m713a0feu_input_username":"Z","m713a0feu_input_password":"W","m713a0feu_btn_login":"Sign in"})
f = urllib.urlopen("http://www.X.Y/index.php?page=login", params)
print f.read()
  

Я получаю следующую ошибку. Есть идеи?

Обратная трассировка (последний последний вызов):
 Файл "/X/Y/Z/NewPythonProject2/src/newpythonproject2.py ", строка 34, в 
 из paste.proxy импортируйте TransparentProxy
Ошибка импорта: нет модуля с именем paste

Комментарии:

1. diveintopython.org/http_web_services/redirects.html описывает, как обрабатывать перенаправления.

Ответ №1:

Я использую вставьте.proxy.TransparentProxy и webbob.Запрос

Вам необходимо установить библиотеки

 easy_install webob webtest paste
  

или

 pip install webob webtest paste
  

затем в скрипте…

 from paste.proxy import TransparentProxy
from webob import Request
proxy_app = TransparentProxy()    
request = Request.blank("http://pathto/your_file.php", POST=dict(field_a=value_a,field_b=value_b))

response = request.get_response(proxy_app)
  

если вам нужно сделать что-нибудь более причудливое, например, сохранить файлы cookie в запросах, например, передать файлы cookie обратно, вы можете использовать WebTest, и вам потребуется всего несколько изменений

 from paste.proxy import TransparentProxy
from webtest import TestApp
app = TestApp(TransparentProxy())    
app.post("http://pathto/your_file.php", dict(field_a=value_a,field_b=value_b))
  

Комментарии:

1. есть библиотеки, которые вам нужно установить easy_install вставить webbob webtest

2. Привет, Том! И большое вам спасибо за ваше быстрое редактирование, но я все еще не понимаю! Это мои первые строки в Python, и именно поэтому я не могу понять, что делать, даже если я попытался выполнить тщательный поиск в сети… Не могли бы вы, пожалуйста, дать мне несколько советов о том, как установить все эти библиотеки, учитывая, что я использую Ubuntu 10.10 и NetBeans IDE 6.9.1? Большое спасибо за вашу помощь! Eualin.

3. @eualin вы выбрали несколько сложную задачу, с помощью которой стоит ознакомиться с python. 🙂 Вероятно, вам было бы полезно ознакомиться с тем, как делать такие вещи, как установка библиотек в python. Потому что именно библиотеки создают язык в настоящее время. На вашем месте я бы установил virtualenv. simononsoftware.com/virtualenv-tutorial тогда вы сможете поиграть со всеми видами библиотек и не разрушить вашу систему python