TonamiLog

ゆるキャン△とスノーボードとオタク

夏休み自由工作:通販したら着弾日がTimeTreeに登録されるやつ①

ハロートナミです。サマーですか?

 

私はサマーで、サマーらしくバケーションに入りました。

今年の夏休みは9日間ですが、新型コロナウイルスを考慮し

帰省もせず遊びにも行かず、殆ど家で過ごそうと思っています。

そこで、せっかく時間があるので自由工作をやろうと思います。

 

前置き

最近、引越しの関連で大量の荷物を楽天Amazonから受け取っていたんですが、妻から

「何がいつ来るかを管理したい。カレンダーに入ってくれれば楽。」

という要望が出ていました。

 

我が家ではカレンダーアプリにTimeTreeを採用しています。

timetreeapp.com

アカウント管理不要で共有カレンダーが作成出来て導入が簡単なのです。

多分まる4年ぐらい使ってると思います。機能、UI、通知など、特に不満無く便利です。

 

TimeTreeにはDeveloper Platformというものがあり、APIを通じて予定の登録が出来ます。

developers.timetreeapp.com

実はこれ前には無くて、2018年の9月頃にAPI公開する予定ありますか?と問い合わせたりしてました。

その時のTimeTreeサポート様からの解答の切り抜きがこちら(問題があれば即削除します。)

---

f:id:Thiroyuki:20200807122550p:plain

---

とのことだったのですが、いつの間にかバッチリ実装されていました。凄い

こんな経緯があったため、TimeTreeのDeveloper Platform、一度使ってみたかったのです。

 

という訳で登場人物が揃いました。

今年の夏休みの自由工作は、

Amazonから届く確認メールをあれこれして、TimeTreeに着弾時間を登録するやつ

を作ろうと思います。(楽天は余裕あったらやります)

 

だいたい

難しい事は分かりませんが、大体こんな感じで出来ないかと考えています。

f:id:Thiroyuki:20200809130548p:plain

何も考えていない事がよく分かりますね。それではやっていきましょう

 

 TimeTreeに予定投げるところ

AWS Lambdaは使った事あるし、メールについてはネットにノウハウがある……だろう。

という事で未知レベルが一番高そうなTimeTreeのAPI連携からやります。

developers.timetreeapp.comとりあえずドキュメント通りに準備をしていきます。

えー、まずTimeTreeのアカウントを作ります。

カレンダー共有まではアカウント不要でしたが、APIを使うためには必須です。

 

アカウントを作ったら認証部分をなんやかんやしてAPIを使うようです。TwitterAPIとかと同じ感じ。

アプリを登録してOAuth認証するやつと、アカウントに紐づくアクセストークンを発行してやるやつがあります。

今回はそんなにどっしりしたアプリを作る訳ではないのでアクセストークンでいきましょう。

 

とりあえずAPIが動いてるのを確認します。Python3.7です。

import requests
import os

class TimeTree():
    p_token = os.environ['TIMETREE_PERSONAL_TOKEN']
    url = 'https://timetreeapis.com'
    headers = {'Authorization': f'Bearer {p_token}',
                'Accept': 'application/vnd.timetree.v1+json',
                'Content-Type': 'application/json'}

    def get_user(self):
        r = requests.get(f'{self.url}/user', headers=self.headers)
        return r.json()

tt = TimeTree()
user = tt.get_user()
print(user)
# {'data': 
#     {'attributes': 
#         {'description': '',
#          'image_url': 'https://attachments.timetreeapp.com/user/hogehogeimg.jpg',
#          'name': 'hogename'},
#      'id': 'hogeid',
#      'type': 'user'}}

ちゃんと動いてればこんな感じになるはず。

動作確認が出来たので、今回の肝である予定の追加APIを見てみます。

TimeTree API ドキュメント - TimeTree Developer Platform

パラメータが多くてびっくりしますが、考える必要がある事は

  • カレンダーid
  • 予定タイトル
  • 予定なのかキープなのか(後述)
  • 予定が終日なのか時間指定なのか
  • 開始 / 終了日付
  • 予定のラベルID(後述)
  • 予定のラベルタイプを指定(書くだけ)

についてです。

カレンダーidはカレンダーに付いているユニークっぽいidの事です。

ブラウザ上から自分のカレンダーにアクセスすればURLから確認出来ます。

カレンダー一覧取得APIなどを使っても確認できますが

1つのカレンダーについてしか考えないならブラウザで開くのが一番簡単だと思います。

 

予定タイトルは文字通りですね。ここに指定した内容がアプリ上のラベルに表示されます。

 

キープは何の事か分からなかったのですが、どうやらカレンダーにメモを登録する機能のようです。

メモには後から日付を追加する事で予定に変換する事が出来るそうです。今回は予定のみ考えます。

 

予定が終日なのか時間指定なのかは、まあ文字通りです。

時間指定を行う場合は開始 / 終了時間が必須パラメータとなります。

 

予定のラベルIDについて、ざっくり言うとTimeTreeアプリ上で予定に付ける色の事を言ってると思います。

カレンダー毎に色の設定が出来るため、カレンダーidとラベルidのペアを渡して色指定にしているようです。

 

最終的にこんな感じで投稿部分を実装しました。

import requests
import json
import os
from datetime import datetime

class TimeTree():
    p_token = os.environ['TIMETREE_PERSONAL_TOKEN']
    url = 'https://timetreeapis.com'
    headers = {'Authorization': f'Bearer {p_token}',
                'Accept': 'application/vnd.timetree.v1+json',
                'Content-Type': 'application/json'}
    calendar_id = os.environ['TIMETREE_CALENDAR_ID']

    def add_schedule(self, title, description, st, et):
        timetree_dict = {
            'data': {
                'attributes': {
                    'title': title,
                    'category': 'schedule',
                    'all_day': False,
                    'start_at': st.isoformat(),
                    'end_at': et.isoformat(),
                    'description': description,
                },
                'relationships': {
                    'label': {
                        'data': {
                            'id': f'{self.calendar_id},1',
                            'type': 'label'
                        }
                    }
                }
            }
        }
        json_data = json.dumps(timetree_dict)
        response = requests.post(self.url + f'/calendars/{self.calendar_id}/events',
                    headers=self.headers, data=json_data)

stとetはdatetime型を期待しています。

動かしてみてTimeTreeアプリ上から予定が確認出来ればOKです。

 

とりあえずこんな感じでTimeTreeに予定を投稿するところまで出来ました。

残る要素は

  • Amazonからの発送通知メールをいい感じに取ってくる実装
  • Lambdaに乗せる
  • 動かしてみる

という感じですかね。長くなってしまったので続きは別のエントリで書きます。

ではでは~