2010-01-02 16 views
20

का उपयोग कर पाइथन को एक कर्ल पोस्ट अनुरोध को कनवर्ट करें मैं इस कर्ल कमांड को किसी मौजूदा स्क्रिप्ट के लिए पायथन में उपयोग करने के लिए कुछ ऐसा करना चाहता हूं।मानक लाइब्रेरी

curl -u 7898678:X -H 'Content-Type: application/json' \ 
-d '{"message":{"body":"TEXT"}}' http://sample.com/36576/speak.json 

पाठ जो पहले से ही, उचित काम कर रहा है, हालांकि मुझे नहीं लगता कि यह सर्वोत्तम प्रथाओं या ख़ासियत पीछा कर रहा है विश्वसनीय है मैं स्क्रिप्ट के बाकी के द्वारा उत्पन्न एक संदेश के साथ प्रतिस्थापित करना चाहते हैं क्या है (-।। जरूरत प्रोग्राम को सही ढंग से सीखने के तरीके के बारे में जानने के लिए (यानी सामग्री को इकट्ठा करने के लिए Google का उपयोग न करें))

यदि संभव हो तो मैं मानक पुस्तकालय के साथ काम करना चाहूंगा।

+1

काम करता है के लिए यहां जाएं - http://stackoverflow.com/questions/4348061/how-to-use-python-urllib2-to-send-json- डेटा-फॉर-लॉगिन/7469725 # 7469725 – treecoder

उत्तर

23

पर एक नजर डालें।

मानक पुस्तकालय यूआरएल के साथ काम करने के लिए urllib और httplib प्रदान करता है:

>>> import httplib, urllib 
>>> params = urllib.urlencode({'apple': 1, 'banana': 2, 'coconut': 'yummy'}) 
>>> headers = {"Content-type": "application/x-www-form-urlencoded", 
...   "Accept": "text/plain"} 
>>> conn = httplib.HTTPConnection("example.com:80") 
>>> conn.request("POST", "/some/path/to/site", params, headers) 
>>> response = conn.getresponse() 
>>> print response.status, response.reason 
200 OK 

आप curl ही निष्पादित करने के लिए चाहते हैं, हालांकि, आप बस आह्वान कर सकते हैं os.system():

import os 
TEXT = ... 
cmd = """curl -u 7898678:X -H 'Content-Type: application/json'""" \ 
    """-d '{"message":{"body":"%{t}"}}' http://sample.com/36576/speak.json""" % \ 
    {'t': TEXT} 

यदि आप मानक-लाइब्रेरी-केवल प्रतिबंध को आराम करने के इच्छुक हैं, तो आपका उपयोग कर सकते हैं। सावधान रहें कि यह बहुत पाइथोनिक नहीं है (यह libcurl पर बहुत पतला लिबास है), और मुझे यकीन नहीं है कि यह पाइथन 3 के साथ कितना संगत है।

+0

प्रेजेंटप्लिब का उपयोग करना मतलब है कि प्रॉक्सी के लिए समर्थन जैसे urllib और urllib2 से कुछ विशेषताओं को छोड़ना। –

+1

@ डॉक »यह सच है; यह 'GET' या' POST' अनुरोध करने के लिए बस एक साधारण उदाहरण है, जो मुझे लगता है कि ओपी के बाद क्या था। –

+2

'यह सच है।मुझे लगता है कि प्रेजेंटप्लिब और यूआरएल मंगिंग करने का आमतौर पर प्रयास के लायक नहीं है, यह देखते हुए कि urllib2 आपको वह सब कुछ देता है। –

12

authentication in urllib2 को संभालने के तरीके हैं, यदि आप हैं ऐसा करने बेसिक प्राधिकरण (जो प्रभावी रूप से उपयोगकर्ता नाम और पासवर्ड स्पष्ट पाठ में भेजने का मतलब है) तो आप क्या आप एक urllib2.Request और urllib2.urlopen साथ की जाने वाली समस्त कर सकते हैं:

import urllib2 

def basic_authorization(user, password): 
    s = user + ":" + password 
    return "Basic " + s.encode("base64").rstrip() 

req = urllib2.Request("http://localhost:8000/36576/speak.json", 
         headers = { 
     "Authorization": basic_authorization("7898678", "X"), 
     "Content-Type": "application/json", 

     # Some extra headers for fun 
     "Accept": "*/*", # curl does this 
     "User-Agent": "my-python-app/1", # otherwise it uses "Python-urllib/..." 
     }, 
         data = '{"message":{"body":"TEXT"}}') 

f = urllib2.urlopen(req) 

मैं netcat तो मैं कर सकता के साथ इस परीक्षण किया देखें कि भेजा गया डेटा सॉर्ट ऑर्डर को छोड़कर, दोनों मामलों में समान था। यहाँ पहले एक कर्ल साथ किया गया था और urllib2 के साथ दूसरे

% nc -l 8000 
POST /36576/speak.json HTTP/1.1 
Authorization: Basic Nzg5ODY3ODpY 
User-Agent: curl/7.19.4 (universal-apple-darwin10.0) libcurl/7.19.4 OpenSSL/0.9.8k zlib/1.2.3 
Host: localhost:8000 
Accept: */* 
Content-Type: application/json 
Content-Length: 27 

{"message":{"body":"TEXT"}} ^C 

% nc -l 8000 
POST /36576/speak.json HTTP/1.1 
Accept-Encoding: identity 
Content-Length: 27 
Connection: close 
Accept: */* 
User-Agent: my-python-app/1 
Host: localhost:8000 
Content-Type: application/json 
Authorization: Nzg5ODY3ODpY 

{"message":{"body":"TEXT"}}^C 

(यह थोड़ा उत्पादन से बदलाव किया गया है। मेरे परीक्षण का मामला ही URL पथ आप का इस्तेमाल किया उपयोग नहीं किया।)

कोई है अंतर्निहित fansplib का उपयोग करने की आवश्यकता है, जो उन चीजों का समर्थन नहीं करता है जो urllib2 आपको प्रॉक्सी समर्थन की तरह देता है। दूसरी तरफ, मुझे urllib2 को इस सरल प्रकार के अनुरोध के बाहर जटिल होने के लिए मिलता है और यदि आप बेहतर समर्थन चाहते हैं जिसके लिए हेडर भेजे जाते हैं और वे ऑर्डर भेजे जाते हैं तो httplib का उपयोग करें।

+0

नेट बिल्ली स्निपेट के लिए धन्यवाद – nkint

2

धन्यवाद हर

इस

import urllib2 

def speak(status): 

    def basic_authorization(user, password): 
     s = user + ":" + password 
     return "Basic " + s.encode("base64").rstrip() 

    req = urllib2.Request("http://example.com/60/speak.json", 
        headers = { 
     "Authorization": basic_authorization("2345670", "X"), 
    "Content-Type": "application/json", 


     "Accept": "*/*", 
     "User-Agent": "my-python-app/1", 
     }, 
         data = '{"message":{"body":'+ status +'}}') 

    f = urllib2.urlopen(req) 


speak('Yay') 
संबंधित मुद्दे