Herokuの定期実行でYouTube APIキーを温存する。

#introduction

YouTubeのAPIキーは、90日間利用していないと失効し、再利用するには申請（英語）が必要となります。

申請すれば復活するとしても、申請の手間や申請が通るまでのリードタイムを考慮すると、失効させないに越したことはありません。

そこで、Herokuの無料サーバーを使って毎日最低1回定期的にYoutube Data APIにアクセスすることで、APIキーの失効を防ぐ手順を書いてみました。


※この記事を書くにあたっては、Windows10にインストールしたheloku-cli及びpyhton 3.7.4を使っています。
※後述のHeroku Scheduleアドオンのインストールにはクレジットカードの登録が必要です。

#heroku-cliのインストール
下記にてインストーラをダウンロードし、heroku-cliをインストールする。
https://devcenter.heroku.com/articles/heroku-cli#download-and-install

Herokuのデプロイにgitを利用するため、gitが環境にない場合は同時にインストールすること。

#ローカルに開発用のディレクトリを作成
適当な場所に開発用のディレクトリを作成する。

```test.cmd
$ mkdir heroku_test
$ cd heroku_test
```

以下の3つのファイルを先ほど作った開発用のディレクトリに保存する。
`runtime.txt`　　　　：herokuにpython環境を作らせるために必要。
`requirements.txt`　：依存関係のある外部モジュール(この例ではrequestsのみ）
`preserve.py`　　　　：apiを叩くためのpythonアプリ

各ファイルの内容(例)は以下の通り。

```runtime.txt
python-3.7.4
```

```requirements.txt
requests==2.22.0
```

実行用のpythonファイル（preserve.py）には、環境変数名を設定しておく。
（下のコードではAPI_KEY1、API_KEY2としている。）
ソースにAPIキーそのものを書くのではない点に注意。

```python:preserve.py
import os
import requests

'''任意のyoutube動画IDを指定。
存在しないidを指定してapiを叩くとエラーjsonが返ってくるが、
apiの実行自体は有効なのでapiキー温存目的としては問題ない。'''
video_id="video_id"
keys = [
    """!!注意!!
　　　下記の「API_KEY1」の部分は環境変数名を記入する。
　　　api_keyそのものではない。
    """
    os.environ['API_KEY1'], 
    os.environ['API_KEY2']
]
for key in keys:
    #part=playerが一番quotaの消費が少ない(1.6667）
    url = f"https://www.googleapis.com/youtube/v3/videos?part=player&id={video_id}&key={key}"
    resp = requests.get(url)
    print(resp.text)
```
#gitリポジトリ設定・デプロイ
上の3つのファイルを保存した開発用ディレクトリに入り、下記の3つのgitコマンドを入力する。

```[gitリポジトリ設定.]
$ git init
$ git add .
$ git commit -m "first commit."
```

heroku loginでHerokuにログインし、heroku createでアプリを作成する。アプリ名は省略してもよい(自動的に付けられる）

```[Herokuにログイン.]
$heroku login
 user:
 pass:

$ heroku create myAppName
```

作成したアプリをHerokuにデプロイする。
>git push heroku master

```
$ git push heroku master

Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
...
..
.
To https://git.heroku.com/myAppName
 * [new branch]      master -> master
```
##環境変数の設定
Herokuの環境変数にAPIキーを保存する。

><font color = darkblue>heroku config:set</font> <font color = blue>(環境変数名)</font>="youtube apiキー" --app "Herokuアプリ名"

```[Herokuの環境変数を設定].
$ heroku config:set API_KEY1="Alzos_......" --app "myAppName"
```


なお、一度設定した環境変数を削除するには
　　<font color = darkblue>heroku config:unset </font> <font color = blue>(環境変数名)</font>
とする。

環境設定が完了したら、一度テスト実行してみましょう。
プログラムが間違っておらず環境変数がきちんと設定されていれば、youtubeから返ってきたjsonが表示されるはずです。

>heroku run python (本体アプリ名.py)

```[テスト実行.].
$ heroku run python preserve.py

Running python preserve.py on ⬢ myAppName, run.1002 (Free)
{
 "items": [
  {
   "id": "video_id",
   "player": {
    "embedHtml": "<iframe width=\"480\" height=\"270\" src=\"//www.youtube.com/embed/video_id\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen></iframe>"
   }
  }
 ]
}
```

#Heroku Schedulerを設定し定期的に実行させる。

Heroku Schedulerアドオンを設定してpreserve.pyを定期的に実行させる。
(Heroku Schedulerの利用にはクレジットカードの登録が必要)

heroku addons:add scheduler:standard
を実行する。

```test.cmd
$ heroku addons:add scheduler:standard 
```
ブラウザでhttps://dashboard.heroku.com/apps にアクセス。
作成したアプリ名をクリックしてダッシュボードを開く。
![tempsnip0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334771/0519c1bb-ecc6-6aee-0cb2-473a1aeb95d4.png)

configure Add-onsをクリック
![tempsnip2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334771/ed182111-fbfc-84ba-974b-ec056b61932e.png)

 Heroku Schedulerをクリック
![tempsnip3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334771/2b856d37-88c2-b11b-d7f9-6784c404901e.png)

Create job をクリック
![tempsnip4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334771/b02d9c83-fd29-2d8a-06a0-969947b0df26.png)


Scheduleで実行間隔として"Every day at..."を選択し、Run commandに「python (実行ファイル.py)」を指定する。
（間隔の上限は1日であり、1週間単位等は指定できない）

Save Jobで設定完了。
![tempsnip5[1].png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334771/f483f227-7380-f774-444f-b1d216c653a7.png)



##参考にした記事
Herokuでお天気Pythonの定期実行
https://qiita.com/seigo-pon/items/ca9951dac0b7fa29cce0

Herokuで定期的にrakeタスクを実行したい場合は、Heroku Schedulerを使おう
https://qiita.com/isotai/items/44735d9e7d9ceaef9c48