見出し画像

[GASで自動化] 英語のメルマガもサクサク読める!〜ChatGPTのAPIで翻訳してLINEでシェア


この記事で伝えたいこと

  • 世界は広い!日本のメルマガだけ読んでるのは勿体無い!!英語のメルマガも読んで知見を広げよう!

  • 英語が苦手でも問題なし!ChatGPTに翻訳してもらおう!

  • めんどくさくない!GASで自動化フローを作れば自動的に翻訳&わかりやすく要約された文面がLINEに送られてくる。

こんなことができます

私はBatchというDeepLearning.AIの提供するウィークリーマガジンをサブスク(無料)しています。

最新リサーチからAIの技術的な進歩など、広範囲のトピックをカバーしてくれていて「えーこんなことがAIでできるようになったのね!」と毎週楽しみにしているメルマガの一つです。

このメルマガを週一回Gmailから取得して日本語に要約してLINEに送るというGASを使った自動化フローを作っていきます。

完成すると以下のようなLINEメッセージを受け取ることができます。
原文ソースはこの記事です:https://www.deeplearning.ai/the-batch/issue-251/

LINEメッセージ

やること

  • GAS(Google App Script)のセットアップ

  • OpenAIのAPIキー取得

  • LINEの開発者ページでアプリのセットアップとAPIキー取得

  • GASコードにAPIキーをコピペする

  • GASのトリガーを設定

それでは一つ一つ詳しく見ていきましょう。

GASのセットアップ

手順はこちらの記事の「Google App Script(GAS)のセットアップ」を参考にしてください。

OpenAIのAPIキー取得

OpenAIのAPIキーは開発者ページ から発行できます。詳しくはこちら

LINEの開発者ページでアプリのセットアップとAPIキー(トークン)取得

プロバイダーとは?

プロバイダー
チャネルにアプリを提供する個人または組織。たとえば、個人や企業の名前をプロバイダーとして使用できます。プロバイダーは、LINE Developersコンソールで作成できます。

https://developers.line.biz/ja/glossary/
  • プロバイダーを作ったら、チャンネルを作ります。プロバイダーの画面から新規チャネル作成して「Messaging API」を選択します。

  • もろもろ入力必須項目があるので画面の説明に従って入力していきます。

  • 作成するとチャネル画面から「Messaging API設定」タブに行くとQRコードが表示されています。このQRコードをスマホのLINEアプリから読みとるとこのチャネルが友達登録されてメッセージを受け取れるようになります。

  • この画面の最下部に行くと「チャネルアクセストークン」を発行できるセクションがあるので、「発行」ボタンをクリックします。このアクセストークンはこのチャネルからAPI経由でメッセージを送るのに必要になります。「アクセストークン」と言ったり「APIキー」と言ったりしますが、要はAPI経由でサービスにアクセスする際に鍵の役割をするものです。

GASコードにAPIキーをコピペする

以下のGASコードに上のステップで取得したAPIキー(アクセストークン)をコピペしてください。

  // APIキーを入力
  const openai_key = 'your_openai_api_key'  
  const line_access_token = 'your_line_access_token'  
  
  //Gmailクエリ
  const gmail_query = 'in:inbox newer_than:14d older_than:7d label:batch'

  //GPTに送るプロンプト
  const gpt_prompt = "Please translate the following email, which provides the latest updates in the AI field, into Japanese following these guidelines: - Exclude any information about online courses. - Summarize the author's main idea from the first part of the email (blog) in 300 words in Japanese. - In the 'News' section, provide detailed explanations for each piece of news, maintaining the original section titles (e.g., background and why it matters) in Japanese."


  // OpenAI APIを使用するためのヘッダー
  const openai_headers = {
    'Authorization': 'Bearer ' + openai_key,
    'Content-Type': 'application/json',
  }
  const model = 'gpt-4o'
  
  // Line APIを使用するためのヘッダー
  const line_headers = {
    'Authorization': 'Bearer ' + line_access_token,
    'Content-Type': 'application/json',
  }
  
  function processEmails() {
    // Gmailからメールを取得
    const threads = GmailApp.search(gmail_query);
    // 取得したメールを処理
    threads.forEach(thread => {
      const messages = thread.getMessages();
      messages.forEach(message => {
        const subject = message.getSubject();
        const body = message.getPlainBody();
        const date = Utilities.formatDate(message.getDate(), "Japan/Tokyo", "yyyy-MM-dd")
  
        // OpenAI APIでメール本文を要約
        const summary_by_gpt = getGPTSummary(body, model)
        console.log(summary_by_gpt)
    
        // Lineに送信
        const resp = sendLineMessage(date, summary_by_gpt);
  
      });
    });
  }
  
  // Line APIでメッセージを送信する関数
  function sendLineMessage(date, content) {
    
    const data = {
      "messages": [
        {
        "type": "text",
        "text": '今週のメルマガの内容です。\n\n' + content
        }
      ]
    }
    const options = {
      method: 'post',
      headers: line_headers,
      payload: JSON.stringify(data),
      muteHttpExceptions: true
    }
  
    const response = UrlFetchApp.fetch('https://api.line.me/v2/bot/message/broadcast', options)
    console.log(response.getResponseCode())
    console.log(response.getContentText())
    return response
  
  }
  
  // GPTでメール本文を要約する関数
  function getGPTSummary(content, model) {
  
    const gptCompletionEndpoint = 'https://api.openai.com/v1/chat/completions'
    
    const data = {
      "model": model,
      "messages": [
        {
          "role": "user",
          "content": Utilities.formatString("%s: \"%s\"", gpt_prompt, content)
        }
      ],
      "temperature": 0.0,
      "max_tokens": 4096,
      "top_p": 1,
      "frequency_penalty": 0,
      "presence_penalty": 0
    }
  
    const options = {
        method: 'post',
        headers: openai_headers,
        payload: JSON.stringify(data),
      };
  
    // OpenAI リクエスト
    const response = UrlFetchApp.fetch(gptCompletionEndpoint, options);
    const responseJSON = JSON.parse(response.getContentText())
    
    return responseJSON.choices[0].message.content
  }
  


GASのトリガーを設定

トリガー設定はGASの画面の左メニューの「Triggers」から行います。

画面下部の「Add trigger」ボタンから以下の画面で設定を行います。
ウィークリーニュースレターならTime-drivenでWeek timerを設定し、トリガーを設定したい曜日と時間帯を設定します。

おわりに

言語モデルの最近の凄まじい進化のおかげで、英語ができなくても、また専門知識がなくても、論文をはじめ色々な情報ソースへのハードルが格段に下がりました。例えば「arxiv」などから論文をダウンロードしてChatGPTやその他言語モデルにわかりやすく要約してもらって知見を広げることができます。
この記事で紹介した自動化フローがその第一歩になってくれると嬉しいです。Happy automating!

この記事が気に入ったらサポートをしてみませんか?