コマンドラインで Mastodon に投稿する
今年の GW は(色々と大人の事情で)遠くに遊びに行くこともなく,ときどき自転車を乗り回す以外はおうちでコードを書くか,その辺に寝転がってラノベか Web 小説を読み耽るという,自堕落な生活を送っていた。
で,まぁ,その成果として以下の CLI ツールをリリースした。
今のところ Mastodon と Bluesky への投稿機能のみ実装している。 最終的には自コンテンツ(主にブログ記事と Flickr 写真)の更新情報の投稿を自動化できればと思っているが,先は長い。
このうち今回は Mastodon への投稿機能について,覚え書きを兼ねて,記しておく。
今どきの流行りは Bluesky のほうぢゃねーのかとお思いでしょうが,利用している公式の Go 用パッケージの作りが微妙で,ちょっとしたことでエラーを吐くためイマイチな出来。 みんな,あんな雑なエラーハンドリングでよく使えてるよなぁ。 とりあえず 400 を返せばいいみたいなのはどうにかしてほしい。 大きな画像ファイルをアップロードしてエラーを返さないのはもっと困るけど。
話がそれた。 では本題へ。
アプリケーションの登録
Mastodon のハンドリングには以下のパッケージを使わせてもらっている。 ありがたや 🙇
だがしかし,最初の「認証」部分でいきなり躓く。 あちこちの解説ページを覗いてみるに,どうやら Mastodon の認証は2段階あるらしい。
- サーバに対してアプリケーション登録を行う
- ユーザ認証を行い,アカウントに対してアプリケーションを認証する
1 を行うとクライアントIDとそのシークレットがもらえる。 1 でもらった情報を使って 2 を行うとアクセストークンがもらえる。 さらに 2 の認証にはパスワード認証と OAuth 認証の2つが用意されていて,後者についてはブラウザ操作が必要(?) アクセストークンは永続的に有効らしい。 1 と 2 で取得した情報を使って Mastodon サーバに対して各種操作を行える。 …という感じ。
ここまで辿り着くのにかなり試行錯誤してしまった。
拙作 toolbox では mastodon register
コマンドで 1, 2 の処理をまとめて行う。
$ toolbox mastodon register -h
Register Mastodon application.
Usage:
toolbox mastodon register [flags]
Aliases:
register, reg
Flags:
-h, --help help for register
Global Flags:
--bluesky-config string Config file for Bluesky (default "/home/username/.config/toolbox/bluesky.json")
--cache-dir string Directory for cache files (default "/home/username/.cache/toolbox")
--config string Config file (default "/home/username/.config/toolbox/config.yaml")
--debug for debug
--log-dir string Directory for log files (default "/home/username/.cache/toolbox")
--log-level string Log level [nop|error|warn|info|debug|trace] (default "nop")
--mastodon-config string Config file for Mastodon (default "/home/username/.config/toolbox/mastodon.json")
取得したアクセストークンは --mastodon-config
オプションで指定したファイルに JSON 形式で保存される。
具体的には以下のように,サーバ名,ユーザID,パスワードを尋ねるプロンプトが表示されるので入力していけば OK。
$ toolbox mastodon register
Server (e.g. mastodon.social) > fedibird.com
User (email address) > jphn.do@exsample.com
Password > your_password
server: https://fedibird.com
application name: github.com/goark/toolbox
website: https://github.com/goark/toolbox
scopes: read write follow
output: /home/username/.config/toolbox/mastodon.json
成功すれば 設定>アカウント>認証済みアプリ に認証されたアプリケーションが表示される(表示の仕方はサーバによって違うかも)。
動作確認のために自身の profile を表示してみる。
$ toolbox mastodon profile
Username: spiegel
User ID (full): @spiegel@fedibird.com
URL: https://fedibird.com/@spiegel
Display name: Spiegel@がんばらない
Created at: 2022-11-25 00:00:00 +0000 UTC
Posts: 2289
Follows: 46
Followers: 98
<p>mstdn.jp から移住。職業プログラマ。<a href="https://fedibird.com/tags/golang" class="mention hashtag" rel="tag">#<span>golang</span></a> と <a href="https://fedibird.com/tags/flickr" class="mention hashtag" rel="tag">#<span>flickr</span></a> で遊んでいる人。暖かくなったので自転車で「お散歩カメラ」再開。</p><p>情報収集がメインだが最近は胡乱な発言もチラホラあるので,そこは許して(フォローの付け外しはご自由に)。フォローは特に意味なく頻繁に入れ換えますのであしからず。</p>
よーし,うむうむ,よーし。
Mastodon に投稿する
以上で対象のサーバに toolbox でアクセスできるようになったので,さっそく何か投稿してみる。
Mastodon への投稿は mastodon post
でできる。
$ toolbox mastodon post -h
Post message to Mastodon.
Usage:
toolbox mastodon post [flags]
Aliases:
post, pst, p, toot, tt, t
Flags:
--edit Edit message
-h, --help help for post
-i, --image-file strings Image file
-m, --message string Message
--pipe Input from standard-input
-s, --spoiler-text string Spoiler text
-v, --visibility string Visibility [public|unlisted|private|direct] (default "public")
Global Flags:
--bluesky-config string Config file for Bluesky (default "/home/username/.config/toolbox/bluesky.json")
--cache-dir string Directory for cache files (default "/home/username/.cache/toolbox")
--config string Config file (default "/home/username/.config/toolbox/config.yaml")
--debug for debug
--log-dir string Directory for log files (default "/home/username/.cache/toolbox")
--log-level string Log level [nop|error|warn|info|debug|trace] (default "nop")
--mastodon-config string Config file for Mastodon (default "/home/username/.config/toolbox/mastodon.json")
-m
はコマンドライン上で1行メッセージを投稿するのに使うオプション--pipe
は標準入力からの入力を投稿するオプション--edit
は CUI で複数行編集ができるオプション-m
,--pipe
,--edit
は排他オプションで同時に指定できない-i
は画像ファイルをアップローするのに使うオプション。複数指定可能-v
は表示範囲を指定するオプション
たとえばこんな感じで投稿する。
$ toolbox mastodon post --edit -i lake-shinjiko.jpg -v direct
Input 'Ctrl+J' or 'Ctrl+Enter' to submit message
Input 'Ctrl+D' with no chars to stop
1>はろー,ふぇでぃばーす!
2>https://flic.kr/p/2nSUmaa
3>
https://fedibird.com/@spiegel/110364957384850439
するとこんな感じに表示される。
よしよし。 ちなみに複数行編集には以下のパッケージを利用している。
マジ便利。 ありがたや 🙇
Mastodon は表示範囲を指定できるのがいいよね。 とりあえず試し撃ちなら DM で投げればいい。 Bluesky は(多分まだ)表示範囲を指定できないのでテスト用のゴミ投稿も全部 TL に表示されてしまう。 しょうがないから招待コード使ってデバッグ用のアカウントをひとつ確保する羽目になった。
さて,これで出力の基本機能はできたので,今後は入力側の設計と実装だな。 先は長い。
ブックマーク
参考図書
- プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)
- Alan A.A. Donovan (著), Brian W. Kernighan (著), 柴田 芳樹 (翻訳)
- 丸善出版 2016-06-20
- 単行本(ソフトカバー)
- 4621300253 (ASIN), 9784621300251 (EAN), 4621300253 (ISBN), 9784621300251 (ISBN)
- 評価
著者のひとりは(あの「バイブル」とも呼ばれる)通称 “K&R” の K のほうである。この本は Go 言語の教科書と言ってもいいだろう。
- 初めてのGo言語 ―他言語プログラマーのためのイディオマティックGo実践ガイド
- Jon Bodner (著), 武舎 広幸 (翻訳)
- オライリージャパン 2022-09-26
- 単行本(ソフトカバー)
- 4814400047 (ASIN), 9784814400041 (EAN), 4814400047 (ISBN)
- 評価
2021年に出た “Learning Go” の邦訳版。私は版元で PDF 版を購入。 Go 特有の語法(idiom)を切り口として Go の機能やパッケージを解説している。 Go 1.19 対応。