/*Google AdSense自動広告*/

2021年9月1日水曜日

GASで気象庁XMLをパースしてLINE公式アカウントでブロードキャスト(全員へ送信)する

 LINE公式アカウントを導入検討している自治体などが喜んで、

ソフトベンダーが泣きそうな記事ですが…


基本的に、掲題のことは完全無料でできます


1.LINEチャンネルアクセストークンの取得

ここ、まだ完全に理解していないので、後ほど記事更新しますが、

  • チャンネルアクセストークンv2.1⇒セキュリティ高いが実装難しい
  • 長期のチャネルアクセストークン⇒とりあえずこっちでOK

以下URLを参考に、トークン(文字列)をゲットします。

https://developers.line.biz/ja/docs/messaging-api/channel-access-tokens/


2.GASスクリプト

2-1.main.gs


  1. function pullHeadlineAndSend() {
  2. var url = 'http://www.data.jma.go.jp/developer/xml/feed/extra.xml';
  3. var xml = UrlFetchApp.fetch(url).getContentText();
  4. var xmlDoc = XmlService.parse(xml);
  5. var rootDoc = xmlDoc.getRootElement();
  6. var nsDefault = XmlService.getNamespace("", 'http://www.w3.org/2005/Atom');
  7. var entries = rootDoc.getChildren("entry", nsDefault);
  8. var length = entries.length;
  9. var currentDate = new Date().getTime();
  10. var title, updated, date, author, content;
  11. var headlines = "";
  12. // 最長で10分後に更新される
  13. var past10Min = 10 * 60 * 1000;
  14. // 10分以内に更新された東京都の気象警報のみ取得
  15. for(var i=0; i < length; i++) {
  16. title = entries[i].getChildText("title", nsDefault);
  17. author = entries[i].getChild("author", nsDefault).getChildText("name", nsDefault);
  18. content = entries[i].getChildText("content", nsDefault);
  19.  
  20. updated = entries[i].getChildText("updated", nsDefault);
  21. date = new Date(updated).getTime();
  22. if(currentDate - date > past10Min) continue;
  23.  
  24. if(title.indexOf("気象警報・注意報") != -1 && author === "仙台管区気象台" && content.indexOf("宮城県") != -1 ){
  25. headlines += Utilities.formatString('[%s]\n%s\n%s\n', title, toLocalDate(updated), content);
  26. }
  27. }
  28. if(headlines !=="")
  29. {
  30. sendPushMessage(headlines);
  31. Logger.log(headlines);
  32. }
  33. }
  34.  
  35. function toLocalDate(dateString)
  36. {
  37. var date = new Date(dateString);
  38. var formattedDate = Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy年M月d日 HH時');
  39. return formattedDate;
  40. }
  41.  
  42. function testSend()
  43. {
  44. sendPushMessage('test message');
  45. }


2-2.line_functions.gs


  1. const TOKEN = 'got_token_string_ゲットしたトークンの文字列を貼り付け';
  2. function sendPushMessage(text) {
  3. var url = "https://api.line.me/v2/bot/message/broadcast";
  4. var headers = {
  5. "Content-Type" : "application/json; charset=UTF-8",
  6. 'Authorization': 'Bearer ' + TOKEN,
  7. };
  8.  
  9. var postData = {
  10. "messages" : [
  11. {
  12. 'type':'text',
  13. 'text':text,
  14. }
  15. ]
  16. };
  17.  
  18. var options = {
  19. "method" : "post",
  20. "headers" : headers,
  21. "payload" : JSON.stringify(postData)
  22. };
  23.  
  24. return UrlFetchApp.fetch(url, options);
  25. }


あれ…prettyprintが効かないな…面倒だからこれでいいや!
(たぶんどこかの文字列がひっかかってます。詳しい人教えて…)

これで、function「pullHeadlineAndSend」をGASのタスクで10分毎に実行すればOKです。どんな情報をゲットするかは、条件文で設定します。また、http://www.data.jma.go.jp/developer/xml/feed/eqvol.xml
こちらのURLで地震火山情報をゲットできます。

0 件のコメント:

コメントを投稿