はじめてのマッシュアップ

# はじめに

この記事はPythonでAPIを初めて触る方向けに、APIを触り、マッシュアップするまでを説明しています。
なお、(ブラウザ上で動かすのではなく)ターミナル上までの実装になります。


# マッシュアップとは?

**マッシュアップ**とは、複数のWebサービスの**API**を組み合わせ、あたかも一つのWebサービスのようにする機能のことです（音楽用語ではないほうです）。

**API**は Application Programming Interface の略語で、(ものすごくかみ砕いて説明すると)ソフトウェア同士がやり取りをするためのインタフェースのことです。一般的なWebサービスもこのAPIを取り入れたり、組み合わせたりして、大きなサービスを構成しています。

Webサービス事業者がサービスの機能やデータの一部をAPIとして公開し、他のサービスが利用できるように用意している場合があります。

要するにマッシュアップとは、プログラミングのプラモデルのようなものです。

模型を作るとき、プラ板を渡されて「さあ、模型を作ろう！」と言われたらどうでしょうか？とんでもなくハードルが高いと思います。

しかしプラモデルのように、あらかじめ部品が用意されており、組み合わせることで模型を作り上げるのであれば、初心者でもそこそこの形のものになります。

現在では、マッシュアップはプログラミングコンペティションが実施されるほど重要な開発手法の１つになっています。


# とりあえずAPIを触ってみる


この記事では、比較的利用しやすく色々と面白いデータがそろっている「リクルートWEBサービス」のAPIを紹介します。


## リクルートWEBサービスとは

> リクルート WEBサービスは、リクルートが保有するデータベースを外部から利用するためのWeb APIを一括提供するサービスです。 

by [リクルートWEBサービスの公式ページ](https://webservice.recruit.co.jp/)

つまり、リクルートが提供しているWEBサービスのデータの一部を一般のユーザでも利用できるサービスです。

この記事を執筆している現在、リクルートWEBサービスが提供しているAPIは以下のとおりです。

- [ケイコとマナブ.net](https://webservice.recruit.co.jp/manabi/)
- [スタディサプリ進路](https://webservice.recruit.co.jp/shingaku/)
- [エイビーロード航空券](https://webservice.recruit.co.jp/ab-road-air/)
- 
ホットペッパーグルメ
 サービス終了済み
- [カーセンサー](https://webservice.recruit.co.jp/carsensor/)

今回は著者が車好きということもあり、「[カーセンサーWebサービスAPI](https://webservice.recruit.co.jp/carsensor/)」を利用してみることにします。

さっそくですがサンプルプログラムを紹介しましょう。

```python
import json
import requests
from urllib.parse import urlencode
 
def main():
    url = "http://webservice.recruit.co.jp/carsensor/usedcar/v1/?{}".format(
        urlencode(
            {"key"     : "xxxxxx", # ダミー
             "keyword" : "GTR",
             "format"  : "json"
            }))
 
    fu = requests.get(url).content
    json_result = json.loads(fu)
 
    print(json_result['results']['usedcar'][0])
 
if __name__ == "__main__":
    main()
```

### リクエスト方法

やっていることは非常に単純で、`http://webservice.recruit.co.jp/carsensor/usedcar/v1/`というURLにクエリストリングを引っ付けてURLリクエストしているだけです。

具体的には`urllib.parse.urlencode`でクエリストリングを埋め込み、`requests`でアクセスします。日本語やスペースなどのメタ文字が入るとURL文字列へのエンコードが必要になるので気を付けましょう。

- URL: サービスによって異なります。リファレンスの目立つところに書いてあります。
- パラメータ
    - key: APIキー。[ユーザー登録](https://webservice.recruit.co.jp/register/index.html)して手に入れましょう
    - keyword: 検索用のキーワード
    - format: 返り値の形式。xmlやjsonなどが多い

最も重要なパラメータはkeyです。これが無いとそもそもサービスを利用できません。
リクルートWebサービスに限らず、公開されているほとんどのAPIでは、そのサービスを利用するための鍵(パスフレーズ)が必要です。

**使いたいAPIを見つけたら、まず利用申請をして鍵を入手しましょう。**

上記のサンプルプログラムでは、最低限のパラメータだけを使っていますが、もちろん、与えるパラメータは他にも多数あります。[リファレンス](https://webservice.recruit.co.jp/carsensor/reference.html)とにらめっこして、色々と試してみましょう。


### データの受け取り

サンプルプログラムではURLリクエストの結果、帰ってくるパラメータをfuで受け取り、json形式へ変換します。その後必要なパラメータのみを選択して出力しています。

受け取ったデータ内のパラメータは、これまた[リファレンス](https://webservice.recruit.co.jp/carsensor/reference.html)に記述されています。またまたにらめっこして、色々と試してみましょう。

### APIの利用方法

APIの基本的な利用方法は、以下の通りです。

1. リクエストURLに適当なクエリストリングを付け加えてURLアクセスする
2. 帰ってきた値をパースして、必要な情報を抽出し、出力する

与える情報、帰ってくる情報はAPIによって様々です。そのため、

M「どこで使い方を習った？」
C「説明書を読んだのよ！」

の精神が大切です。


## もう一つのAPI(YouTube Data API)

マッシュアップとは、「複数のWebサービスのAPIを組み合わせ」なので、1つのAPIをいじっているだけではマッシュアップとは呼べません。

そこで上記の「[カーセンサーWebサービスAPI](https://webservice.recruit.co.jp/carsensor/)」に「[YouTube Data API](https://developers.google.com/youtube/v3/getting-started?hl=ja)」を組み合わせ、中古車情報とともにその車に関連する動画も同時に出してしまおう！というサービス？を作ってみます。

[YouTube Data API](https://developers.google.com/youtube/v3/getting-started?hl=ja) を動かすプログラムは以下の通りです。

```python
import sys
import json
import requests
from urllib.parse import urlencode

def main():
    url = "https://www.googleapis.com/youtube/v3/search?{}".format(
        urlencode(
            {"key"     : "yyyyy", # ダミー
            "part"    : "snippet",
             "q"       : "ホンダ,S660",
             "type"    : "video",
             "order"   : "viewCount"
            }))

    f_url = requests.get(url).content
    json_result = json.loads(f_url)

    print(json_result['items'][0])

if __name__ == "__main__":
    main()
```

渡すキーワードや受け取るパラメータは変わっていますが、

1. リクエストURLに適当なクエリストリングを付け加えてURLアクセスする
2. 帰ってきた値をパースして、必要な情報を抽出し、出力する

という構造は「カーセンサーWebサービス」と同じです。

リクエストパラメータと返り値についてはよく[リファレンス](https://developers.google.com/youtube/v3/docs/?hl=ja)を読みましょう。


## マッシュアップしてみる

では最後に「[カーセンサーWebサービスAPI](https://webservice.recruit.co.jp/carsensor/)」と「[YouTube Data API](https://developers.google.com/youtube/v3/getting-started?hl=ja)」をさらりとマージしてマッシュアップしましょう。

受け取った検索キーワードを量APIそれぞれで検索して、その結果を返すプログラムを作成します。


```python
import sys
import json
import requests
from urllib.parse import urlencode
import string
 
TEMPLATE='''
${model} ${brand} ${price}
詳細： ${curl}
動画：${vtitle} ${vurl}
'''
 
def carsencorSearch(keyword):
    url = "http://webservice.recruit.co.jp/carsensor/usedcar/v1/?{}".format(
        urlencode(
            {"key"     : "xxxxx", # ダミー
             "keyword" : keyword,
             "format"  : "json"
            }))
 
    f_url = requests.get(url).content
    json_result = json.loads(f_url)
 
    return json_result['results']['usedcar']
 
def youtubeVideoSearch(keyword):
    url = "https://www.googleapis.com/youtube/v3/search?{}".format(
        urlencode(
            {"key"     : "yyyyy", # ダミー
             "q"       : keyword,
             "type"    : "video",
             "order"   : "viewCount" ,
             "part"    : "snippet"
            }))
 
    f_url = requests.get(url).content
    json_result = json.loads(f_url)
 
    return json_result['items'][0]
 
 
def output(d_car, d_video):
    d = dict()
    d.setdefault('curl', d_car['urls']['pc'])
    d.setdefault('model',d_car['model'])
    d.setdefault('brand', d_car['brand']['name'])
    d.setdefault('price', d_car['price'])
    d.setdefault('vurl', 'https://www.youtube.com/watch?v={}'.format(d_video['id']['videoId']))
    d.setdefault('vtitle', d_video['snippet']['title'])
 
    print(string.Template(TEMPLATE).safe_substitute(d))
 
 
if __name__ == "__main__":
    input = 'ホンダ S660'
    L = carsencorSearch(input)
    for d in L:
        key = "{},{}".format(d['model'], d['brand']['name'])
        e = youtubeVideoSearch(key)
        output(d, e)
        break # 最初の１件だけ表示
```

見ての通り、それぞれのAPIの基礎部分はそのまま使い、検索キーワードを共有し、結果成形を少し頑張るだけです。

返り値はJSONなので、そのJSONの中の必要な値を入手するために必要なkeyは何なのかを実行結果やリファレンスから見つけだして取得しています。


結果成形には`string`モジュールの`Template`を利用しています。この方法はflaskなどでWebアプリケーション化するときに有用です。

実際に上記プログラムを実行すると、以下のような結果が返ってきます。

```bash
S660 ホンダ 2998000
詳細： http://www.carsensor.net/usedcar/detail.php?STID=CS210840&BKKN=CU7752078565&vos=ncsrapis00001
動画：土屋圭市Modulo S660で群サイ全開アタック https://www.youtube.com/watch?v=kGECCGH11ZY
```

それぞれのURLにアクセスすれば、カーセンサーとYouTubeそれぞれの結果を見ることができます。

本当はWebブラウザ上でWebアプリケーションとして動かせられるとよいのですが、Webアプリケーション化することはまたもう一つ大きな壁になるので、今回はターミナル上での実行で満足することにします。

## まとめ

この記事では「[カーセンサーWebサービスAPI](https://webservice.recruit.co.jp/carsensor/)」と「[YouTube Data API](https://developers.google.com/youtube/v3/getting-started?hl=ja)」を使って、ターミナル上で動くマッシュアッププログラミングを紹介しました。

どのようなAPIでも特定のURLにアクセスすれば簡単に利用できますが、入出力についてはリファレンスなどを読み、しっかりと把握しなければなりません。

皆様も様々なAPIを試し、マッシュアップをして、新しいサービスを作ってみてはいかがでしょうか。

# 参考

- [リクルートWEBサービス](https://webservice.recruit.co.jp/)
- [YouTube Data API](https://developers.google.com/youtube/v3/?hl=ja)