お久しぶりどころか、あけましておめでとうですが、すっかり春めいてといいますかやや暑い日もあったりする梅雨前のひととき、皆様いかがお過ごしでしょうか。
えーとりあえずmastodonクライアントを昨年から作ってて本当は年末には見せびらかす予定だったんですけど、色々バタバタしまして気がつけばゴールデンウィークですよ。まあいいんですけど。
と言うわけで、機能足らなすぎで作りかけ感満載ですが、
saori-0.1
沙織さんです。見ての通りマルチアカウント対応のMDIクライアント。名前の由来は特にありませんが、俺は流川ガールズが大好きです。
現状できることと言うのは本当に少なく、インスタンスに接続して一部タイムラインや通知を読み出すくらいです。Tootもまだ出来ませんし画面には機能しないボタンが並んでいたりしますが、まあmastodonにおけるごくごく基本的な「認証してアクセストークンをゲットしてJSONデータを得る」は実装されております。
コード化結構簡単ですので是非皆さんも手作りmastodonクライアント挑戦して欲しい感じですかねえ。まあ色々勉強になったところもあるので、何回かに分けてこのへん日記にまとめようかな。
以下、認証まわりのコード的な話。
twitterクライアントもそうなんだけど、ぶっちゃけアクセストークンを取得してAPIに正しくアクセスできれば後はデータをいじるだけ、mastodonはJSONでデータくれるのでQtのQJsonDocument他をごっそり使うことで手軽に得たデータを利用できます。素晴らしいですねえ。
ポイントはどうやって認証するのって話ですが、saoriでは
- Saoridonクラスでクライアント登録。
- SaoriAddAccountDialogで認証、アクセストークン取得。
- SaoriAccountに情報を保存、アクセス時もここからAPIにアクセス。
こんな感じの流れになってます。
相変わらずコードにコメントを書かない糞コード書きなのでわかりにくいですが、Saoridon::clientRedistration()でクライアントをインスタンスに登録します。
若干ずるのようなイメージもありますがQEventLoopを回してQNetworkAccessManagerからのQNetworkReplyをその場でもらうと言うテク、これ便利で結構使ってしまいますがさておき。
登録が済んだらclient_secretとclient_idがJSONで帰ってきますので、今度はSaoriAddAccountDialogでアクセストークンを取ります。実際は上のクライアント登録もこのダイアログでやるんだけどね。
Saoridon::getAuthorizedUrl()でURLを作りWebブラウザで開いて認証、コードをコピーしてそれをSaoridon::getAccessToken()で渡すとアクセストークンが返ってくる、と言う手順ですねえ(grant_typeはauthorization_codeです)。SaoriAddAccountDialog自体はボタンを押せなくしたり複雑に組んでありますが、実際に必要なコードはSaoridonの方にほぼほぼまとめられています。
で、client_idとclient_secretからaccess_tokenとれたらそれをSaoriAccountに保存し、実際のAPIアクセスはこのクラスからアクセス、と言う感じです。
アクセストークンはヘッダにぶち込むだけでいいのでSaoriAccount::createHeader()を見てもらえば簡単かと。あとは、mastodonのAPIとにらめっこどぞー、って感じですね。
ここまでくればQNetworkReplyでJSON取れますからあとは煮るなり焼くなり。QJsonObjectで取得してHTMLに整形してQTextBrowserに流しこむ、と言うことをsaoriではやってますが、この辺はまた今度。