2011-10-19 12 views
7

Mam problem ze zrozumieniem, jak wysyłać żądania HTTP POST za pomocą curl z wnętrza Pythona.Http POST Curl w pythonie

Mam zamiar wysłać do Facebooka otwarty wykres. Oto przykład, który podaję, który chciałbym dokładnie powielić w pythonie.

curl -F 'access_token=...' \ 
    -F 'message=Hello, Arjun. I like this new API.' \ 
    https://graph.facebook.com/arjun/feed 

Czy ktoś może mi pomóc to zrozumieć?

Odpowiedz

14

Można użyć httplib POST z Python lub wyższy poziom urllib2

import urllib 

params = {} 

params['access_token'] = '*****' 
params['message'] = 'Hello, Arjun. I like this new API.' 

params = urllib.urlencode(params) 
f = urllib.urlopen("https://graph.facebook.com/arjun/feed", params) 
print f.read() 

Jest też biblioteka Facebook specyficzne dla Pythona wyższy poziom, że nie wszystkie POST-ing dla Ciebie.

https://github.com/pythonforfacebook/facebook-sdk/

https://github.com/facebook/python-sdk

+0

dokładnie to, co potrzebne - dzięki! – Ron

1

Dlaczego używacie zwijają się w pierwszej kolejności?

Python ma rozbudowane biblioteki dla Facebook i dołączone biblioteki dla żądań internetowych, wywoływanie innego programu i otrzymywanie danych wyjściowych jest niepotrzebne.

Powiedział,

Pierwszy z Pythona Doc

data może być ciąg znaków określający dodatkowe dane, aby wysłać do serwera, lub None jeśli jest potrzebne żadne takie dane. Obecnie żądania HTTP to tylko te, które używają danych; Żądaniem HTTP będzie POST zamiast GET po podaniu parametru danych. data powinien być buforem w formacie w standardowym formacie application/x-www-form-urlencoded. Funkcja urllib.urlencode() pobiera odwzorowanie lub sekwencję 2-krotek i zwraca ciąg znaków w tym formacie. Moduł urllib2 wysyła żądania HTTP/1.1 z połączeniem: zawiera nagłówek zamknięcia.

Więc

import urllib2, urllib 
parameters = {} 
parameters['token'] = 'sdfsdb23424' 
parameters['message'] = 'Hello world' 
target = 'http://www.target.net/work' 

parameters = urllib.urlencode(parameters) 
handler = urllib2.urlopen(target, parameters) 
while True: 
    if handler.code < 400: 
     print 'done' 
     # call your job 
     break 
    elif handler.code >= 400: 
     print 'bad request or error' 
     # failed 
     break