毎朝自動で星座占いを送ってくれるLINE botあったら便利じゃね・・？

# 目次
* 初めに
* 導入
* プログラムの作成
* トリガーの設定
* おまけ
* 参考文献

# 1. 初めに
友達のLINEグループにて
```
A : 今日の運勢めっちゃ悪いやん
わし : 星座占いなんて子供かよww ちなみにうお座は？
B : スクショほい
わし : うわめっちゃいいやんやった！！！！
A,B : ...
わし : 毎朝LINEに送ってくれるbotあったら便利じゃね？
```

というのがこのbot作成の経緯となりました(笑)

まあ確かに、自動でしてくれたら楽ですよね！
#### ってことでレッツ作成！

# 2. 導入

* 何よりも先に、LINE botを作りましょう！
それは私が過去に書いた[記事](https://qiita.com/paupau/items/14c636469c81f4b4e9e7)をご覧ください。過去の記事はherokuと連携していますが、今回はGASを使いますので、LINE botの作成のご参考にしてください。

* 次に今回はGoogle App Scriptを使用します。選んだ理由はトリガーがついて便利だからです。
この次に、LINEには個人、グループそれぞれにIDというものが紐づいています。
botを友達登録さえしていれば、その個人やグループにメッセージを送信することができます。

ということで送りたいグループのIDを取得しましょう！

https://cyuraharuto.com/gas-line-gid-get/

こちらの方のを見てやるとスムーズかと思います。

私は下記

https://blog.taka73.net/2020/12/23/line-messaging-api-line-bot/

こちらを参考にさせていただきました。

一応、私の方でも上記のサイトの手順をお伝えしておきたいと思います。

##### 1. LINE botの登録、追加
これは上記に記載してあるので 飛ばします。

##### 2. グループIDの取得
* まずは白紙のグーグルスプレッドシートを開きます。
* 次に、ツールボタン→スクリプト エディタボタンを押します。
* サイトに記載している通りにコードを書きます
* その後、デプロイをします。

#### ここで注意!

おそらくここのデプロイでなんらかのエラーが出ると思います。

"ポップアップとリダイレクトの設定を変更してください"

と私は出ました。
* あと、デプロイする際、下記のようにアプリのアクセス範囲を"全員"にしないとLINEのWebhookが通りませんので注意してください。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1936739/ee3476c5-b079-1121-3a49-d54ffae61630.png" width=70%>


##### 3. webhookの登録
* LINE Messaging APIでwebhookを登録しましょう。
* 先ほどデプロイが完了した際に出た、httpsのURLを貼り付けましょう。
* その後、検証ボタンを押すのですが、
アプリのアクセス範囲を制限している方はここで403エラー?が出たと思います。
正しい動作は下記のように「成功」と出るはずです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1936739/e45a877b-a563-f0e3-4de0-02925ef541fb.png" width=65%>



##### 4. スプレッドシートの確認
* その後、botをグループに招待してbot以外の誰かがなんでもいいので文字を送ります。
* そしたらスプレッドシートにIDがインプットされています^^

# 3. プログラムの作成
* 今回はスクレイピングにおいては範囲外なので割愛します。
* yahoo占いからデータ情報を取得し、うお座、みずがめ座の運勢情報をグループラインに送信します。

```js
function myFunction() {
  var url = "https://fortune.yahoo.co.jp/12astro/ranking.html" // Yahoo!占い
  var html = UrlFetchApp.fetch(url).getContentText('euc-jp') // html抽出
  var body_uo = '';
  var body_mi = '';

  //奇数
  var list_odd = Parser.data(html).from('<tr class="st01">').to('</tr>').iterate()
  //偶数
  var list_even = Parser.data(html).from('<tr class="st02">').to('</tr>').iterate()
 
  for(var i=0; i<list_odd.length; i++) {
    //奇数
    results_odd = parse(list_odd[i])
    //うお座抽出
    if (results_odd.indexOf('うお座')!== -1){
      body_uo=results_odd
    //みずがめ座抽出
    }else if(results_odd.indexOf('みずがめ座')!== -1){
      body_mi=results_odd
    }
    //偶数
    results_even = parse(list_even[i])
    //うお座抽出
    if (results_even.indexOf('うお座')!== -1){
      body_uo=results_even
    //みずがめ座抽出
    }else if(results_even.indexOf('みずがめ座')!== -1){
      body_mi=results_even
    }
  }
  sendLINE(body_uo,body_mi);
}


function parse(contents) {
  //ランクを取得
  var rank = Parser.data(contents).from('<td class="st01">').to('</td>').build()
  rank = Parser.data(rank).from('alt="').to('">').build()
 
  //星座名を取得
  var seiza = Parser.data(contents).from('<p class="seiza">').to('</p>').build()
  seiza = Parser.data(seiza).from('alt="').to('">').build()
 
  //コメントを取得
  var text = Parser.data(contents).from('<p class="ft01">').to('</p>').build()
  text = Parser.data(text).from('">').to('</a>').build();
 
  var results =[rank, seiza, text]
  return results
}


  function sendLINE(body_uo,body_mi){
  var ACCESS_TOKEN = '';
  var url_1 = 'https://api.line.me/v2/bot/message/push';
  var groupID = '';

  var date = new Date();
  var dayOfWeek = date.getDay();
  var dayOfWeekStr = [ "日", "月", "火", "水", "木", "金", "土" ][dayOfWeek];
   if ((dayOfWeekStr=="土") || (dayOfWeekStr=="日")){
     comment='休日やん！！休むぞ〜〜';
   }
   else {
      comment='平日やで、、学校頑張ろう！！';
   }

  month=Utilities.formatDate( date, 'Asia/Tokyo', 'MM');
  day=Utilities.formatDate( date, 'Asia/Tokyo', 'dd');


  UrlFetchApp.fetch(url_1, {
            'headers': {
                'Content-Type': 'application/json; charset=UTF-8',
                'Authorization': 'Bearer ' + ACCESS_TOKEN,
            },
            'method': 'POST',
            'payload': JSON.stringify({
                'to': groupID,
                'messages': [{
                    'type': 'text',
                    'text': '今日は '+month+'月'+day+'日 '+dayOfWeekStr+'曜日やで！！\n' +comment+'\nほな今から星座占い送るで〜',
                }]
            })
        })


  Utilities.sleep(20000)
  
  UrlFetchApp.fetch(url_1, {
    'headers': {
      'Content-Type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer ' + ACCESS_TOKEN,
    },
    'method': 'POST',
    'payload': JSON.stringify({
      'to': groupID,
      'messages':[{
        'type': 'text',
        'text': 'の運勢は・・'+body_uo[0]+'!!!\n'+body_uo[1]+'の方へアドバイス↓ \n『'+body_uo[2] +'』'   ,
      }]
     })
   })
 Utilities.sleep(20000)
   
  UrlFetchApp.fetch(url_1, {
            'headers': {
                'Content-Type': 'application/json; charset=UTF-8',
                'Authorization': 'Bearer ' + ACCESS_TOKEN,
            },
            'method': 'POST',
            'payload': JSON.stringify({
                'to': groupID,
                'messages': [{
                    'type': 'text',
                    'text': 'の運勢は'+body_mi[0]+'!!!\n'+body_mi[1]+'の方へアドバイス↓ \n『'+body_mi[2]+'』'  ,
                }]
            })
        })
}
```

* 上記のソースコードはこちらの[サイト](https://walking-elephant.blogspot.com/2021/11/)を一部引用させていただきました。GASの良い点として、ライブラリなどを共有・使用できるのが良い点ですよね^^

# 4. トリガーの設定

* 次に毎朝定期的に実行してくれるようトリガーを設定しなければいけません。

* 左のタブからトリガーを選択
* トリガーを追加し、時間型を選択
* 指定したい時間帯に設定し、登録

これだけで完成です。
![スクリーンショット 2022-05-14 2.20.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1936739/bc9db2e7-658c-1246-2c1d-bb6a52b2f96d.png)

GUIで操作できて便利ですね〜

これにて完成です！
#### お疲れ様でした！

# 5. おまけ

実際にグループに送られてくるラインはこんな感じです。
応答型もできるので、他にも機能面アップグレードできそうですね。

友人も大満足で^^
※ 電灯が占い師botです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1936739/33ffc381-069d-db7b-49fe-04574debea90.jpeg" width=65%>



# 6. 参考文献


https://teratail.com/questions/143799

https://qiita.com/kanta_yamaoka/items/dd830cf23ff59353824d

https://cyuraharuto.com/gas-line-gid-get/

https://blog.taka73.net/2020/12/23/line-messaging-api-line-bot/

https://walking-elephant.blogspot.com/2021/11/

https://singoro.net/http-status-code/

https://support.google.com/chrome/answer/95472?co=GENIE.Platform%3DDesktop&hl=ja

http://www.googleappsscript.info/2017-07-27/get_now.html