Uptime RobotのAPIが割と便利だった話【備忘録】

## はじめに
LINEのMessaging APIを使ってポモドーロ・テクニック タイマーbotを作ったときに **Uptime Robot API** が便利だったので備忘録も兼ねて書いていきたいと思います。

## 使ったもの
<dl>
<dt>・Python</dt>
<dd></dd>


<dt>・Flask</dt>
<dd>フレームワークはFlaskを使用しました。</dd>
<dt>・Render.com</dt>
<dd>Render.comにデプロイしました。</dd>

</dl>

https://render.com/

<dl>
<dt>・Messaging API</dt>
<dd>今回はpushメッセージと応答メッセージを使用しています。</dd>


<dt>・Uptime Robot API</dt>
<dd>今回最も役に立ったAPIです。render.comでは15分間リクエストがないとスリープしてしまうことへの対策として使用しました。</dd>
</dl>

https://uptimerobot.com/api/

## botのイメージ
<img width="300" alt="img.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3163462/0722f5f7-de6c-8440-80fa-6e7ec7b652f8.jpeg">



## Uptime Robot API
### コード
```diff_python
import requests

class uptime_robot_monitor():
    ### 初期化 ###
    def __init__(self, key):
        self.url = "https://api.uptimerobot.com/v2/newMonitor"
        self.key = key
          
        self.payload = "api_key=" + self.key + "&format=json&type=1&url='''URL'''&friendly_name=My%20Monitor&interval=300&timeout=10"
        self.headers = {
            'cache-control': "no-cache",
            'content-type': "application/x-www-form-urlencoded"
            }
        
    def new_monitor(self):
        response = requests.request("POST", self.url, data = self.payload, headers = self.headers)

        print(response.text)
        
        self.monitor_id = response.json()["monitor"]["id"]
        
    def delete_monitor(self):
        self.delete_url = "https://api.uptimerobot.com/v2/deleteMonitor"
          
        self.delete_payload = "api_key=" + self.key + "&format=json&id="+str(self.monitor_id)
        self.delete_headers = {
            'cache-control': "no-cache",
            'content-type': "application/x-www-form-urlencoded"
            }

        delete_response = requests.request("POST", self.delete_url, data = self.delete_payload, headers = self.delete_headers)

        print(delete_response.text)
```
self.keyはアカウント作成後に発行できるAPIキーを入れます。
self.payloadについては以下の表のようになります。

|パラメータ  |補足  |
|---|---|
|type  |1：HTTP(S)   |
|friendly_name  |モニター名  |
|interval |監視間隔（秒） |
|timeout |監視時間（秒） |

self.monitor_idはモニターのIDで**削除**する際に必要になります。

### Uptime Robot APIの利用に至った経緯
 " **ポモドーロテクニック** "では一般的に25分タスクをこなし3~5分の休憩をはさみ再び25分タスクをこなす……ということを反復するようです。今回のケースではユーザーからの "start" メッセージ以降webhookへのリクエストが無い状態が続くのですが、これが少々厄介な点で、render.com の freeプランでは**15分間リクエスト無しでスリープ状態**になってしまうため、そのままでは15分後に停止してしまいます。
　タイマースタート後も何かしらのリクエストを送り続けられれば…という中で調べていると **Uptime Robot**というのを知りました。これを使えば定期的（5分おきなど）にデプロイ先のwebhookURLに対してモニターを立て監視し続けることができる＝リクエストを送り続けられる点が良いなと感じました。ところが、アカ作成後にモニターを立てると監視は連続して行われるようで、これがまたちょっとした懸念点でした。というのも、render.com の freeプランでは任意の１つのアカウントで運用している全てのwebサービスで月750時間までという制限があります。一月あたり31日として24時間なので24×31=744になるため、残り6時間となります。他のwebサービスをそこまで運用しているわけではないので、モニターを連続して立てておいても良いのですが、なんとなくタイマーを使わない時間がもったいない気がして、**タイマーをスタートした段階でモニターを立て、タイマーが終了した段階でモニターを削除する** ことで時間の面は改善できるかと思いAPIを利用することにしました。というのが今回の経緯です笑

## おわりに
今回は Uptime Robot APIについて備忘録を兼ねて書いてきました。

## 参考
- [Render.com無料プランのスリープ対策](https://qiita.com/ppputtyo/items/2ab44303dcfabeb7b23e)

https://qiita.com/ppputtyo/items/2ab44303dcfabeb7b23e

- [UptimeRobot REST API.](https://uptimerobot.com/api/)

https://uptimerobot.com/api/