Помогите с cURL в Python - PullRequest
2 голосов
/ 06 мая 2010

Я должен отправить запрос на сервер. В документации API веб-сайта есть этот пример, который использует cURL в PHP:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://api.website.com');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "request=$wrapper");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
;
$data = curl_exec($ch);
curl_close($ch);

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

req = urllib2.Request(url, formatted)  
response = urllib2.urlopen(req)  
html = response.read()  
print html+"\n\n"  

Можете ли вы помочь мне написать работающее преобразование программы PHP cURL в Python?

Спасибо !!

Ответы [ 4 ]

2 голосов
/ 06 мая 2010

Рассмотрите возможность использования анализатора пакетов, чтобы выяснить, отправляет ли cURL информацию об агенте пользователя.Если это так, и служба ожидает эту информацию, то используйте метод add_header () в вашем Запросе (из документации urllib2, внизу страницы):

import urllib2
req = urllib2.Request('http://api.website.com/')
# Your parameter encoding here
req.add_header('User-agent', 'Mozilla/5.0')
r = urllib2.urlopen(req)
# Process the response
2 голосов
/ 06 мая 2010

curl также для Python: http://pycurl.sourceforge.net/

Пример можно перевести на Python и pycurl следующим образом:

import pycurl
c = pycurl.Curl()
c.setopt(pycurl.URL, "http://api.website.com")
c.setopt(pycurl.POST, 1)
c.setopt(pycurl.POSTFIELDS, "request=%s" % wrapper)
import StringIO
b = StringIO.StringIO()
c.setopt(pycurl.WRITEFUNCTION, b.write)
c.perform()
c.close()
data = b.getvalue()

Ваш код Python, использующий urllib2, выглядит нормально, он должен работать. Вероятно, есть ошибка в чем-то другом, что вы не упомянули в вопросе; не могли бы вы быть более конкретным, пожалуйста?

1 голос
/ 07 мая 2010

Это довольно неловко, но ... единственная проблема с моим кодом, который использует urllib и urllib2, заключается в ... что этот код выполняет GET, а не POST !!!

Вот мое сканирование с использованием Wireshark:

1 - с использованием urllib и urllib2

Hypertext Transfer Protocol
    GET / HTTP/1.1\r\n
        [Expert Info (Chat/Sequence): GET / HTTP/1.1\r\n]
            [Message: GET / HTTP/1.1\r\n]
            [Severity level: Chat]
            [Group: Sequence]
        Request Method: GET
        Request URI: /
        Request Version: HTTP/1.1
    Accept-Encoding: identity\r\n
    Host: api.apptrackr.org\r\n
    Connection: close\r\n
    User-Agent: Python-urllib/2.6\r\n
    \r\n

2 - с использованием PyCurl

Hypertext Transfer Protocol
    POST / HTTP/1.1\r\n
        [Expert Info (Chat/Sequence): POST / HTTP/1.1\r\n]
            [Message: POST / HTTP/1.1\r\n]
            [Severity level: Chat]
            [Group: Sequence]
        Request Method: POST
        Request URI: /
        Request Version: HTTP/1.1
    User-Agent: PycURL/7.19.5\r\n
    Host: api.website.com\r\n
    Accept: */*\r\n
    Content-Length: 365\r\n
        [Content length: 365]
    Content-Type: application/x-www-form-urlencoded\r\n
    \r\n
Line-based text data: application/x-www-form-urlencoded
    [truncated]         request=%7B%22enc_key%22%3A%22o37vOsNetKgprRE0VsBYefYViP4%2ByB3pjxfkfCYtpgiQ%2ByxONgkhhsxtqAwaXwCrrgx%2BPDuDtMRZNI1ez//4Zw%3D%3D%22%2C%22format%22%3A%22RSA_RC4_Sealed%22%2C%22profile%22%3A%22Ldn%22%2C%22request%22%3A%22bQ%2BHm/

так что код работает, но он мне не подходит, потому что мне нужен POST, но я предпочитаю использовать НЕ PyCurl. Есть идеи?

Большое спасибо !!

1 голос
/ 06 мая 2010

Принимая ваш код, это на самом деле должно работать.

 import urllib 
 import urllib2

 url = 'http://api.website.com/' 
 values = {'some_key':'some_value'} 
 data = urllib.urlencode(values) 
 req = urllib2.Request(url, data) 
 response = urllib2.urlopen(req) 
 page = response.read()
 print page + '\n\n'

Какую ошибку вы получаете?

...