programing

Python의 CURL 대안

jooyons 2023. 8. 8. 21:31
반응형

Python의 CURL 대안

PHP에서 사용하는 cURL 호출이 있습니다.

curl -i -H 'Accept: application/xml' -u login:key "https://app.streamsend.com/emails"

파이썬에서도 같은 방법이 필요합니다.파이썬에서 cURL을 대체할 수 있는 방법이 있습니까?나는 urlib는 알지만 사용법을 전혀 모릅니다.

요청 라이브러리를 사용할 수 있습니다.설치 대상

pip install requests

설명서는 https://requests.readthedocs.io/en/latest/ 에서 찾을 수 있습니다.

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을 호출합니다.완전히 테스트되지 않았습니다.

다음은 GitHub의 API에 대해 기본 인증을 수행하는 urllib2를 사용하는 간단한 예입니다.

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 요청만 지원합니다.
DELETE, PUT 등과 같은 다른 HTTP 동사를 사용해야 한다면 PYCURL을 살펴보고 싶을 것입니다.

그렇게 컬을 호출하는 명령을 사용하는 경우 파이썬에서 동일한 작업을 수행할 수 있습니다.subprocess예:

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

아니면 PycURL을 PHP가 가지고 있는 것처럼 더 구조화된 api로 가지고 싶다면 시도해 볼 수 있습니다.

import requests

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

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

이것이 제가 얻을 수 있는 가장 간단한 것입니다.

예를 들어, 설탕 구문을 사용하여 urlib를 사용하는 방법입니다.요청 및 기타 라이브러리에 대해서는 알고 있지만, urllib는 python의 표준 lib이며 별도로 설치할 필요가 없습니다.

Python 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 링크입니다.현재 지원되는 항목:

  • 허가

  • CRUD 호환

  • 자동 문자 집합 탐지

  • 자동 인코딩(압축) 탐지

만약 당신이 찾고 있는 명령줄에서 위의 모든 것을 실행하고 있다면 HTTPie를 추천합니다.이것은 환상적인 cURL 대안이며 사용하기 매우 쉽고 편리합니다.

GitHub의 (명확하고 정확한) 설명은 다음과 같습니다.

HTTPie(aych-tee-tee-pie로 발음됨)는 명령줄 HTTP 클라이언트입니다.목표는 웹 서비스와의 CLI 상호 작용을 가능한 한 인간 친화적으로 만드는 것입니다.

단순하고 자연스러운 구문을 사용하여 임의의 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

언급URL : https://stackoverflow.com/questions/2667509/curl-alternative-in-python

반응형