পাইথনে সিআরএল বিকল্প


114

আমার একটি সিআরএল কল রয়েছে যা আমি পিএইচপিতে ব্যবহার করি:

কার্ল -i-এইচ 'স্বীকার করুন: অ্যাপ্লিকেশন / এক্সএমএল' -u লগইন: কী " https://app.streamsend.com/emails "

পাইথনে একই জিনিস করার জন্য আমার একটি উপায় দরকার। পাইথনে সিআরএল-এর বিকল্প আছে কি? আমি urllib জানি কিন্তু আমি একটি পাইথন নুব এবং এটি কীভাবে ব্যবহার করতে হয় তার কোনও ধারণা নেই।


2
আপনি চেষ্টা করতে পারেন pycurl
ghostdog74

2
urllib2 এই ধরণের কাজের জন্য একটি বহুল ব্যবহৃত প্যাকেজ।
সৌরভ


3
requestsউপরেরটি পাইথনে সাধারণ পোস্ট করার জন্য দুর্দান্ত লাইব্রেরির লিঙ্কটি রয়েছে (পাইপিতে ইজি_ইনস্টল বা পাইপের মাধ্যমে ইনস্টল করার জন্য উপলব্ধ)। নাম / ইউআরএলটি কিছুটা বিভ্রান্তিকর - প্রথমে আমি প্রায় ভেবেছিলাম এটি একটি উন্নতির জন্য একটি ইচ্ছা তালিকা অনুরোধ urllib2, পরিবর্তে requestsপাইথোনিক লাইব্রেরি sudo easy_install requestsবা ব্যবহারের জন্য খুব স্বজ্ঞাত sudo pip install requests
ডাঃ জিম্বব

পাইথন অনুরোধগুলি বনাম পাইকারেল পারফরম্যান্স আপনি আপনার প্রয়োজনের প্রতি সম্মানজনক
সান্থোশ

উত্তর:


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']

পরিবর্তে urlib2 ব্যবহার করে আপনার সিআরএল কল। সম্পূর্ণরূপে অনির্ধারিত।


4
ঠিক নীচের উত্তরের সাথে এটির তুলনা করা ভাল এবং গত চার বছরে পাইথন কতটা এগিয়েছে তা দেখুন
রাজি শাবান

133

আপনি অনুরোধগুলিতে বর্ণিত HTTP অনুরোধগুলি ব্যবহার করতে পারেন : মানুষের ব্যবহারকারী নির্দেশিকার জন্য HTTP


2
অনুরোধ সর্বশেষ এবং সর্বশ্রেষ্ঠ! এটি ধূমপান করে এবং আনাড়ি urllib2 পোড়ায়, আমি অনুরোধ পাইথন আগত 3.x সংস্করণগুলির জন্য আদর্শ এইচটিটিপি ক্লায়েন্ট হয়ে
উঠতে চাই

1
আমি যখন অনুরোধগুলি ব্যবহার করতে শুরু করি তখন আর আর urlib2 সরাসরি আর ব্যবহার করে ফিরে দেখিনি। অন্তর্নির্মিত জেএসওন ডিকোডিংটিও সহজ। যথাযথ কন্টেন্ট-টাইপ সেট করা থাকলে জসন দিয়ে ম্যানুয়ালি শরীর লোড করার দরকার নেই।
থমাস ফারভর

অনুরোধগুলি এত সহজ। এমনকি আমি কয়েক মিনিটের মধ্যে একটি কাস্টম প্রমাণীকরণ স্কিম তৈরি করতে সক্ষম হয়েছি। urllib2 অত্যন্ত বিরক্তিকর।
ডগ

35

এখানে urlib2 ব্যবহার করে একটি সাধারণ উদাহরণ যা গিটহাবের এপিআইয়ের বিপরীতে মৌলিক প্রমাণীকরণ করে।

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 এবং পোস্ট অনুরোধগুলিকে সমর্থন করে।
আপনার যদি অন্য এইচটিটিপি ক্রিয়া যেমন ডিলেট , পুট ইত্যাদি ব্যবহার করতে হয় তবে আপনি সম্ভবত পিওয়াইসিআরএল একবার দেখে নিতে চাইবেন


কেন এটিকে ভোট দেওয়া হয়েছিল? ডি: সম্ভবত কারণ আপনার PYCURL পরিবর্তে PycURL লিখেছিলেন
Bhargav রাও

20

আপনি যদি ঠিক সেইভাবে কার্ল কল করতে কোনও কমান্ড ব্যবহার করে থাকেন তবে আপনি পাইথনের সাথে একই জিনিসটি করতে পারেন subprocess। উদাহরণ:

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

অথবা আপনি পিএইচআরএল চেষ্টা করতে পারেন যদি আপনি এটি পিএইচপি-র মতো আরও কাঠামোগত এপিআই হিসাবে রাখতে চান


না। সিআরএল কলটি একটি প্রোগ্রামের অংশ। আপনি যদি উপরের কার্ল কলটিতে ঠিক একই কাজটি করে এমন কোডটি পোস্ট করতে পারেন, তবে তা দুর্দান্ত।
গৌরব শর্মা

আপনার প্রশ্নের উপর ভিত্তি করে সাবপ্রসেস ব্যবহার করে আমি কী বোঝাতে চাইছি তার একটি উদাহরণ যুক্ত করা হয়েছে তবে আমি অনুমান করছি আপনি পাইক URL এর মতো আরও কিছু সন্ধান করছেন।
unholysampler

আমি জানি এটি পুরানো, তবে পাইক URL আমার মতে সিআরএল-এর বেশিরভাগ ব্যবহারের জন্য বেশ নিম্ন স্তরের। এমনকি সিআরএল এর পিএইচপি বাস্তবায়ন মোটামুটি নিম্ন স্তরের।
থমাস ফারভর

আমি সিএমডি থেকে "পাইথন" কল করার পরে "নামের ত্রুটি, নাম সাবপ্রসেস সংজ্ঞায়িত হয়নি" এবং তাই পাইথন এনভিতে থাকি।
টিমো

@ টিমো আপনি কি করেছেন import subprocess? পাইথন repl পরিবেশটি অজগর ফাইলের মতো, আপনাকে অন্যান্য মডিউলগুলি আমদানি করতে হবে।
আনহোলিস্যাম্পলার

13
import requests

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

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

এটি আমি এটি পেতে সক্ষম হয়েছি সবচেয়ে সহজ।


এটাই সহজ উত্তর! urllib2অত্যধিক জটিল।
not2qubit

7

কিছু উদাহরণ, কিছু চিনির বাক্য গঠন সহ কীভাবে সেই জিনিসগুলির জন্য urllib ব্যবহার করবেন। আমি অনুরোধ এবং অন্যান্য গ্রন্থাগারগুলি সম্পর্কে জানি, তবে urllib পাইথনের স্ট্যান্ডার্ড লাইব এবং আলাদাভাবে কোনও কিছু ইনস্টল করার প্রয়োজন হয় না doesn't

পাইথন 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 আপডেট

লাইভ আপডেটেড উত্সটির জন্য এখানে একটি গিটহাব লিঙ্ক। বর্তমানে সমর্থন:

  • অনুমোদন

  • সিআরইউডি সামঞ্জস্যপূর্ণ

  • স্বয়ংক্রিয় অক্ষর সনাক্তকরণ

  • স্বয়ংক্রিয় এনকোডিং (সংক্ষেপণ) সনাক্তকরণ


4

আপনি যে কমান্ড লাইনটি সন্ধান করছেন তা থেকে যদি এটি উপরের সমস্তটি চালাচ্ছে তবে আমি HTTPie এর পরামর্শ দেব । এটি একটি দুর্দান্ত সিআরএল বিকল্প এবং এটি ব্যবহার করা (এবং কাস্টমাইজ) করা সহজ সহজ এবং সুবিধাজনক

গিটহাবের এটির (পারস্পরিক সংক্ষিপ্ত এবং সুনির্দিষ্ট) বর্ণনা এখানে রয়েছে;

HTTPie (উচ্চারণে আইচ-তে-তে-পাই) একটি কমান্ড লাইন এইচটিটিপি ক্লায়েন্ট। এর লক্ষ্যটি হ'ল সম্ভব হ'ল ওয়েব-সার্ভিসের সাথে সিএলআইর ইন্টারঅ্যাকশনটি যতটা সম্ভব মানব-বান্ধব।

এটি একটি সাধারণ http কমান্ড সরবরাহ করে যা একটি সাধারণ এবং প্রাকৃতিক সিনট্যাক্স ব্যবহার করে নির্বিচারে 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


সম্ভবত আমি এটি আদৌ পাই নি, তবে এটি কি পাইথন মডিউল? আমি এটি শেল / সিএলআই সরঞ্জাম অনুমান করি এবং আমি নিরাশ হয়ে পড়েছি: '(এটি ব্যবহার করা এত সহজ বলে মনে হয়েছিল
অ্যালেক্স

@ অ্যালেক্স - এটি একটি পাইথন মডিউল। রিদম অন গিথুব ( github.com/jkbrzt/httpie ) এ আপনার প্রয়োজনীয় সমস্ত কিছু রয়েছে।
stuxnetting
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.