【GAS、LINE API】LINEでニュースを読むbotを作る（Webスクレイピング）

（2021/3/18：下段のデプロイについて誤りがあったので修正しました）

こんばんは。

インターネットのし過ぎを防ぎたいなあといつも思っています。
14年程前、家のインターネット回線を解約し、必要な時のみネットカフェに行く生活をしていました。
頭がすっきりして快適だったのを覚えていますが、インターネット前提のサービスに囲まれた現在では難しいですね。
情報をうまく受け取り、必要に応じて捨てたり遮断するのが賢明です。

文鳥とか猫とか、昔好きだったバンドとか、いろんな動画見るの楽しいしなあ・・。

さて、今回はこんな事をしてみました。

###１．はじめに

こんなことないですか？
①ニュースサイトを開く。興味のある記事をクリック
↓
②「お、こんな事あるんだ」といって関連ページに飛ぶ
↓
③面白そうなリンクがあり、飛ぶ
↓
④②に戻る（無限ループ）

有益な情報もありますが、大事な時間を浪費してしまう事もあります。
インターネットをやり過ぎてしまう原因の一つとして、「目的以外の情報が目に留まってしまう事」が挙げられると思うのです。
このプログラムを使うと、余分な情報を、ほんの少し遮断できます。


###２．作ったもの

いろいろな機能追加が可能ですが、今回はまずはニュース情報を取得する機能を作ってみたいと思います。

機能としては、
・LINEで「ヤフー」とメッセージを入力する
・ヤフーニュースがテキストメッセージとして返ってくる

こんな感じでメッセージが返ってきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/ded2a120-4950-5667-ca6a-a5f9430ba6b1.png)


LINE APIとGASの組み合わせで実現しました。
以下のようなイメージです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/f35d20e1-7dba-fb8b-3ebe-cd77c84b795f.png)


以下に手順をまとめてみました。
モノづくりのツールは日々進化していますので、画面は変わってしまう事もあるのでご注意ください。
今回もGASのメニューが変わっており戸惑いました。
個人的には、しょっちゅう画面が変わるのは嬉しくないです。

###３．必要なもの
以下2つがあれば、作成できます。
・LINEのアカウント
・Googleのアカウント


###４．手順概要

(1).LINE messagingAPIを設定する
(2).GASでスクレイピングツールの設定をする（Parser）
(3).GASのプログラミングをおこなう
(4).LINEのアクセストークンをGASに紐づける
(5).GASをWebアプリとして公開し、LINEに紐づける
(6).友達登録して利用開始

###５．手順詳細

####(1).LINE messagingAPIを設定する
MessagingAPIの設定をおこないます。以下のURLを開いてください。

＜MessagingAPI＞
https://developers.line.biz/console/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/11a2c001-9c88-8af7-edda-3b4987b963bc.png)

ご自身のアカウントを選択しログインしてください。
認証キーが表示されますので、携帯電話に届いたメッセージを開き入力します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/bf13716f-965e-3060-8d3a-b26b68ed8459.png)

プロバイダーを作成します。
添付の僕の画面では、既に複数作成していますが、初めての方は新規作成をします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/9ffa8442-8e70-f9c1-c2c2-5f8ef1adb9d6.png)


任意の名前を入力してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/55bd3948-9df7-e4d7-cb7f-85557c69e683.png)

「Create a Messaging API channnel」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/2a8f97c0-fc25-2dbb-d481-e6fc93bdac99.png)

順次必要項目を入力していきます。
ここで、デフォルトが英語になっていますので右下のタブを選択して日本語表示にしておきましょう（画面を起動した時点で選択可能です）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/b5ba423f-b768-929b-3d59-42a2a6baba9b.png)

チャネル名は任意の値を入力してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/88d0c466-bbf0-b52f-806a-f96e11c29063.png)

任意の値を入力すればOKです。
「任意」となっているURL欄は入力不要です。
規約同意はきちんとチェックしてください。

ひととおりの入力を終えたら「作成」ボタンを押下します。
すると、情報利用に関する同意の画面が表示されますので、確認して同意します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/dab8cbde-3b08-0769-7864-04caec537888.png)

プロバイダが作成できました！これを使って遊びます。

「Messaging API設定」のタブをクリックします。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/dc75e1fd-a429-2827-5dea-68ad60c39a55.png)

プロバイダのQRコードが表示されます。この時点で友達登録も可能です。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/04a7c4ba-079a-c930-1f9b-b7cc84cc9f9f.png)

「チャネルアクセストークン」の、「発行」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/31a8cad3-f10f-6f4f-5c21-961402175f89.png)


意味不明な文字の羅列が表示されますが、これがアクセストークンです。
冒頭の図の通り、これをGASに紐づける事で連携を可能にしています。
コピーボタンを押して、どこかに控えておいてください。


####(2).GASでスクレイピングツールの設定をする（Parser）

まずは、ご自分のGoogleドライブに、GASのファイルを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/4c31a711-45e3-0f51-2770-b0c8211483b5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/8431e1ad-d7fc-266a-b585-8dc6a82a4d54.png)

ファイル名を変更しておきます（今回のサンプルは「test210313」としました）。

ここで、まずはParserをライブラリ追加します。
Parserは、htmlを解析して特定条件のデータを抽出できるツールです。
これを使うには、ライブラリへの登録が必要になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/d7c9c3ba-2e06-a4bb-34b3-dd0a7e85f00e.png)

「ライブラリ」をクリックしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/62ceb686-a30b-a7df-9edf-fca57a001703.png)

ライブラリのIDは、

1Mc8BthYthXx6CoIz90-JiSzSafVnT6U3t0z_W3hLTAX5ek4w0G_EIrNw

です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/0352af87-eaa2-c6ae-db14-0465faf8b83f.png)

「追加」をクリックすれば、完了です。

####(3).GASでプログラミングする

次はGASでコーディングをしていきます。
こちらの記事作成にあたっては、以下がかなり参考になりました。
ありがとうございます。
https://qiita.com/ttexan/items/749bed9a60313e51b4c8

```java
var CHANNEL_ACCESS_TOKEN = 'xxxx'; // xxxxに、Channel_access_tokenを登録

function yahoo(datarui) {
  var url = 'https://yahoo.co.jp/'
  var html = UrlFetchApp.fetch(url).getContentText();
  var parser = Parser.data(html);
  var data = Parser.data(html).from('<h1 class="_3cl937Zpn1ce8mDKd5kp7u"><span class="fQMqQTGJTbIMxjQwZA2zk _3tGRl6x9iIWRiFTkKl3kcR">').to('</span>').iterate();
  var datarui = url;
  for(let i = 0; i <= 7; i++) {
    datarui = datarui + '\n' + data[i];
  }
  return datarui;

}



function doPost(e) {
  var event = JSON.parse(e.postData.contents).events[0];
  var replyToken= event.replyToken;

  if (typeof replyToken === 'undefined') {
    return; // エラー処理
  }
  var userId = event.source.userId;
  var nickname = getUserProfile(userId);

  if(event.type == 'follow') { 
    // ユーザーにbotがフォローされた場合に起きる処理
  }

  var dataruid = '';
  dataruid = yahoo(dataruid);
  
  if(event.type == 'message') {
    var userMessage = event.message.text;
    var replyMessage = userMessage 
    var replyMessage2 = ''; 

    switch (true) {
      case userMessage === 'ヤフー':
       dataruid = yahoo(dataruid);
      break
      default:
       dataruid = 'こんにちは！'; 
      break
    }
    replyMessage2 = dataruid; 
    
    var url = 'https://api.line.me/v2/bot/message/reply';
    
    UrlFetchApp.fetch(url, {
      'headers': {
        'Content-Type': 'application/json; charset=UTF-8',
        'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN,
      },
      'method': 'post',
      'payload': JSON.stringify({
        'replyToken': replyToken,
        'messages': [{
          'type': 'text',
          'text': replyMessage2,
        }],
      }),
    });
    return ContentService.createTextOutput(
      JSON.stringify({'content': 'post ok'})
    ).setMimeType(ContentService.MimeType.JSON);
  }
}

// profileを取得してくる関数
function getUserProfile(userId){ 
  var url = 'https://api.line.me/v2/bot/profile/' + userId;
  var userProfile = UrlFetchApp.fetch(url,{
    'headers': {
      'Authorization' :  'Bearer ' + CHANNEL_ACCESS_TOKEN,
    },
  })
  return JSON.parse(userProfile).displayName;
}

```
基本的には上記をコピペでいけます。
「ヤフー」と入力した場合のみ、ルーチン処理に入ります。
それ以外は、「こんにちは！」と返事が来るようにします。まあここは適当に。

Parserは、htmlファイルを解析し、特定の文字列に囲まれた値を取得します。
以下の部分です。

```
  var data = Parser.data(html).from('<h1 class="_3cl937Zpn1ce8mDKd5kp7u"><span 
```

対象サイトの「ソースを表示」を選択し、抽出条件にできる文字列を探す必要があります。
ヤフーのトップサイトでソースを表示し、ニュース見出しをくくっている共通の条件を探したところ、上記になりました。

####(4).LINEのアクセストークンをGASに紐づける

上記ソースの「var CHANNEL_ACCESS_TOKEN = 'xxxx'; // xxxxに、Channel_access_tokenを登録
」のxxxxのところに、(1)の手順で控えた「アクセストークン」をコピペしてください。
長い文字列ですが、べたっと貼り付けます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/3789e1dc-2c42-07a5-5f63-8280200f419c.png)

実行をすると、このような画面が出ます。
ここは「権限を確認」し、許可するようにしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/6692db20-9b7e-2888-b9d7-0775cc57d2c4.png)

ここで「安全なページに戻る」を押下すると、前に進みませんのでご注意ください。

####(5).GASをアプリとして公開し、LINEに紐づける

GASをWebアプリとして公開する事で、URLを取得しLINEとの紐づけをおこないます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/04f65ecb-17af-e712-22c0-7047de7f40ec.png)

上部メニューの「デプロイ」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/b0046b53-7f9d-6655-ee71-e3e2532094e2.png)

「実行可能API」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/c4d192d5-ffae-3727-feef-d4e25944f549.png)

説明文は任意の内容を入力します。
「デプロイ」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/90557d02-2e9c-6894-3e55-2276c288c920.png)

ここで、Webアプリとして公開されます。
URLをコピーします。
これをLINEに紐づけます。こうすると、双方の連携が可能になるという事ですね！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/245b2e56-0521-0fe8-259f-3ac419fb5494.png)


「Messaging API設定」の「Webhook設定」に、先ほどコピーしたURLを設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/feb5324a-5adf-46e6-d189-190af15957a2.png)

「検証」を必ずクリックしてください。これでURLの正当性を確認してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/6e5f883a-51b4-467a-1b84-366faf20476d.png)

「Webhookの利用」をONにします。

ほぼ完成です。もうちょいです！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/eebc7591-f9c2-7f1d-82bb-c0efd36c30ed.png)

同じく「Messaging API設定」の「応答メッセージ」の「編集」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/6e5328eb-32ad-2e99-0a5a-f490661eb32a.png)

「あいさつメッセージ」「応答メッセージ」を「オフ」にします。
これをしないと、メッセージを送ったときに、ちょっと冗長なあいさつメッセージが毎回返信されてきます。
これは個人の好き好きですが、まあ不要なのでオフにしておいて良いです。

####(6).友達登録して、利用開始！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/5b6b356a-98f6-299f-f8cd-be1ffe541394.png)

「Messaging API設定」の「QRコード」に表示されたQRコードを読み取って友達登録します。

これで完成です！！



###６．留意点（デプロイについて）

こちらも、冒頭にリンクを記載させていただいた記事でも書かれていたように、GASを修正した場合は、再度デプロイが必要です。
(2)の方法が良いです。

#####(1).「新しいデプロイ」で反映

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/2656a415-2324-85f5-e750-7447aa6c918e.png)

「新しいデプロイ」を選択し、必要事項を入力し、「デプロイ」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/6d3a9f2d-a913-b7ab-0a26-722d937b5bcc.png)

バージョン番号が更新されます（これは試しにデプロイを繰り返したので、バージョンが4になっています）。
この場合は、WebアプリのURLが更新されます。そのため、MessagingAPI側の設定も同時に変更が必要です。

#####(2).「デプロイの管理」で反映


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/33ac78bf-5ce6-a127-21aa-7acdaa965d59.png)

「デプロイを管理」を選択し、デプロイ画面の右上の鉛筆マークを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/f09680b3-5ef4-6e1f-3d75-bd3dfae74dda.png)

バージョンが活性化しますので、「最新のバージョン」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402487/848cb26b-b2e4-fa25-288c-243bec4daf53.png)

「デプロイ」を選択します。
こちらはもともとのデプロイのバージョンを更新するため、URLも変わりません。
(1)よりこっちの方が良いですね。

###７．最後に
このbotで、ニュースを見る事が殆どになりました
（気になった場合はyahooサイトを見に行く、という流れ）。
手順を詳細に記載したので長くなりましたが、作業のひとつひとつは難しくはないので是非チャレンジしてみてください。