Pythonで認証(パスワード)が必要なWeb APIを成功させる方法【Requests】

Pythonで認証(パスワード)が必要なWeb APIを成功させる方法は?
PythonのモジュールRequestsでID、パスワード、トークンを入力すればいいって本当?
こんな疑問に答えます。

僕はWordPressのブログでは月2万PV、自作のiPhoneアプリを2つリリースしています。
そんな僕が解説していきます。

作業環境

MacOSX High Sierra
Py Charm CE 2018.2.2
Python 3.6
Requests v2.19.1

1.Requestsとは?(モジュール)

「Web APIとは何か」「簡単なWeb API」についてはこちらの記事に書きました。
WebAPIを初心者が簡単に5分で取得する方法を解説【Mac】

Web APIは「Webブラウザ」で特定のURLを入れれば、特定の答えが返ってくる便利なシステムでした。
しかし、中には認証(ID、パスワード、トークン)が必要になる場合があります。

そうなってくると、やはりPythonを使って送受信するのがシンプルで便利そうです。

(1)Web APIが使える定番のプラグイン(的なもの)

Requestsは、手軽に HTTP リクエストを発行することができる定番「モジュール」です。

Requestsは、人が使いやすいように設計されていて、Pythonで書かれている Apache2 Licensed ベースのHTTPライブラリです。
Pythonの標準の urllib2 モジュールは、必要とされるほとんどのHTTPの機能を備えていますが、APIがまともに 使えません 。
http://jp.python-requests.org/en/latest/

こう書かれているように、RequestsはPythonでWebページ関連を扱うのに便利で定番のモジュールのようです。
urllib2というおなじみの標準装備モジュールよりもWebAPIが使えて便利、とドヤ顔で書かれています。

モジュールとは?
モジュールとは、Pythonの定義と文を含むファイルのこと…とありますが、
ようはプラグイン的な存在
「パッケージされたソースファイル」ってことでいいと思います。

モジュールは、Pythonの定義と文を含むファイルです。
Pythonは定義をファイルに入れてスクリプトやインタプリタのインタラクティブなインスタンスで使う方法を持っています。
https://docs.python.org/3/tutorial/modules.html

モジュールのインストール方法(マウスのみで5分)はこちらの記事に書いています。

Pythonのモジュールをインストールする方法【初心者向け】

たくさんの便利なモジュールが、いろんなジャンルで公開されていますね。

有益なモジュールリスト
https://wiki.python.org/moin/UsefulModules

(2)公式ページで知れるRequestsの機能

Requests公式ページの主な内容
・Requestsとは
・インストール方法
・基本の使い方
・応用的な使い方
・認証について

Requestsの公式ページは、こんな構成になっています。
シンプルなので全貌がわかりやすいです。

でも、まあゴチャゴチャ言わずに使ってみた方が絶対に理解が早いと思います。
なので、やっていきましょう。

Pythonは基本的に「ツール」なので、使わないで理解するのは、マジしんどいと僕は思います。
(包丁(ツール)の使い方を覚えるのに、玉ねぎのみじん切り「だけ」してるとしんどいです、カレーを作りましょう)

2.コード概要

今回、試しに書いたコードの概要はこちら。

(コード画像)

こんな感じで、実践していきます。
では、それぞれ細かく解説していきますね。
最後にコードソースを載せています。

3.importする

冒頭にimport xxxxxって書くとモジュールをインポートできます。

4.認証作業の基本

4−1.HTTPBasicAuth(Basis認証)とは?

認証が必要な多くのWebサービスでは、HTTP Basic Authを受け入れます。
これは最もシンプルな種類であり、Requestsはすぐにそのままサポートします。
http://docs.python-requests.org/en/master/user/authentication/

HTTPBasicAuthは、パスワードの認証の形式の1つで、上で説明したRequestsでもサポートされているとのことです。
意味としては、「Basic認証」のことですね。

Basic認証(Basic Authentication
Basic認証とは、HTTPで定義される認証方式の一つ
ユーザ名とパスワードの組みをコロン ":" でつなぎ、Base64でエンコードして送信する
盗聴や改竄が簡単であるという欠点を持つが、ほぼ全てのWebサーバおよびブラウザで対応しているため、広く使われている。
https://ja.wikipedia.org/wiki/Basic認証より要約引用

4−2.必要なパスワードの種類は?

僕が実践した例では、IDとトークンの2種類が必要でした。
毎回、異なってくると思います。

5.URLにパラメーターを渡して認証する

URLにパラメーターを渡す書き方を覚えます。
URLにパラメーター…つまり、URLにパスワードとIDの複数の情報を与えるって事ですね

前回の記事で紹介した、簡単なタイプの5分でできたWebAPIはブラウザから「URL打つだけ」でOKでした。
今回はPythonで「複数」送るわけです。

URLにパラメーターを渡す
URLのクエリ文字列として、あるデータを追加して送信したい時があるかもしれません。
手動でURLを作成する場合、(中略) params キーワード引数を使って、辞書としてこれらの引数を渡すことができます。
例として、 (中略) 以下のコードでできます。

>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.get("http://httpbin.org/get", params=payload)

http://jp.python-requests.org/en/latest/user/quickstart/より引用

このように{}内に並べて、「params=」の部分に入れればいいってことですね。

5−1.URLを定義しておく

URLなんですけど、これは定義しておいてから、get文を作るのがいいと思います。
これからURLを頻繁に変更していくので、綺麗に書いておいた方がいいという意味です。

>>> payload = {'key1': 'value1', 'key2': 'value2'}
url = "{}/oranges/orange_ir2ba2cdmksibe-dsuew98bsl".format(API)
>>> r = requests.get(url, params=payload)

URLの定義の{}と「.format(API)」の意味

これは文字列に関する「formatメゾット」を使用しています。
{}内にformat()のカッコ内に指定したものを入れますよ、ってことですね。
APIの大元のURL部分(エンドポイント)は大抵共通なので、下位部分だけ書き換えればいいです。

例えば、下位部分が「/orages/orange.....」とかなら、ここだけ書き換えればいいですね。
上位の「http://fruits.example.com/api/1」とかの部分は共通なので、{}で省略できます。

PEP 3101 - 高度な文字列フォーマット
中かっこ( '中括弧')は、文字列内の置換フィールドを示すために使用されます。

"My name is {0}".format('Fred')

この結果は次の文字列です。

"My name is Fred"

https://www.python.org/dev/peps/pep-3101/#string-methodsより翻訳引用

Endpointとは?
基本中の基本ですが、エンドポイントって何?について書いておきます。

エンドポイントは、外部からアクセスできるリソースの場所を示すものです。
Web APIとの重要な側面です。
通常、アクセスはHTTPリクエストがポストされているURIを介して行われます。
https://en.wikipedia.org/wiki/Web_APIより引用

WebAPIを呼び出すためのURLです。
APIの基本のURLってイメージでいいと思います。
(そもそもWebAPIというのは、URL1行入れれば、情報をポンとだす技術のことです。)

5−2.ユーザー名パスワードを含めてGET文を書く

ほぼ出来上がっていますが、GET文を清書していきます。

そもそも、GETというのHTTPを操作するメソッドの代表例ということらしいです。
Requestsモジュールでは、GET、OPTIONS、HEAD、POST、PUT、PATCH、DELETEのほぼすべてのHTTP動詞にアクセスできるとのことです。
(http://jp.python-requests.org/en/latest/user/advanced/より)
それがそのまま、「Request Method」(Requestで使える命令)となっています。

HTTP動詞/HTTP Verbsとは?
https://ja.wikipedia.org/wiki/Hypertext_Transfer_Protocolより作成
HTTPとは、HTMLなどのコンテンツの送受信に用いられる通信プロトコル(中略)
HTTPでは8つのメソッドが定義されている。
ただし、実際のHTTP通信ではGETとPOSTメソッドだけで殆どを占める。

GET
指定されたURIのリソースを取り出す。HTTPの最も基本的な動作。
POST
クライアントがサーバにデータを送信。Webフォームや電子掲示板への投稿などで使用
PUT
指定したURIにリソースを保存する。画像のアップロードなどが代表的。
DELETE
指定したURIのリソースを削除する。
OPTIONS
サーバを調査する。例えば、サーバがサポートしているHTTPバージョンなど
HEAD
GETと似ているが、サーバはHTTPヘッダのみ返す。例えばWebページのリンク先が生きているか
TRACE
サーバまでのネットワーク経路をチェックする。
CONNECT
TCPトンネルを接続する。暗号化したメッセージをプロキシサーバを経由して転送する際に用いる。

6.情報の書き出し

6−1.そのままprintする

print(r.text)

で、さきほど「r」と名付けたものの中身を出力できます。
下にズラっと出てきます。

6−2.jsonファイルを扱う(標準モジュール)

Json形式でアウトプットすることもできます。
標準でついているJsonモジュールを、importしておいて、使用します。

print(json.loads(r.text))

6−3.取り出した情報を整理するには?

これは情報のボリュームによると思います。
シンプルな短文なら、そのまま目で見て終わりかもしれません。

複雑な長文なら、僕ならエクセルで抽出とかして、整理しちゃいますね。
(Pythonでエクセルの記述もできるみたいですが、そこまでする必要なくね)

ま、見極めだと思います。
自分の能力でできる範囲で短時間で済む方法がいいですよね。

7.完成コード

(完成コード)

参考資料

Python Wiki
https://wiki.python.org/moin/FrontPage

Pythonドキュメント(日本語)
https://docs.python.org/ja/3/

Requests
http://docs.python-requests.org/

Requestsの日本語訳ページも存在しますが、内容は一緒です。

というわけで今回は以上です。

理解するまではやっかいですが、用語とか仕組みがわかると、すっきり頭に入ってくる感じでした。
Requestsモジュールは便利ですね。
今回のこれができると、使えるAPIが広がるんじゃないかなと思います。
Pythonっていうのは、本当にシンプルに書くだけで、すごいことができますね、感動。

-Python