1. ホーム

python requests advanced usage -- SSL証明書エラーの解決策を含む

2022-03-02 01:26:54

<スパン httpsのサイトにアクセスするためにrequestsを使用すると、エラーが発生します。 

error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

この記事を http://python.codemach.com/pythonrequests-gao-ji-yong-fa.html で探す

---------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------

セッションオブジェクト セッションオブジェクト

Sessionオブジェクトを使用すると、リクエスト時に特定のパラメータを持続させることができます。さらに、すべてのリクエストに対して、Session インスタンスによってクッキーも永続化されます。

を使うことにこだわってみましょう。

s = requests.Session()

s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')

r = s.get("http://httpbin.org/cookies")

print r.text

# '{"cookies": {"sessioncookie":"123456789"}}'

また、セッションを使用して、データを要求するデフォルトのメソッドを提供することができます。これは、データセッションオブジェクトに以下のプロパティを与えることで実現します。

s = requests.Session()

s.auth = ('user', 'pass')

s.headers.update({'x-test': 'true'})

# 'x-test' と 'x-test2' の両方が送信されます。

s.get('http://httpbin.org/headers', headers={'x-test2': 'true'})

辞書はすべてセッションレベルで設定された値にマージされ、リクエストメソッドに渡されます。メソッドレベルのパラメータはセッションのパラメータを上書きします。

辞書パラメータから値を取得する

セッションからパラメータを削除したい場合は、パラメータをnoneに設定すれば自動的に削除されます。

セッション内のすべての値が含まれ、直接提供されます。詳しくはSession APIドキュメントをご覧ください。

リクエストオブジェクトとレスポンスオブジェクト

>>> r = requests.get('http://en.wikipedia.org/wiki/Monty_Python')

表示

>>> r.headers

{'content-length': '56170', 'x-content-type-options': 'nosniff', 'x-cache':

'HIT from cp1006.eqiad.wmnet, MISS from cp1010.eqiad.wmnet','content-encoding':

'gzip', 'age': '3080', 'content-language': 'en', 'vary': 'Accept-Encoding,Cookie',

'server': 'Apache', 'last-modified': 'Wed, 13 Jun 2012 01:33:50 GMT'。

'connection': 'close', 'cache-control': 'private, s-maxage=0, max-age=0,

must-revalidate', 'date': 'Thu, 14 Jun 2012 12:59:39 GMT', 'content-type':

'text/html; charset=UTF-8', 'x-cache-lookup': 'HIT fromcp1006.eqiad.wmnet:3128,

cp1010.eqiad.wmnet:80 からはMISS'}。

しかし、サーバーが送信したヘッダーを取得したい場合は、単にリクエストにアクセスし、次にリクエストヘッダにアクセスします。

>>> r.request.headers

{'Accept-Encoding': 'identity, deflate, compress, gzip'。

'Accept': '*/*', 'User-Agent': 'python-requests/1.2.0'}.

リクエストの準備

APIコールやセッションコールでResponseオブジェクトを受け取ったとき、requestプロパティは実際にPreparedRequestによって使用されます。場合によっては、リクエストを送信する前に、ボディやヘッダ (あるいは本当に他のもの) に対して何らかの追加作業を行いたいことがあります。この簡単なレシピは次のとおりです。

from requests import Request, Session

s = セッション()

prepped = Request('GET', # または 'POST', 'PUT', などの他のメソッド)

                 のURLになります。

                 data=data

                 headers=headers

                 # ...

                 ).prepare()

# prepped.bodyで何かをする

# prepped.headersをどうにかしてくれ

resp = s.send(prepped,

             stream=stream。

             verify=検証する。

             proxies=プロキシ。

             cert=cert。

             timeout=タイムアウト。

             # などです。

             )

print(resp.status_code)を実行します。

リクエストオブジェクトに対して特別なことはしていないので、PreparedRequestオブジェクトをすぐに修正することができます。それから、送信したいリクエストの他のパラメータを送信することができます。* またはSesssionで *.

SSL証明書の検証

Requests は、Web ブラウザと同様に HTTPS リクエストの SSL 証明書を検証することができます。ホストのSSL証明書を確認するには、checksumパラメータを使用します。

>>> requests.get('https://kennethreitz.com', verify=True)

requests.exceptions.SSLError: ホスト名 'kennethreitz.com' は '*.herokuapp.com', 'herokuapp.com' のいずれとも一致しません。

このドメインにはSSLを設定していないので、失敗しています。Great On Githubはないですが。

>>> requests.get('https://github.com', verify=True)

<レスポンス [200]>

また、プライベート証明書の CA_BUNDLE ファイルのパスを検証することで、確認することができます。また、環境変数REQUESTS_CA_BUNDLEを設定することも可能です。

また、検証の設定をFalseにすると、SSL証明書の検証を無視することができます。

>>> requests.get('https://kennethreitz.com',cert=('/path/server.crt', '/path/key'))を実行します。

<レスポンス [200]>

間違ったパスや無効な証明書が指定された場合。

>>> requests.get('https://kennethreitz.com',cert='/wrong_path/server.pem')を実行します。

SSLError: [Errno 336265225] _ssl.c:347: error:140B0009:SSLroutines:SSL_CTX_use_PrivateKey_file:PEM lib

メインコンテンツのワークフロー

デフォルトでは、リクエストを行うと、ボディはすぐにダウンロードすることで応答します。この動作をオーバーライドして、streamパラメータのプロパティで、Response.contentにアクセスするまで、レスポンスのボディをダウンロードするのを遅らせることができます。

tarball_url = 'https://github.com/kennethreitz/requests/tarball/master'

r = requests.get(tarball_url, stream=True)

この時点ではダウンロードしたレスポンスヘッダとコネクションだけが残っており、コンテンツの取得を条件付きで行うことができるようになっています。

if int(r.headers['content-length']) < TOO_LONG:

  コンテンツ = r.content

  ...

Response.iter_content と Response.iter_lines メソッドを使用してワークフローをさらに制御したり、Response.raw でベースの urllib3.HTTPResponse から読み取ったりすることも可能です。

活動的であること

公開された接続は、読み込まれたすべてのデータを再利用するプールに戻ることに注意してください。

データストリームを false に設定するか、Response オブジェクトの content プロパティを必ず読み込んでください。

ストリームのアップロード

リクエストサポート それは、アップロードのためにメモリに読み込まれない大量のストリームやファイルストリームを送信することができます。ストリームやアップロードを行うには、単純にボディにファイルのようなオブジェクトを

をopen('massive-body')をfとして指定します。

    requests.post('http://some.url/streamed', data=f)

ブロックエンコードの要求。

また、リクエストの送信および受信をエンコードするチャンク転送もサポートしてください。チャンクエンコーディングされたリクエストを送るには、BODY: にジェネレータ (または長さのない任意のイテレータ) を指定するだけです。

def gen():

    'hi'を返す。

    そこにいる

requests.post('http://some.url/chunked', data=gen())

イベントフック。

リクエストにはフックであるsystemがあり、リクエスト処理の一部やシグナルイベントの処理に使用することができます。

フック関数は、フックのリクエストパラメータを {hook_name: callback_function} という辞書で指定し、リクエストごとに指定することができます。

hooks=dict(response=print_url)

そのCALLBACK_FUNCTIONは、受信したデータブロックを第1引数として受け取ります。

>>> requests.get('http://httpbin.org',hooks=dict(response=print_url))を実行します。

http://httpbin.org

<レスポンス [200]>

カスタム認証

このcallback_functionは、最初の引数としてデータのチャンクを受け取ります。

from requests.auth import AuthBase

class PizzaAuth(AuthBase):

    与えられたリクエストオブジェクトに HTTP ピザ認証をアタッチします。

    def __init__(self, username):

        # 認証に関連するあらゆるデータを設定する

        self.username = ユーザー名

    def __call__(self, r):

        # リクエストを修正して返す

        r.headers['X-Pizza'] =self.username

        return r

次に、Pizza Auth を使ってリクエストを行います。

>>> requests.get('http://pizzabin.org/admin',auth=PizzaAuth('kenneth'))

<レスポンス [200]>

プロキシ

インポートリクエスト

プロキシ = { <未定義

  "http": "http://10.10.1.10:3128",

  "https": "http://10.10.1.10:1080"。

}

requests.get("http://example.org", proxies=proxies)

また、プロキシサーバー環境 HTTP_PROXY および HTTPS_PROXY を設定することができます。

$ export HTTP_PROXY="http://10.10.1.10:3128"。

$ export HTTPS_PROXY="http://10.10.1.10:1080"。

$ python

>>> インポート リクエスト

>>> requests.get("http://example.org")。

プロキシでHTTP Basic Authを使用するには、http://user:password@host/syntaxを使用します。

プロキシ = { <未定義

    "http":"http://user:[email protected]:3128/" です。

}

<スパン コンプライアンス

ユーザーに困難をもたらすことなく、関連する仕様やRFCに準拠することが要求されています。これには懸念があり、おそらく当該仕様に不慣れな人にとっては、一見異常な動作になる可能性があります。

コーディングです。

明示的な文字セットがない場合、テキストはHTTPヘッダーのContent-Typeヘッダーに含まれます。この場合、RFC2616ではデフォルトの文字セットはISO-8859-1でなければならないと規定されています。

HTTP動詞

リクエストでは、ほぼすべてのHTTP動詞にアクセスすることができます。GET, OPTIONS, HEAD, POST, PUT, PATCH, そして DELETE。詳細な例は、GitHub の API を使ってリクエストの中でこれらのさまざまな動詞を使ったものです。

>>> インポートリクエスト

>>> r =requests.get('https://api.github.com/repos/kennethreitz/requests/git/commits/ a050faf084662f3a352dd1a941f2c7c9f886d4ad')を実行します。

GitHub は JSON を返すので、r.json メソッドでパースして Python オブジェクトに変換します。

>>> commit_data = r.json()

>>> print commit_data.keys()

[u'committer'、u'author'、u'url'、u'tree'、u'sha'、u'parents'、u'message']。

>>> print commit_data[u'committer'].

{u'date': u'2012-05-10T11:10:50-07:00', u'email': u'[email protected]',u'name': u'Kenneth Reitz'}.

>>> print commit_data[u'message'].

履歴を作る

リクエストには、非常に一般的なBasic認証を含む、さまざまな形式の認証を簡単に使用することができます。

>>> from requests.auth import HTTPBasicAuth

>>> auth = HTTPBasicAuth('[email protected]','not_a_real_password')

>>> r = requests.post(url=url, data=body, auth=auth)

>>> r.status_code

201

>>> content = r.json()

>>> print content[u'body'].

すぐに取り掛かります。