はじめに
新卒2年目エンジニアのkasuke18です。
つい先日iOS12がリリースされました。リリースされた内容は数多くありますが、その中でも気になったのが「ショートカット」というアプリです。このアプリをうまく使えばiPhone単体でAPIの実行が可能になります。実際に試してみましたので、紹介します。
もくじ
「ショートカット」アプリについて
リリースノートShortcuts 2.0 release notesを見ると、「ショートカット」アプリはiOS12の以前に「Workflow」アプリとして公開されていたようです。
「ショートカット」アプリでは、ビジュアルプログラミング言語
のようにアクション
と呼ばれる構成要素を組み合わせて1つのショートカットを作成します。アクションにはiPhone端末の設定変更
や他アプリの操作・データの受け渡し
といったものが用意されているほか、変数・条件分岐・繰り返し(for, foreach)といった制御を行うものも用意されています。
作成したショートカット
内容
クリップボードに保存されている画像のリンクに対してOCRのAPIを実行し、画像内の文字をテキストに変換して出力する、ということをやってみました。今回使用したOCRのAPIはFree OCR API | OCR.spaceです。POSTパラメータやレスポンスのJSON構成はリンク先でご確認ください。
作成例
まずはPOSTリクエストを送信する部分です。
今回POSTパラメータとして必要な情報はAPIキー
・画像内の文字の言語
・base64エンコードされた画像
の3つです。このうち画像内の文字の言語
は日本語で固定としているので、残り2つを取得する処理はサブルーチンとして別ショートカットに切り出し、それらを呼び出す方式をとっています。ではそれぞれのショートカットを見ていきます。
APIキー
の取得処理です。APIキーは環境変数に持っておきたいのですが、さすがにそこまではできないようなので、今回はリマインダー
アプリに保持・読み出すようにしています。
内容はAPIキーを保持しているリマインダー
を検索し、その中から今回使用するOCR.space
というタイトルの項目からAPIキーを取得しています。
ショートカットの最後では、メインのショートカットに値を渡すため、変数から値を取り出して終了しています。
次にbase64エンコードされた画像
の取得処理です。このパラメータに設定する値はdata:image/[フォーマット],[base64エンコードされた画像]
ですので、実際は拡張子
と画像をbase64エンコードしたテキスト
の2つが必要になります。
まずは拡張子の取得処理です。
大きな流れとしては、まずクリップボードの内容がURL形式どうか確認し、URL形式ならその内容を取得します。さらにその内容がイメージであれば拡張子を、そうでなければnone
というテキストを返却する、という処理を行っています。このnone
というテキストは、ショートカットを実行する側の処理でnone
を受け取り、エラーとして処理を終了するために利用します。
次が画像をbase64エンコードしたテキスト
の取得処理です。
これは拡張子
の時とほぼ同じ処理の流れをしていて、拡張子
を取得していたところを画像をbase64エンコードしたテキスト
を取得するように変更しただけです。
最後にメインのショートカットで他のショートカットを実行する&その結果を受け取る
処理と、レスポンスJSONをパースする
処理を行います。
まずは他のショートカットを実行&その結果受け取る
処理です。
処理の流れは画像の通りです。ショートカットを実行し、その結果が拡張子ではないときは中断されたことを通知しショートカットを終了します。
続いてレスポンスJSONをパースする
処理です。
「ショートカット」アプリ内ではJSON
は辞書
という単語で扱われています。アクションとしては辞書の値を取得
というもので、これは組み合わせればネストされたJSONのパースも可能です。また今回は結果出力のため、最後にメモに書きだすようにしています。
実行結果
以上のサンプルを、前回私が書いた記事の画像に対して実行した結果が以下となります。
おわりに
今まではちょっとAPIを試してみたいだけでもPCを用意する必要がありましたが、この「ショートカット」アプリを使用すればiPhone単体で簡単にできます。また今回は紹介していませんが、テキストに対して正規表現を用いたマッチングもできるので、スクレイピング
も可能です。iPhoneユーザの方は試してみてはいかがでしょうか。
最後までご覧いただきありがとうございます。
参考文献
付録:今回使用したアクション
アクション名とその使い方を以下にまとめました。
- API実行
- URL
- URLを次のアクションに渡す
- URLの内容を取得
- 受け取ったURLをリスエストし、レスポンスを次のアクションに渡す
- URL
- クリップボードをリクエスト用に加工
- JSONのパース
- 辞書の値を取得
- 受け取ったJSONから指定したキーの値を次のアクションに渡す
- 辞書の値を取得
- 制御
- 変数を設定
- 受け取った値を変数に代入する
- 受け取った値をそのまま次のアクションに渡す
- 変数に追加
- 受け取った値を変数に追加する(Listにappendするようなイメージ)
- 受け取った値をそのまま次のアクションに渡す
- 変数を取得
- 変数から値を取り出し、次のアクションに渡す
- 次の場合(if~else文)
- 受け取った値と指定した値を比較する(次と等しい・次を含む・より大きい・より小さい)
- それぞれで繰り返す(foreach文)
- 受け取ったリスト形式の値に対して1つずつ処理を行う
- ショートカットを実行
- 受け取った値を特定のショートカットに渡し、その実行結果を次のアクションに渡す(メソッドのようなイメージ)
- 変数を設定
- APIキーを取得する
- リマインダーを検索
- 条件に合致するリマインダーを検索し、その結果を次のアクションに渡す
- リマインダーの詳細を取得
- 受け取った値(リマインダー)の詳細(メモ・タイトルなど)を次のアクションに渡す
- リマインダーを検索
- その他
- テキスト
- 指定したテキストを次のアクションに渡す
- 通知を表示
- タイトル・メッセージを指定し、その内容を通知として表示する
- メモを作成
- 受け取った値をメモに新規登録する
- "ショートカット"を終了
- 現在のショートカットを終了する
- 現在のショートカットに含まれる後続のアクションは実行しない
- テキスト
エンジニア中途採用サイト
ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております!
ご興味ありましたら是非ご確認をお願いします。
https://career-recruit.rakus.co.jp/career_engineer/カジュアル面談お申込みフォーム
どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
以下フォームよりお申込みください。
rakus.hubspotpagebuilder.comラクスDevelopers登録フォーム
https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/イベント情報
会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください!
◆TECH PLAY
techplay.jp
◆connpass
rakus.connpass.com