iOSアプリのショートカットを使ってMastodonに画像やリンクをトゥートする

こんにちは！スズキと申します！
[前回](https://qiita.com/suzuki_cs/items/2fd64598243f0de821e0)に引き続き、iOSアプリのショートカットを色々と試しています。
私は普段**splatoonのMastodonインスタンス、[イカトドン](https://ika.queloud.net/web/getting-started)**でお世話になっています（いつもありがとうございます）。
MastodonってTwitterと掲示板を足して2で割ったような感じでメッチャ楽しいんですが、iOSは継続して開発されているクライアントがなかったりするのでもっと便利に使いたい。
（恐らくiOSのSafariがWebPushに対応したら概ね解決するんですが）

なので、我々iOSユーザーにはショートカットがあるので、必要なものはDIYをします。今回は、**「迅速な飯テロ」「NintendoSwitch公式アプリのShare即共有」「Twitterや各種Webのリンク共有」**を実現することが目標です。
イカ、よろしく〜〜〜

## TL;DR
- Mastodonにショートカットからトゥートする為のMastodon側のユーザ設定
- ショートカットの共有と使い方
- RestAPIとショートカット動作の解説
- 課題

### 動作環境
iOS 12.2
ショートカット 2.2
Mastodon 2.6.1（Rest APIを使うので多分どこでもいけます）

## トゥートするまでのスキームと本体
以下の流れでショートカットを動作させます。

1. iOSの共有ボタンからショートカットを起動（引数を添えてショートカットを起動する）
2. 引数の自動処理
3. 本文や投稿範囲を入力
4. トゥート！！

まずはiOSの[ショートカットアプリ](https://itunes.apple.com/jp/app/ショートカット/id915249334?=mt8)をダウンロードし、こちらから私の作成した[ショートカット](https://www.icloud.com/shortcuts/fe60297965b14cd9a6015f8322117e91)を取得してください。
（バグ残ってたらすいません）

## Mastodonのユーザー設定
まずはMastodonのユーザ設定です。
今から設定する**ショートカットはMastodonのクライアントアプリ扱い**となります。
技術的な説明は割愛しますが、ショートカットからMastodonにトゥートする際に、暗号化されたユーザーとパスワード情報（トークン）を添えて差し上げる、という形です。
なので、まずはトークンを入手しましょう。

`ユーザ設定->開発->アプリ`を開きます。
<img width="1024" alt="スクリーンショット 2019-04-22 9.15.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165009/5dd12653-e2ff-13c7-bd3e-939db2ba68a4.png">
すると、上記のような画面が現れます。
これは今私がショートカット用に使っているアプリが設定されているので、触ったことがない方は何も記載がないと思います。

次に、`新規アプリ`をクリックしましょう。
<img width="743" alt="スクリーンショット 2019-04-22 9.19.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165009/172a3079-05b7-78c6-cfe4-03e2d414c74d.png">
`アプリの名前`は好きなもので結構です。
因みにトゥートの詳細を見ると表示されるのでご注意を！
<img width="462" alt="スクリーンショット 2019-04-22 9.22.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165009/2b237c89-1a20-f7ec-5923-8704cb3b9eb2.png">

次に`アクセス権`ですが、これは`read``write``follow`にチェックを付けておけば大丈夫です。
が、上記設定はつまり全部許可、になるので扱いには充分気をつけて下さい。
後述のトークンが漏れたら全権限が渡ります。
出来たら、`送信`をタップ。
元の一覧画面に戻るとアプリが作成されましたので開きます。

<img width="738" alt="スクリーンショット_2019-04-22_9_28_18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165009/821edccd-30ec-c72f-5af8-c1e61ce28035.png">
このアクセストークンが超重要です。あとで使います。
これでクライアント側の準備は完了です。
お疲れ様でした。

## ショートカットの設定
画像は割愛しますが、URLに記載されているアドレスをお使いのインスタンスのアドレスにしてください。
元のショートカットは某所になっています。
（汎用性考えるならここも変数にすればよかったですね…）
次にショートカットにトークンを登録します。
`テキスト`に`Bearer(半角スペース)[tokenの文字列]`を1行で記載して下さい。

完了後は、以下のスクリーンショットの様になります。
<img width="375" alt="IMG_2233.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165009/19bbef65-6129-800b-ca9d-fcaa97c53410.jpeg">

このショートカットはイメージ、SafariのWebページ、URLを受け入れる設定になっています。
<img width="375" alt="IMG_2234.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165009/11d45106-2412-81b8-e756-6bd87cd9d76c.png">

あとは、共有メニューのアクティビティを有効にするだけです。
<img width="375" alt="IMG_2243.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165009/5e2b67ca-7d9f-31ae-e1c3-e28c3494a82b.jpeg">

## 実際に動かしてみる

撮った写真や、
<img width="375" alt="IMG_2238.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165009/20a256c3-cedd-24d6-597a-992e8b8d105d.png">

スクリーンショットの左下からすぐ共有メニューに飛べるので、
<img width="375" alt="IMG_2240.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165009/2b2feaf5-4015-d398-e377-a2fcd026d965.png">

勿論SwitchオンラインのShareボタンから出る共有でも飛ばせますし、
<img width="375" alt="IMG_2235.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165009/9536783e-5ff7-fafc-b313-1afbbca0df4c.png">

みんな大好きはてなブックマークの共有からも、
<img width="375" alt="IMG_2244.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165009/ac3f28b7-4f4a-be97-110b-3eed0108db1c.png">

`Mastodonに共有`を選択すると、公開範囲の設定やトゥート本文を入力して、トゥートできます！
麺が伸びる前にラーメンの写真をアップロードして、次のマッチングが完了するまでにリザルトをシェア出来ます！
<img width="375" alt="IMG_2236.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165009/a7641afd-fd85-fb52-765f-9e94f75e0fbc.jpeg">

## 実際の動作
ショートカットを上から追っていけば、大体分かると思います。
ポイントとしては、`次の場合`が所謂ifです。
辞書はJSONを取り扱う事が出来ます。
また、JSONはリストとしても扱われるので、取得することが出来ます。
実際のサーバとのやり取りはREST APIを使用しているので、興味のある方はググるとなんとなく分かると思います。
（私も全然わかっていなかったんですが、公式ドキュメントと先人のショートカットを見ながらなんとかなりました。）

## 課題
**画像4枚の投稿が出来ません。**
これはMastodonのイメージ投稿システムとして、画像をアップロードするとJSON形式でidが帰ってきて、そのidをPOSTすることで画像（が添付されているように見える）トゥートが出来るのですが、戻ってきたidを上手いこと処理出来ないです。
変数に入れればなんとかなりそうなのですが、フォーマットとの兼ね合いがありこれ以上ショートカットも長くなると挙動が怪しく…。
良い方法があれば教えて下さい！

## 参考資料
[iOS12のショートカットアプリを使ってマストドンAPIを叩いて呟いてみた](https://qiita.com/sa2taka/items/229b47957a4e47e20848)
マジに無限の可能性ですねこれは…。ショートカットを触るきっかけになりました、ありがとうございます。
気になった人の用語集は完全にドンピシャで、私のような初学者にはショートカットと含めて様々な足がかりになると思います。

[MastodonのAPI公式ドキュメント](https://github.com/tootsuite/documentation/blob/master/Using-the-API/API.md)
一生にらめっこしてました。

[イカトドン](https://ika.queloud.net/about)
動かねーーーーーーとか言いながらAPI叩きまくってすいませんでした…。これからもよろしくおねがいします。

以上です、ご覧いただきありがとうございました。