しくじり日記

筋肉つけたい

Cloud Functions for Firebase でslackへの通知を定期実行する ~その3~

tossyisland.hatenablog.com

前回の続き、今回が最終回です。

翻訳APIについて

翻訳APIを調べてみたところ、精度や応答時間、無料枠の広さなど様々な面から、GCPのCloud Translationが一番の候補に上がってきました。

FirebaseにはGCPの機能を簡単に扱うための拡張機能が用意されています。Cloud Translationについても、Translate Textという拡張機能がありました。

firebase.google.com

しかし、この拡張機能はFirestoreに保存した文字列を翻訳するもので、APIの形でリクエストの文字列を翻訳して返してくれるわけではないようです。そのため今回は使用を見送ったのですが、Firebaseの拡張機能自体はとても有用なものだと思ったので、別の機会で使ってみようと思います。 f:id:tsk110:20201012090039p:plain

Cloud Translation API について

Cloud Translationには2種類のバージョンがあるのですが、料金形態はどちらも同じになっています。最初の50万文字は無料といった扱いになっていますが、正確には$10の使用クレジットが請求先アカウントに適用されます。お金がかからないというのに変わりはないのですが、請求額の見方によっては費用がかかっているのに驚く場合もあるかもしれないのでご注意ください。

f:id:tsk110:20201012214726p:plain

f:id:tsk110:20201012215711p:plain

BasicとAdvancedの違いについて、詳しくはドキュメントに記載されていますが、大きな違いとしてはこれらが挙げられます。

  • APIキーの代わりにサービス アカウントを利用して認証
  • 適用できる翻訳モデルの種類が増加
  • バッジリクエストやカスタム辞書(独自のドメイン用語用)が利用可能

cloud.google.com

実際に使ってみる

ドキュメントに沿って以下の操作を進めていきます。

  1. プロジェクトの作成(既に作成している場合は選択するだけ)
  2. 課金の有効化
  3. API の有効化
  4. 認証を設定

今回はBasicを使うためAPIキーを取っておきます。 ここまで出来たら、あとは実際にAPIを叩くプログラムを書いていきます。 ドキュメントでは認証を環境変数に読み込ませていましたが、実際のコードを追ったところ引数にAPIキーを渡す形でも認証を通すことが出来ました。

私はfirebase functions:config [set or get]と設定ファイルで環境変数を管理するのが2ヶ所になるのを嫌った形ですが、実際にはこの変どう管理していくのが良いんでしょうか...もう少し色々触りながらベストプラクティスを見つけていこうと思います。

   * A custom request implementation. Requests to this API may optionally use an
   * API key for an application, not a bearer token from a service account. This
   * means it is possible to skip the `makeAuthenticatedRequest` portion of the
   * typical request lifecycle, and manually authenticate the request here.

https://github.com/googleapis/nodejs-translate/blob/b2b482208d6e3917b67c701e50bc3128266661b8/src/v2/index.ts#L568-L571

これを踏まえて、テキストとAPIキーは外から渡す前提で、コードは以下のようになりました。

import * as translateAPI from "@google-cloud/translate";
export const translateText = async (key: string,text: string) => {
  const translate = new translateAPI.v2.Translate({
    key: key,
  });
  const target = "ja";
  return translate.translate(text, target);
};

まとめ

最終的にこれらを合わせて以下の機能が実現できました。

  • Githubのトレンドを取得する
  • descriptionを翻訳する
  • その結果を毎日Slackに投稿する

今回作成したプログラムは私のリポジトリに置いてありますので、もしよろしければご覧ください。 今後もまた何か思いついたら機能を足してみようと思います。

(今考えてるのだと、カスタムコマンドで言語を与えてFirestoreに保存、その言語に絞ってトレンドをフィルタするとかですかね)

github.com