35
35

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

生成AIに関する記事を書こう!
Qiita Engineer Festa20242024年7月17日まで開催中!

【初心者向け】GoogleのAI「Gemini」に毎朝ニュースサマリーをLINEに送ってもらおう!

Posted at

はじめに

毎朝、ニュースサイトをチェックするのって大変ですよね。

そこで今回は、 Google Apps Script (GAS)無料のニュースAPI 、そして Googleの生成AI「Gemini」 を組み合わせて、 最新のニュースをまとめてLINEに送ってくれるシステム を作ってみましょう!

プログラミング初心者の方でも、ステップバイステップで解説していくので、安心してください。

なお、今回は制限付きですが、API利用が基本無料なGeminiを選択しました。
今後課金される可能性もあるので注意しましょう!

必要なもの

  • Googleアカウント
  • 通知先のLINEのアカウント
  • Google AI Studio上で取得したGemini APIのAPIキー
  • News APIのAPIキー (今回はNews API を利用します)
  • LINE Notifyのアクセストークン

手順

1. Google Apps Script (GAS)の準備

GASは、Googleが提供するJavaScriptベースのスクリプト実行環境です。ブラウザ上でコードを記述・実行できるため、手軽にWebアプリケーションや自動化ツールを作成できます。

また、定期実行のトリガーを簡単に作ることができます!

まずは、GASのコードを記述するためのプロジェクトを作成しましょう。

  1. Googleドライブを開き、「新規」>「その他」>「Google Apps Script」を選択します。
  2. プロジェクト名は任意の名前で構いません (例: news_summarizer)。

2. 各種APIキーの準備

今回のシステムでは、外部サービスと連携するために、以下のAPIキーが必要となります。

  • News APIキー: News API のウェブサイトでアカウントを作成し、APIキーを取得します。
    News APIについてはこちらの記事が参考になります。

  • Google AI Studio上で取得したGemini APIのAPIキー:
    1. Google AI Studio にアクセスします。
    2. 左上の「Get API key」をクリックします。
      image.png
      3.「APIキーを作成」をクリックし、APIキーを作成します。
      プランがFree of charge(無料枠)になっていることを確認します。
      image.png

注: Vertex AIからAPIキーを生成してしまうと従量課金されてしまうので注意しましょう。

  • LINE Notifyアクセストークン: LINE Notifyのマイページからアクセストークンを発行します。
    簡単なので、以下の記事を参考にしてみてください。

また、記事の指示に従って、ルームの作成と、LINE notifyの招待まで済ませておきましょう。

取得したAPIキーは、コード内の所定の位置に貼り付けます。セキュリティのため、APIキーは外部に漏洩しないよう、厳重に管理してください。

3. ニュースを取得する関数の追加: fetchNews(topic)

ここからは実際にコードを作成します!
同じファイルに、どんどん貼り付けていきましょう。
image.png

この関数は、News APIを使って、指定されたtopic (ニュースのカテゴリ) に合致する最新のニュースを取得します。

function fetchNews(topic) {
  // News APIキーを設定
  const newsApiKey = ''; // あなたのNews APIキーを入力

  // News APIのURL
  const newsApiUrl = `https://newsapi.org/v2/top-headlines?country=jp&category=${topic}&apiKey=${newsApiKey}`;

  // News APIを呼び出すための設定
  const newsApiOptions = {
    'method': 'get',
    'contentType': 'application/json'
  };

  // News APIを呼び出して結果を取得
  const newsApiResponse = UrlFetchApp.fetch(newsApiUrl, newsApiOptions);
  const newsData = JSON.parse(newsApiResponse.getContentText());

  // ニュース記事のタイトルを抽出
  const newsTitles = newsData.articles.map(article => article.title).join('\n');
  // ニュースのタイトルを返す
  return newsTitles;
}
  • newsApiKey に取得したNews APIキーを貼り付けます。
  • newsApiUrl は、News APIのエンドポイントです。 country=jp で日本国内のニュースに絞り込み、 category=${topic} で指定されたカテゴリの最新ニュースを取得します。
  • UrlFetchApp.fetch() でAPIを呼び出し、 JSON.parse() でレスポンスをJavaScriptオブジェクトに変換します。
  • newsData.articles から各記事のタイトルを抽出し、改行で連結した文字列を newsTitles に格納して返します。

なお今回は最新のニュースを取得するTop headlines エンドポイントを利用しています。
詳しい検索などを利用したい場合、他のエンドポイントが利用できるので、ドキュメントを参照してみてください!

4. ニュースを要約する関数: summarizeNews(newsTitles)

この関数は、取得したニュースのタイトルリスト (newsTitles) を元に、Gemini APIに要約を依頼します。

function summarizeNews(newsTitles) {
  const apiKey = ''; // あなたのGoogle AI studioで取得したAPIKeyを入力

  // Geminiに送るプロンプト
  const prompt = `以下のニュース記事を簡潔にまとめてください。\n\n${newsTitles}`;

  // Gemini APIを呼び出すための設定
  const url = `https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-latest:generateContent?key=${apiKey}`;
  const options = {
    'method': 'post',
    'contentType': 'application/json',
    'payload': JSON.stringify({"contents":[{"parts":[{"text":prompt}]}]})
  };

  // Gemini APIを呼び出して結果を取得
  const response = UrlFetchApp.fetch(url, options);
  const data = JSON.parse(response.getContentText());

  // Geminiの回答を抽出
  const newsSummary = data.candidates[0].content.parts[0].text;

  // ニュースのサマリを返す
  return newsSummary;
}
  • apiKey にGoogle AI Studioで取得したAPIキーを貼り付けます。
  • prompt には、ニュースタイトルのリストを埋め込んだ要約依頼文を作成します。
  • url は、Gemini APIのエンドポイントです。
  • UrlFetchApp.fetch() でAPIを呼び出し、 JSON.parse() でレスポンスをJavaScriptオブジェクトに変換します。
  • data.candidates[0].content.parts[0].text からGeminiが生成した要約文を newsSummary に格納して返します。

5. LINEに通知する関数: sendLineNotification(message)

この関数は、LINE Notify APIを使って、指定されたメッセージ (message) をLINEに送信します。

function sendLineNotification(message) {
  // LINE Notifyのアクセストークンを設定
  const token = ''; // あなたのLINE Notifyのアクセストークンを入力

  // LINE Notify APIのURL
  const url = 'https://notify-api.line.me/api/notify';

  // リクエストヘッダー
  const headers = {
    'Authorization': `Bearer ${token}`
  };

  // リクエストオプション
  const options = {
    'method': 'post',
    'headers': headers,
    'payload': { 'message': message }
  };

  // LINE Notify APIにリクエストを送信
  UrlFetchApp.fetch(url, options);
}
  • token にLINE Notifyのアクセストークンを貼り付けます。
  • UrlFetchApp.fetch() でLINE Notify APIを呼び出し、メッセージを送信します。

6. 全体の処理をまとめる関数: postNewsToLINE()

この関数は、これまでの関数を順番に呼び出し、ニュース取得からLINE通知までの処理全体を実行します。

function postNewsToLINE() {
  // ニュースのカテゴリを設定 (例: business)
  const topic = 'business';

  // News APIからニュースを取得
  const newsTitles = fetchNews(topic);

  // Geminiでニュースを要約
  const newsSummary = summarizeNews(newsTitles);

  // ニュースのサマリをLINEに投稿
  sendLineNotification(newsSummary);
}
  • topic に希望のニュースカテゴリを設定します (News APIで利用可能なカテゴリはこちらを参照)。
  • fetchNews(), summarizeNews(), sendLineNotification() を順番に呼び出して処理を実行します。

7. テスト実行!

ここまでコードを書きおえたら、実行してみましょう。
「postNewsToLINE」を選択し、実行をクリック
image.png
権限の承認が出てくると思うので、以下の記事の指示に従ってアクセスを承認し、実行!
ピロンと、LINEの通知が届くはずです!!

実際に届いている様子がこちら↓
mojikyo45_640-2.gif

8. 定期実行の設定

最後に、この postNewsToLINE 関数を毎日決まった時間に実行するように設定します。

  1. GASのエディタ画面の左側にある時計マーク (トリガー) をクリックします。
  2. 「トリガーを追加」ボタンをクリックします。
  3. 実行する関数に postNewsToLINE を選択します。
  4. イベントソースを「時間主導型」に、時間ベースのトリガーを「日付タイマー」に、時刻を希望の時間 (例: 午前7時) に設定します。
  5. 保存します。

これで、毎日設定した時間に指定したカテゴリのニュースサマリーがLINEに届くようになります!

まとめ

Google Apps Scriptと無料API、そしてGoogleの最新AI技術を組み合わせることで、誰でも簡単に便利な自動化ツールを作成できます。

今回は簡単なプロンプトですが、プロンプトの工夫次第でどんなことでもできちゃいますね。

今回の記事を参考に、ぜひ色々なサービスを組み合わせて、あなただけのオリジナルツールを作ってみてください!

今後も生成AIの最新動向や初心者向け記事を投稿していくので、ぜひフォローよろしくお願いします🙏

それでは、よき生成AIライフを!

35
35
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
35
35

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?