有馬総一郎のブログ

(彼氏の事情)

2021年05月01日 19:47:07 JST - 5 minute read - Linux

CLIで、かつ、対話式で操作できるカレンダーアプリcalcurseをGoogle Calendarと同期させて使う

以前、 Googleカレンダーのコマンドラインインターフェース gcalcliを使ってみるでGoogle CalendarをCLIで操作できるgcalcliを紹介した。しかし、全角文字が含まれるとズレがあるし、対話式でも操作できるカレンダーアプリが欲しい1

KOrganizerで試すも失敗

KOrganizerを試すが、 kubuntu - How to sync with Google Calendar? - Ask Ubuntuのとおり行うも、

  1. Login to you Google account then allow access to it

Akonadi Resources for Google Services
Akonadi Resources for Google Services

で、このブラウザまたはアプリは安全でない可能性があります。と言われ駄目。

calcurseをインストール

ようやく本題。 calcurseを試してみる。

sudo apt install calcurse
pip3 install --user httplib2

Google Calendarと同期させるためのページも用意されている→ calcurse-caldav

CalDAV設定ファイル作成

まず、CalDAV設定ファイルを作成する。

config.sample « caldav « contrib - calcurse.git - the main calcurse repository

mkdir -p ~/.calcurse/caldav
wget https://git.calcurse.org/calcurse.git/plain/contrib/caldav/config.sample -O ~/.calcurse/caldav/config

以下の項目を変更する

~/.calcurse/caldav/config

[General]
Hostname = apidata.googleusercontent.com
Path = /caldav/v2/example@gmail.com/events/
AuthMethod = oauth2
SyncFilter = cal
DryRun = No
[OAuth2]
ClientID = your_client_id
ClientSecret = your_client_secret
Scope = https://www.googleapis.com/auth/calendar
RedirectURI = http://127.0.0.1

クライアントIDやクライアントシークレットはOAuth 2.0の認証情報に記されたものを記述する。

認証コードを取得する

そしてcalcurse-caldav --init keep-remoteを実行する。

ブラウザが起動して、カレンダー操作したいアカウント、そしてカレンダー権限付与の有無を聞かれるので、答える。すると

calcurse

http://127.0.0.1/?code=4/Ok6mBNW2nppfIwyL-Q1ZPVkEk3zZdZN3mHc642f12512161fec78Cb8b79f1B102c5b811Y&scope=https://www.googleapis.com/auth/calendar

上記URLの画面に飛ばされる(code=以降の英数字はそれぞれ)。自身がWebサーバーでなければ、正常に接続できませんでしたと表示されるが問題ない。code=から&scopeの間にある英数字記号を記録しておく。

ここでは4/Ok6mBNW2nppfIwyL-Q1ZPVkEk3zZdZN3mHc642f12512161fec78Cb8b79f1B102c5b811Yとする。

それをcalcurse-caldav --init keep-remote --authcode '4/Ok6mBNW2nppfIwyL-Q1ZPVkEk3zZdZN3mHc642f12512161fec78Cb8b79f1B102c5b811Y'といった形で--authcode ''のシングルコーテーションの間に埋めて実行する。シングルコーテーションで括るかどうかはシェルに仕様に合わせる。

403 に悩まされる

私の場合、ここで詰まった…

$ calcurse-caldav --init keep-remote --authcode '4/Ok6mBNW2nppfIwyL-Q1ZPVkEk3zZdZN3mHc642f12512161fec78Cb8b79f1B102c5b811Y'
Connecting to apidata.googleusercontent.com...
Removing all local calcurse objects...
error: The server at apidata.googleusercontent.com replied with HTTP status code
error: 403 (Forbidden) while trying to access https://apidata.googleusercontent.
error: com/caldav/v2/example@gmail.com/events/.

エラーになる。

403 Forbidden when submitting authcode for google calendar · Issue #200 · lfos/calcurse · GitHubではauthcodeの指定にscope以降も含めているんじゃないのか云々言ってるが、違う!

諦めかけたが単純なことだった。必要なAPIライブラリがGoogle Calendar APIだけでなく CalDAV API も必要だったのだ。私の場合、以前にgcalcliを試していて、それがGoogle Calendar APIだけで動いていたので、見落していた。

After doing that, you can go to the API Library and search for the CalDAV API and enable it for your project. You will then need to do the same for the Google Calendar API.

calcurse

よく読まない私が悪いが、こういうのは文中に含めるより、箇条書きにして欲しいなぁ…OAuth2 認証情報を使うプロジェクトに、 CalDAV API も追加2する。

今度は成功。

$ calcurse-caldav --init keep-remote --authcode '4/Ok6mBNW2nppfIwyL-Q1ZPVkEk3zZdZN3mHc642f12512161fec78Cb8b79f1B102c5b811Y'
Connecting to apidata.googleusercontent.com...
Removing all local calcurse objects...
Importing new object 63584323024.
Importing new object 63746828647.
・・・中略・・・
Saving synchronization database to /home/arimasou16/.calcurse/caldav/sync.db...
886 items imported, 0 items removed locally.
0 items exported, 0 items removed from the server.

デスクトップアプリとして登録

calcurseと叩けば、起動する。QTerminal3だとズレる。これはneomuttでもあった問題なので、同様にalacritty経由で実行することで対応する。標準ターミナルを入れ変えてもいいのだけど、背景画像を設定できるQTerminalを結構気に入ってるのよね。

calcurse
QTerminal
calcurse
alacritty

とりあえず、適当なアイコンを Flaticon - The largest database of free iconsから取得して48x48ピクセルに縮小する。そして、~/.local/share/icons/hicolor/48x48/apps直下に保存4する。

デスクトップ環境の関連付けするファイルを作成5する。

~/.local/share/applications/calcurse.desktop

[Desktop Entry]
Name=calcurse
GenericName=A calendar and scheduling application for the command line.
Comment=A calendar and scheduling application for the command line.
TryExec=calcurse
Exec=alacritty -t "calcurse" -e calcurse
Terminal=false
Type=Application
Keywords=calendar;
Icon=calcurse
Categories=Network;Calendar;
StartupNotify=false
calcurse

あとは、何となくで使えるはず。週の予定、月、タスクの三つをTabで移動して操作する。メニューが下に表記してあるのでそれほど困らない。週の予定とかタスクではaで作成、dで削除とか行なえる。はCtrl+gで操作取消できる。

スクリプト配備

で、登録した予定とか、初回同期以降に作成した予定とかいつ同期されるんだろう、と思ったら、calcurse-caldavを叩く必要がある。おお、じゃあ、ログイン時に実行とか、crontabで設定しないといけないのか、と思ったら、ちゃんと準備してあるんだね。

~/.calcurse/hooks/pre-load~/.calcurse/hooks/post-saveでアプリ実行前、後に実行するスクリプトを配備できる。しかもちゃんとサンプルがあるので、それを使う。

wget https://git.calcurse.org/calcurse.git/plain/contrib/hooks/pre-load -O ~/.calcurse/hooks/pre-load
wget https://git.calcurse.org/calcurse.git/plain/contrib/hooks/post-save -O ~/.calcurse/hooks/post-save
chmod a+x ~/.calcurse/hooks/pre-load
chmod a+x ~/.calcurse/hooks/post-save

実行権限を与えないと、権限がー、みたいなエラーが出る。 post-save にはバージョン管理している場合に合わせてgit commitをする箇所が含まれているので、そこはコメントアウトして使ってる。

で、バグなのか繰り返し予定として保存してあるものが、何故か追加されていくんだよなぁ。しかも、全ての繰り返し予定だけじゃなくて、特定の予定だけ…

ともあれ、良しとする。


  1. conkyでだけで使っているのもあるが、OAuth2 認証有効期限が切れるが早くて、エラーになっても気付かないというのもある。 ↩︎

  2. ちなみにgcalcliに使っている…OAuth2 認証情報をそのまま使い回している。 ↩︎

  3. QTerminal 0.14.1バージョン ↩︎

  4. 48x48でなくても良いが。 ↩︎

  5. 上のはなんとくなくで作成してるので、間違っているところはご容赦を。 ↩︎