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

## はじめに

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

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

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

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

## 必要なもの

- Googleアカウント
- 通知先のLINEのアカウント
- Google AI Studio上で取得したGemini APIのAPIキー
- News APIのAPIキー (今回は[News API](https://newsapi.org/) を利用します)
- 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](https://newsapi.org/) のウェブサイトでアカウントを作成し、APIキーを取得します。
News APIについてはこちらの記事が参考になります。

https://zenn.dev/uinoue/articles/660ee202373f64
    
- **Google AI Studio上で取得したGemini APIのAPIキー:** 
    1. [Google AI Studio](https://aistudio.google.com/) にアクセスします。
    2. 左上の「Get API key」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381702/1f5a0e38-bd31-9104-4351-4f8e8ebf6582.png)
    3.「APIキーを作成」をクリックし、APIキーを作成します。
プランがFree of charge(無料枠)になっていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381702/e795bf4b-7ec6-2192-a75d-c00f3f2a27d7.png)

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

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

https://qiita.com/iitenkida7/items/576a8226ba6584864d95

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

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

### 3. ニュースを取得する関数の追加: `fetchNews(topic)`
ここからは実際にコードを作成します！
同じファイルに、どんどん貼り付けていきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381702/c0abf73f-e55b-9cc8-4857-a705400cbdb5.png)

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

```javascript
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 エンドポイントを利用しています。
詳しい検索などを利用したい場合、他のエンドポイントが利用できるので、ドキュメントを参照してみてください！

https://newsapi.org/docs/endpoints/top-headlines

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

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

```javascript
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に送信します。

```javascript
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通知までの処理全体を実行します。

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

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

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

  // ニュースのサマリをLINEに投稿
  sendLineNotification(newsSummary);
}
```

- `topic` に希望のニュースカテゴリを設定します (News APIで利用可能なカテゴリは[こちら](https://newsapi.org/docs/endpoints/top-headlines)を参照)。
- `fetchNews()`, `summarizeNews()`, `sendLineNotification()` を順番に呼び出して処理を実行します。

### 7. テスト実行！
ここまでコードを書きおえたら、実行してみましょう。
「postNewsToLINE」を選択し、実行をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381702/cfdc3d5b-81bf-b940-9122-e28fca00bb89.png)
権限の承認が出てくると思うので、以下の記事の指示に従ってアクセスを承認し、実行！
ピロンと、LINEの通知が届くはずです！！

https://uncle-gas.com/approve-permissions/

実際に届いている様子がこちら↓
<img width="200" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381702/15a57205-f6d9-e9e3-09bb-c6f94a8ed987.png">


### 8. 定期実行の設定

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

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

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

## まとめ

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

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

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

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

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