非エンジニアがPythonのrequestsを使って楽天レシピからおすすめレシピを取得★本日の献立を考える①

この記事は [Stylez Advent Calendar 2018] (https://qiita.com/advent-calendar/2018/stylez) の 13日目の記事です。
（13日を選んだ理由は大安だから～。）

スタイルズのAdvent Calendar作ったから、「社員のみなさん参加してねー」とSlackに募集が来ていたので、
一応募集対象に含まれていると思いこみ、果敢に挑戦してみました。

今回は、非エンジニアが
「PythonとAWS Lambdaを使ってAPIで取得したデータをTwitterに自動でつぶやく」ことに挑戦しています。

##本テーマにした理由
いろいろあります。
が、主な理由は４点。

①
スタイルズでは[API Factory](https://cloudshift.stylez.co.jp/api-factory/)というAPIを活用してマイクロサービス化することで、
基幹システムとデジタルトランスフォーメーションを実現する新規システムを連携させ、
企業独自のエコシステムを作っていこうという受託開発のサービスを提供しているので、
以前から**APIで何かするってことをしたかった。**

②
**現在勉強中のPythonでなんか作ってみたかった。**

③
会社のAWS勉強会でLambdaを触る機会があり、
**Lambdaを使って何かできないかな～、サーバレスかっちょいいと思った。**

ちなみにAWS勉強会でもくもくした内容はこちら
[AWS LambdaとCloudWatchでEC2インスタンスをスケジュール起動停止する](https://techblog.forgevision.com/entry/2018/06/25/112507)

何事もなく、この手順通りにしたら起動とシャットダウンが自動化できました！

④
最近、**「今夜の食事何つくろうかな～」と思うことが多かった**ので、
おすすめレシピをゲットできたら良いな～と思った.


##まずはPythonでAPIを使うには？を勉強

APIの解説記事って、なぜかPHPが多いのですが（単純にPHP人口が多いのかもしれないのですが、理由があったら教えてほしいです）

Pythonの記事は以下が自分としては理解しやすかったです。
[Pythonでrequestsを使ってWEB APIのデータを取得する](http://tarao-mendo.blogspot.com/2018/03/python-requests-weather-api.html)

**PythonでAPIからデータを取得するには、
requestsライブラリを使うよう。**

まずは、記事を参考に、
livedoorが提供するWeather Hacksから実際に天気予報データを取得してみました。

```
import pprint
import requests

url = 'http://weather.livedoor.com/forecast/webservice/json/v1?city=130010'
    
api_data = requests.get(url).json()
print(api_data['title'])

for weather in api_data['forecasts']:
      weather_date = weather['date']
      weather_datelabel = weather['dateLabel']
      weather_forecasts = weather['telop']
      weather_temperature = weather['temperature']
      print(weather_date + ':' + weather_forecasts + ':' + str(weather_temperature))
``` 
<img width="682" alt="RakutenRecipeAPI_01.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/223994/0cbb7367-9d1a-b2b1-8df3-0bde333ec899.png">

プロパティの取得情報をサンプルから少し変えてみました。
無事、最高気温と最低気温も取得できました～。


##料理レシピを提供してくれるＡＰＩ

なんとなく、
APIの使いかたと、requestsライブラリの使いかたが分かったので、
やりたかった料理レシピ取得！

個人的には、クラシルとかクックパッドを使うことが多いのだけど、
公式ＡＰＩがすぐに見つからず。。。

楽天レシピが簡単に見つかった。
楽天レシピでチャレンジ。
楽天レシピのAPIを利用するにはユーザー登録が必要でした。

[楽天レシピカテゴリ別ランキングAPI](https://webservice.rakuten.co.jp/api/recipecategoryranking/)

とりあえず、ユーザー登録以外は全く同じ手法でAPI情報を取得してみる。
API取得のためのURLの書き方やプロパティについては、
↑の中に書かれています。

カテゴリーは現在の、人気メニュー♪を指定
https://recipe.rakuten.co.jp/category/30/

**↑カテゴリーIDはきっとこの30だろう！という憶測の元、
「とりあえずやってみよー！」精神で実施。**

ちゃんとカテゴリー情報もAPIで取得したい場合は、
カテゴリーに関するAPIも提供されています。
[楽天レシピカテゴリ一覧API](https://webservice.rakuten.co.jp/api/recipecategorylist/)


```
import pprint
import requests

url = 'https://app.rakuten.co.jp/services/api/Recipe/CategoryRanking/20170426?applicationId=XXXXXXXXXXXXXXXXXXXXXXX&categoryId=30'
api_data = requests.get(url).json()

print(api_data)
```
<img width="682" alt="RakutenRecipeAPI_02.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/223994/b449159a-37fa-aea8-7c23-6fbe5d1336c8.png">

うわ、なんだかよくわらない。

**API取得情報は、全てをprintするものではないらしい。**

ってことで、
出力する内容を限定してみる。

```
import pprint
import requests

url = 'https://app.rakuten.co.jp/services/api/Recipe/CategoryRanking/20170426?applicationId=XXXXXXXXXXXXXXXXXXXXXXX&categoryId=30'
api_data = requests.get(url).json()

for menu in api_data['result']:
      menu_title = menu['recipeTitle']
      menu_url = menu['recipeUrl'] 
      menu_image = menu['recipeMaterial']
      menu_description = menu['recipeDescription']
            
print('【' + menu_title + '】')
print(menu_url)
print(menu_image)
print(menu_description)
```
<img width="685" alt="RakutenRecipeAPI_03.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/223994/82b1e9a5-d9fe-9e6a-85c2-9093f37fbcbd.png">

**あれ？
レシピがひとつしか表示されない。。。。**
でも、カテゴリーID30はあっていたぞ！（小並感）

あ、for ループからprintが外れているからか。。

```
import pprint
import requests

url = 'https://app.rakuten.co.jp/services/api/Recipe/CategoryRanking/20170426?applicationId=XXXXXXXXXXXXXXXXXXXXXXX&categoryId=30'
api_data = requests.get(url).json()

for menu in api_data['result']:
      menu_title = menu['recipeTitle']
      menu_url = menu['recipeUrl'] 
      menu_image = menu['recipeMaterial']
      menu_description = menu['recipeDescription']
            
      print('【' + menu_title + '】')
      print(menu_url)
      print(menu_image)
      print(menu_description)
        
      print()
```
<img width="681" alt="RakutenRecipeAPI_04.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/223994/7f8f207d-71b9-bec4-302a-c4cffdc532dd.png">

**はいっ！
思ったような表示がされました。**
今日はハムカツを作ります♡♡

会社のエンジニアにこのソースコード見せたら、
だらだら長くソースコードを書いているので、
「うーん。。ここはもう少し。。。こうしたほうが良いかと。。。」など言われそうですが。。。ww


##実行環境について

今回のAPI取得は、
自分のノートパソコンにAnacondaを入れて、
Jupyter Notebookで実施してみました～。

ファイルにプログラムや説明の文章、実行結果などをまとめて管理・保存しておけるので、
分析以外の用途でも、
自分の考えの履歴を保存しておけるため、
プログラミングの学習に使える～と思っています。


**前もQiitaの記事に書いたような気がするけど、
Pythonを学習していて出てくるライブラリとか利用するツールって名前がかわいい。。**

Pythonのパッケージ管理システムのコマンドなんて
**pip**！（ピッピと呼んでいたけど、ピップな模様）
かわいい～♡

##今後の構想：Lambdaを使って自動でつぶやきたい
で、ここまでだと本テーマにした理由の③、
**Lambdaを使って何かできないかな～、サーバレスかっちょいいと思った。**
が試せていない！！


今後の構想として、以下を考えています。

- TwitterのAPIを利用する
- Lambdaで、Twitterに自動投稿

~~なのですが、
現状、ここまで実験できていない。。。
（ああ、ださい）~~
**無事、本テーマにした理由①～④を実現する
「PythonとAWS Lambdaを活用して、API取得情報をTwitterに自動投稿」ができました。**
**[Stylez Advent Calendar 2018] (https://qiita.com/advent-calendar/2018/stylez) の19日と24日に続編が公開される予定です。**


きっと世の中に、類似の使いやすくて便利なBotはあるのですが、
（事実、自分の登録しているLINEアカウントでも本日のおすすめレシピ送られてくるし・・）
**自分で作ることに意味がある！**とやる気を失わずに頑張りました。。。


##最後に
学習の参考にさせていただいてる記事の著者さんありがとうございます。

今回の記事で、非エンジニアがやってみた記事の3回目。
思っていた以上に皆さんがいいねをしてくださったので嬉しくなって、
調子にのって3回目まで書いてしまいました。

記事についての修正やもっとこうしたら良いよ、などがありましたら、
ぜひコメントをいただけますと嬉しいです。