5
Help us understand the problem. What are the problem?

posted at

updated at

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

目次

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

1. 初めに

友達のLINEグループにて

A : 今日の運勢めっちゃ悪いやん
わし : 星座占いなんて子供かよww ちなみにうお座は?
B : スクショほい
わし : うわめっちゃいいやんやった!!!!
A,B : ...
わし : 毎朝LINEに送ってくれるbotあったら便利じゃね?

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

まあ確かに、自動でしてくれたら楽ですよね!

ってことでレッツ作成!

2. 導入

  • 何よりも先に、LINE botを作りましょう!
    それは私が過去に書いた記事をご覧ください。過去の記事はherokuと連携していますが、今回はGASを使いますので、LINE botの作成のご参考にしてください。

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

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

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

私は下記

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

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

1. LINE botの登録、追加

これは上記に記載してあるので 飛ばします。

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

ここで注意!

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

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

と私は出ました。

  • あと、デプロイする際、下記のようにアプリのアクセス範囲を"全員"にしないとLINEのWebhookが通りませんので注意してください。
3. webhookの登録
  • LINE Messaging APIでwebhookを登録しましょう。
  • 先ほどデプロイが完了した際に出た、httpsのURLを貼り付けましょう。
  • その後、検証ボタンを押すのですが、
    アプリのアクセス範囲を制限している方はここで403エラー?が出たと思います。
    正しい動作は下記のように「成功」と出るはずです。
4. スプレッドシートの確認
  • その後、botをグループに招待してbot以外の誰かがなんでもいいので文字を送ります。
  • そしたらスプレッドシートにIDがインプットされています^^

3. プログラムの作成

  • 今回はスクレイピングにおいては範囲外なので割愛します。
  • yahoo占いからデータ情報を取得し、うお座、みずがめ座の運勢情報をグループラインに送信します。
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]+'』'  ,
                }]
            })
        })


}
  • 上記のソースコードはこちらのサイトを一部引用させていただきました。GASの良い点として、ライブラリなどを共有・使用できるのが良い点ですよね^^

4. トリガーの設定

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

  • 左のタブからトリガーを選択

  • トリガーを追加し、時間型を選択

  • 指定したい時間帯に設定し、登録

これだけで完成です。
スクリーンショット 2022-05-14 2.20.27.png

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

これにて完成です!

お疲れ様でした!

5. おまけ

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

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

6. 参考文献

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
5
Help us understand the problem. What are the problem?