/*Google AdSense自動広告*/

2021年9月1日水曜日

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

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

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


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


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

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

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

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

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


GASスクリプト

main.gs


function pullHeadlineAndSend() {
  var url = 'http://www.data.jma.go.jp/developer/xml/feed/extra.xml';
  var xml = UrlFetchApp.fetch(url).getContentText();
  var xmlDoc = XmlService.parse(xml);
  var rootDoc = xmlDoc.getRootElement();
  
  var nsDefault = XmlService.getNamespace("", 'http://www.w3.org/2005/Atom');
   
  var entries = rootDoc.getChildren("entry", nsDefault);
  
  var length = entries.length;
  
  var currentDate = new Date().getTime();
  
  var title, updated, date, author, content;
  var headlines = "";
  // 最長で10分後に更新される
  var past10Min = 10 * 60 * 1000;
  
  // 10分以内に更新された東京都の気象警報のみ取得
  for(var i=0; i < length; i++) {
  
    title = entries[i].getChildText("title", nsDefault);
    author = entries[i].getChild("author", nsDefault).getChildText("name", nsDefault);
    content = entries[i].getChildText("content", nsDefault);

    updated = entries[i].getChildText("updated", nsDefault);
    date = new Date(updated).getTime();
    if(currentDate - date > past10Min) continue;

    if(title.indexOf("気象警報・注意報") != -1 && author === "仙台管区気象台" && content.indexOf("宮城県") != -1 ){
      headlines += Utilities.formatString('[%s]\n%s\n%s\n', title, toLocalDate(updated), content);
    }
   
  }
  
  if(headlines !=="")
  {
    sendPushMessage(headlines);
    Logger.log(headlines);
  }
}

function toLocalDate(dateString)
{
  var date = new Date(dateString);
  var formattedDate = Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy年M月d日 HH時');
  return formattedDate;
}

function testSend()
{
  sendPushMessage('test message');
}


line_functions.gs


const TOKEN = 'got_token_string_ゲットしたトークンの文字列を貼り付け';
 
function sendPushMessage(text) {
  var url = "https://api.line.me/v2/bot/message/broadcast";
  var headers = {
    "Content-Type" : "application/json; charset=UTF-8",
    'Authorization': 'Bearer ' + TOKEN,
  };

  var postData = {
    "messages" : [
      {
        'type':'text',
        'text':text,
      }
    ]
  };

  var options = {
    "method" : "post",
    "headers" : headers,
    "payload" : JSON.stringify(postData)
  };

  return UrlFetchApp.fetch(url, options);
}


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

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

0 件のコメント:

コメントを投稿