पायथन में CURL विकल्प


114

मेरे पास एक CURL कॉल है जिसका उपयोग मैं PHP में करता हूं:

curl -i -H 'स्वीकार करें: आवेदन / xml' -u लॉगिन: कुंजी " https://app.streamsend.com/emails "

मुझे पायथन में भी यही काम करने का तरीका चाहिए। क्या पायथन में cURL का विकल्प है। मैं urllib के बारे में जानता हूं लेकिन मैं पायथन नोब हूं और इसका उपयोग करने का कोई विचार नहीं है।


2
आप
ghostdog74

2
urllib2 इस तरह के काम के लिए एक व्यापक रूप से इस्तेमाल किया जाने वाला पैकेज है।
सौरव

7
इससे भी बेहतर: docs.python-requests.org/en/latest/index.html
Saurav

3
ऊपर एक महान पुस्तकालय के लिए एक लिंक है जो आसान http requestsको python में करने के लिए उपलब्ध है (PyP में easy_install या पाइप के माध्यम से स्थापित करने के लिए)। नाम / URL थोड़ा भ्रमित कर रहा है - पहले मैं लगभग सोचा कि यह एक बेहतर करने के लिए एक इच्छा सूची अनुरोध था urllib2, बजाय requestsएक बहुत ही सहज ज्ञान युक्त आसान pythonic पुस्तकालय का उपयोग करने sudo easy_install requestsया sudo pip install requests
अक्टूबर को jimbob

अजगर के अनुरोध बनाम PyCurl का प्रदर्शन आप अपनी आवश्यकता पर सभ्य हैं
Santhosh

जवाबों:


68
import urllib2

manager = urllib2.HTTPPasswordMgrWithDefaultRealm()
manager.add_password(None, 'https://app.streamsend.com/emails', 'login', 'key')
handler = urllib2.HTTPBasicAuthHandler(manager)

director = urllib2.OpenerDirector()
director.add_handler(handler)

req = urllib2.Request('https://app.streamsend.com/emails', headers = {'Accept' : 'application/xml'})

result = director.open(req)
# result.read() will contain the data
# result.info() will contain the HTTP headers

# To get say the content-length header
length = result.info()['Content-Length']

इसके बजाय urllib2 का उपयोग करके आपका CURL कॉल। पूरी तरह से अप्रयुक्त।


4
नीचे दिए गए उत्तर के साथ इसकी तुलना करना अच्छा है और देखें कि पायथन ने पिछले चार वर्षों में कितनी प्रगति की है
रज़ी शाबान

133

आप अनुरोधों में वर्णित HTTP अनुरोधों का उपयोग कर सकते हैं : मानव उपयोगकर्ता के लिए HTTP गाइड।


2
अनुरोध नवीनतम और सबसे बड़ा है! यह अनाड़ी urlib2 को धूम्रपान करता है और जलाता है, मैं चाहता हूं कि अनुरोध आने वाले 3.x संस्करणों के लिए मानक HTTP क्लाइंट बन जाए
Phyo Arkar Lwin

1
जब मैंने अनुरोधों का उपयोग करने के लिए स्विच किया तो मैंने कभी भी सीधे urllib2 का उपयोग करने से पीछे नहीं देखा। अंतर्निहित JSON डिकोडिंग भी आसान है। यदि उपयुक्त सामग्री-प्रकार सेट किया गया है, तो मैन्युअल रूप से शरीर को जौन से लोड करने की आवश्यकता नहीं है।
थॉमस फरवोर

निवेदन इतना सरल है। मैं कुछ ही मिनटों में एक कस्टम प्रमाणीकरण योजना बनाने में सक्षम था। urllib2 सुपर-कष्टप्रद है।
डग

35

यहां urllib2 का उपयोग करके एक सरल उदाहरण दिया गया है जो GitHub के एपीआई के खिलाफ एक मूल प्रमाणीकरण करता है।

import urllib2

u='username'
p='userpass'
url='https://api.github.com/users/username'

# simple wrapper function to encode the username & pass
def encodeUserData(user, password):
    return "Basic " + (user + ":" + password).encode("base64").rstrip()

# create the request object and set some headers
req = urllib2.Request(url)
req.add_header('Accept', 'application/json')
req.add_header("Content-type", "application/x-www-form-urlencoded")
req.add_header('Authorization', encodeUserData(u, p))
# make the request and print the results
res = urllib2.urlopen(req)
print res.read()

इसके अलावा अगर आप इसे एक स्क्रिप्ट में लपेटते हैं और इसे टर्मिनल से चलाते हैं तो आप सुंदर प्रिंटिंग को सक्षम करने के लिए रिस्पांस स्ट्रिंग को 'mjson.tool' में पाइप कर सकते हैं।

>> basicAuth.py | python -mjson.tool

एक आखिरी बात ध्यान दें, urllib2 केवल GET & POST अनुरोधों का समर्थन करता है।
यदि आपको अन्य HTTP क्रियाओं जैसे DELETE, PUT, आदि का उपयोग करने की आवश्यकता है, तो आप संभवतः PYCURL पर एक नज़र रखना चाहते हैं


यह मतदान क्यों किया गया? डी: शायद क्योंकि आप PYCURL बजाय PycURL लिखा था
भार्गव राव

20

यदि आप एक आदेश का उपयोग कर रहे हैं जैसे कि कर्ल को कॉल करने के लिए, आप पायथन में एक ही काम कर सकते हैं subprocess। उदाहरण:

subprocess.call(['curl', '-i', '-H', '"Accept: application/xml"', '-u', 'login:key', '"https://app.streamsend.com/emails"'])

या आप PycURL की कोशिश कर सकते हैं यदि आप इसे और अधिक संरचित एपीआई के रूप में रखना चाहते हैं जैसे पीएचपी के पास है।


नहीं। CURL कॉल एक कार्यक्रम का हिस्सा है। यदि आप उस कोड को पोस्ट कर सकते हैं जो ऊपर दिए गए कर्ल कॉल में ठीक वही काम करता है, जो बहुत अच्छा होगा।
गौरव शर्मा

आपके प्रश्न के आधार पर उपप्रकार का उपयोग करके मेरा क्या मतलब है, इसका एक उदाहरण जोड़ा गया है, लेकिन मैं अनुमान लगा रहा हूं कि आप PycURL की तरह कुछ और देख रहे हैं।
अनहेल्स्लेमर

मुझे पता है कि यह पुराना है, लेकिन मेरी राय में CURL के अधिकांश उपयोगों के लिए PycURL काफी निम्न स्तर है। यहां तक ​​कि CURL का PHP कार्यान्वयन काफी निम्न स्तर का है।
थॉमस फरवोर

मुझे cmd से "अजगर" कहने के बाद "नाम त्रुटि, नाम उपप्रकार नहीं" मिला और इसलिए अजगर एनव में रहा।
टिम्मो

@Timo क्या तुमने import subprocess? अजगर उत्तर वातावरण एक अजगर फ़ाइल की तरह है, आपको अन्य मॉड्यूल आयात करना होगा।
अनहोनीसमर

13
import requests

url = 'https://example.tld/'
auth = ('username', 'password')

r = requests.get(url, auth=auth)
print r.content

यह सबसे सरल है जिसे मैं प्राप्त करने में सक्षम हूं।


यह सबसे सरल उत्तर है! urllib2अत्यधिक जटिल है।
Not2qubit 11

7

कुछ उदाहरण, कुछ चीनी वाक्य रचना के साथ, उस चीज़ के लिए यूरलिब का उपयोग कैसे करें। मैं अनुरोधों और अन्य पुस्तकालयों के बारे में जानता हूं, लेकिन यूरलिथ अजगर के लिए मानक रूप से उपयुक्त है और इसके लिए अलग से कुछ भी स्थापित करने की आवश्यकता नहीं है।

अजगर 2/3 संगत।

import sys
if sys.version_info.major == 3:
  from urllib.request import HTTPPasswordMgrWithDefaultRealm, HTTPBasicAuthHandler, Request, build_opener
  from urllib.parse import urlencode
else:
  from urllib2 import HTTPPasswordMgrWithDefaultRealm, HTTPBasicAuthHandler, Request, build_opener
  from urllib import urlencode


def curl(url, params=None, auth=None, req_type="GET", data=None, headers=None):
  post_req = ["POST", "PUT"]
  get_req = ["GET", "DELETE"]

  if params is not None:
    url += "?" + urlencode(params)

  if req_type not in post_req + get_req:
    raise IOError("Wrong request type \"%s\" passed" % req_type)

  _headers = {}
  handler_chain = []

  if auth is not None:
    manager = HTTPPasswordMgrWithDefaultRealm()
    manager.add_password(None, url, auth["user"], auth["pass"])
    handler_chain.append(HTTPBasicAuthHandler(manager))

  if req_type in post_req and data is not None:
    _headers["Content-Length"] = len(data)

  if headers is not None:
    _headers.update(headers)

  director = build_opener(*handler_chain)

  if req_type in post_req:
    if sys.version_info.major == 3:
      _data = bytes(data, encoding='utf8')
    else:
      _data = bytes(data)

    req = Request(url, headers=_headers, data=_data)
  else:
    req = Request(url, headers=_headers)

  req.get_method = lambda: req_type
  result = director.open(req)

  return {
    "httpcode": result.code,
    "headers": result.info(),
    "content": result.read()
  }


"""
Usage example:
"""

Post data:
  curl("http://127.0.0.1/", req_type="POST", data='cascac')

Pass arguments (http://127.0.0.1/?q=show):
  curl("http://127.0.0.1/", params={'q': 'show'}, req_type="POST", data='cascac')

HTTP Authorization:
  curl("http://127.0.0.1/secure_data.txt", auth={"user": "username", "pass": "password"})

फ़ंक्शन पूर्ण नहीं है और संभवतः आदर्श नहीं है, लेकिन उपयोग करने के लिए एक मूल प्रतिनिधित्व और अवधारणा दिखाता है। अतिरिक्त चीजों को स्वाद के साथ जोड़ा या बदला जा सकता है।

12/08 अपडेट

यहाँ अद्यतन स्रोत को जीने के लिए एक GitHub लिंक दिया गया है। वर्तमान में समर्थन कर रहे हैं:

  • प्राधिकरण

  • संगत ने संगत की

  • स्वचालित चारसेट का पता लगाना

  • स्वचालित एन्कोडिंग (संपीड़न) का पता लगाना


4

यदि यह ऊपर के सभी कमांड लाइन से चल रहा है जिसे आप खोज रहे हैं, तो मैं HTTPie की सिफारिश करूंगा । यह एक शानदार cURL विकल्प है और उपयोग करने के लिए (और अनुकूलित) सुपर आसान और सुविधाजनक है।

यहाँ GitHub से इसका (संक्षिप्त और सटीक) वर्णन है;

HTTPie (उच्चारण aych-tee-tee-pie) एक कमांड लाइन HTTP क्लाइंट है। इसका लक्ष्य सीएलआई को वेब सेवाओं के साथ मानव-अनुकूल बनाना संभव है।

यह एक सरल http कमांड प्रदान करता है जो एक सरल और प्राकृतिक सिंटैक्स का उपयोग करके मनमाने ढंग से HTTP अनुरोध भेजने की अनुमति देता है, और रंगीन आउटपुट प्रदर्शित करता है। HTTPie का उपयोग परीक्षण, डिबगिंग और आमतौर पर HTTP सर्वर के साथ बातचीत के लिए किया जा सकता है।


प्रमाणीकरण के आस-पास के प्रलेखन को आपको अपनी समस्या को हल करने के लिए पर्याप्त संकेत देना चाहिए। बेशक, उपरोक्त सभी उत्तर भी सटीक हैं, और एक ही कार्य को पूरा करने के विभिन्न तरीके प्रदान करते हैं।


बस इसलिए आपको स्टैक ओवरफ्लो से दूर जाने की जरूरत नहीं है, यहां यह संक्षेप में प्रस्तुत करता है।

Basic auth:

$ http -a username:password example.org
Digest auth:

$ http --auth-type=digest -a username:password example.org
With password prompt:

$ http -a username example.org


शायद मुझे यह बिल्कुल नहीं मिला, लेकिन क्या यह पायथन मॉड्यूल है? मुझे लगता है कि यह एक शेल / सीएलआई उपकरण है, और मैं निराश हूं: '(यह प्रयोग करने में इतना आसान लग रहा था
एलेक्स

@ एलेक्स - यह एक पायथन मॉड्यूल है। GADub पर README ( github.com/jkbrzt/httpie ) में वह सब कुछ है जो आपको चाहिए।
स्टक्सनेट करना
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.