RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのエンジニアブログ

iPhoneだけでAPI実行!!「ショートカット」アプリを試してみた

はじめに

新卒2年目エンジニアのkasuke18です。
つい先日iOS12がリリースされました。リリースされた内容は数多くありますが、その中でも気になったのが「ショートカット」というアプリです。このアプリをうまく使えばiPhone単体でAPIの実行が可能になります。実際に試してみましたので、紹介します。

もくじ

「ショートカット」アプリについて

「ショートカット」アプリの画像
リリースノートShortcuts 2.0 release notesを見ると、「ショートカット」アプリはiOS12の以前に「Workflow」アプリとして公開されていたようです。
「ショートカット」アプリでは、ビジュアルプログラミング言語のようにアクションと呼ばれる構成要素を組み合わせて1つのショートカットを作成します。アクションにはiPhone端末の設定変更他アプリの操作・データの受け渡しといったものが用意されているほか、変数・条件分岐・繰り返し(for, foreach)といった制御を行うものも用意されています。

作成したショートカット

内容

クリップボードに保存されている画像のリンクに対してOCRAPIを実行し、画像内の文字をテキストに変換して出力する、ということをやってみました。今回使用したOCRAPIFree OCR API | OCR.spaceです。POSTパラメータやレスポンスのJSON構成はリンク先でご確認ください。

作成例

まずはPOSTリクエストを送信する部分です。

POSTリクエストを送信するショートカット
図1. POSTリクエストの送信

今回POSTパラメータとして必要な情報はAPIキー画像内の文字の言語base64エンコードされた画像の3つです。このうち画像内の文字の言語は日本語で固定としているので、残り2つを取得する処理はサブルーチンとして別ショートカットに切り出し、それらを呼び出す方式をとっています。ではそれぞれのショートカットを見ていきます。

 

APIキーの取得処理です。APIキーは環境変数に持っておきたいのですが、さすがにそこまではできないようなので、今回はリマインダーアプリに保持・読み出すようにしています。

APIキーを「リマインダー」アプリから読み出すショートカット
図2. APIキーの取得
内容はAPIキーを保持しているリマインダーを検索し、その中から今回使用するOCR.spaceというタイトルの項目からAPIキーを取得しています。
ショートカットの最後では、メインのショートカットに値を渡すため、変数から値を取り出して終了しています。

 

次にbase64エンコードされた画像の取得処理です。このパラメータに設定する値はdata:image/[フォーマット],[base64エンコードされた画像]ですので、実際は拡張子画像をbase64エンコードしたテキストの2つが必要になります。
まずは拡張子の取得処理です。

URLから画像を取得し、その拡張子を取得するショートカット
図3. 拡張子の取得

大きな流れとしては、まずクリップボードの内容がURL形式どうか確認し、URL形式ならその内容を取得します。さらにその内容がイメージであれば拡張子を、そうでなければnoneというテキストを返却する、という処理を行っています。このnoneというテキストは、ショートカットを実行する側の処理でnoneを受け取り、エラーとして処理を終了するために利用します。
次が画像をbase64エンコードしたテキストの取得処理です。
URLから画像を取得し、そのbase64エンコードしたテキストを取得するショートカット
図3. 画像をbase64エンコードしたテキストの取得

これは拡張子の時とほぼ同じ処理の流れをしていて、拡張子を取得していたところを画像をbase64エンコードしたテキストを取得するように変更しただけです。

 

最後にメインのショートカットで他のショートカットを実行する&その結果を受け取る処理と、レスポンスJSONをパースする処理を行います。 まずは他のショートカットを実行&その結果受け取る処理です。

別ショートカットを実行し、その結果を受け取るショートカット
図4. 別ショートカットの実行

処理の流れは画像の通りです。ショートカットを実行し、その結果が拡張子ではないときは中断されたことを通知しショートカットを終了します。
続いてレスポンスJSONをパースする処理です。
レスポンスJSONをパースするショートカット
図5. レスポンスJSONのパース

「ショートカット」アプリ内ではJSON辞書という単語で扱われています。アクションとしては辞書の値を取得というもので、これは組み合わせればネストされたJSONのパースも可能です。また今回は結果出力のため、最後にメモに書きだすようにしています。

実行結果

以上のサンプルを、前回私が書いた記事の画像に対して実行した結果が以下となります。

OCRで認識する画像
図6. OCRで認識する画像

ショートカット全体を実行した結果
図7. 実行結果

おわりに

今まではちょっとAPIを試してみたいだけでもPCを用意する必要がありましたが、この「ショートカット」アプリを使用すればiPhone単体で簡単にできます。また今回は紹介していませんが、テキストに対して正規表現を用いたマッチングもできるので、スクレイピングも可能です。iPhoneユーザの方は試してみてはいかがでしょうか。
最後までご覧いただきありがとうございます。

参考文献

付録:今回使用したアクション

アクション名とその使い方を以下にまとめました。

  • API実行
    • URL
      • URLを次のアクションに渡す
    • URLの内容を取得
      • 受け取ったURLをリスエストし、レスポンスを次のアクションに渡す
  • クリップボードをリクエスト用に加工
    • クリップボードを取得
    • 種類を取得
      • 受け取った値のデータ種類(イメージ・URLなど)のテキストを次のアクションに渡す
    • Base64エンコード
      • 受け取った値をBase64形式でエンコード・デコードした値を次のアクションに渡す
    • ファイルの詳細を取得
      • 受け取った値(ファイル)の詳細(拡張子・サイズなど)を次のアクションに渡す
  • JSONのパース
    • 辞書の値を取得
      • 受け取ったJSONから指定したキーの値を次のアクションに渡す
  • 制御
    • 変数を設定
      • 受け取った値を変数に代入する
      • 受け取った値をそのまま次のアクションに渡す
    • 変数に追加
      • 受け取った値を変数に追加する(Listにappendするようなイメージ)
      • 受け取った値をそのまま次のアクションに渡す
    • 変数を取得
      • 変数から値を取り出し、次のアクションに渡す
    • 次の場合(if~else文)
      • 受け取った値と指定した値を比較する(次と等しい・次を含む・より大きい・より小さい)
    • それぞれで繰り返す(foreach文)
      • 受け取ったリスト形式の値に対して1つずつ処理を行う
    • ショートカットを実行
      • 受け取った値を特定のショートカットに渡し、その実行結果を次のアクションに渡す(メソッドのようなイメージ)
  • APIキーを取得する
    • リマインダーを検索
      • 条件に合致するリマインダーを検索し、その結果を次のアクションに渡す
    • リマインダーの詳細を取得
      • 受け取った値(リマインダー)の詳細(メモ・タイトルなど)を次のアクションに渡す
  • その他
    • テキスト
      • 指定したテキストを次のアクションに渡す
    • 通知を表示
      • タイトル・メッセージを指定し、その内容を通知として表示する
    • メモを作成
      • 受け取った値をメモに新規登録する
    • "ショートカット"を終了
      • 現在のショートカットを終了する
      • 現在のショートカットに含まれる後続のアクションは実行しない
Copyright © RAKUS Co., Ltd. All rights reserved.