[GAS]ニコニコ動画の新着動画をお知らせする

ニコニコ動画はユーザーの投稿動画URLの後ろに ?rss=2.0 をつけることでRSSを取得することができる。
これを定期的に見に行ってSlackに通知してくれるものをGASで作った。

準備

Slackにお知らせするのでIncoming Webhookを設定しておく。
グーグルスプレッドシートで新規シートを作っておく。

コード

スプレッドシートから ツール > スクリプトエディタ でエディタを開いて以下をコピペ。
webhook_url には自分のURLを入れる。
エディタの 編集 > 現在のプロジェクトのトリガー からトリガーを設定する。時間主導型にして、何時間置きかにしとけばOK。

var webhook_url = 'https://hooks.slack.com/services/*****';

function myFunction() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
  var values = sheet.getRange('A2:B100').getValues();
  var urls = [];
  var last_videos = [];
  
  values.forEach(function(value){
    if(value[0]){
      urls.push(value[0]);
      if(value[1]) last_videos.push(value[1]);
      else last_videos.push('');
    }
  });
  
  var mess = [];
  
  for(var i=0; i<urls.length; i++){
    Logger.log(urls[i]);
    var items = parse_xml(urls[i]);
    var titles = items['titles'];
    var links = items['links'];
    var value = '';
    
    Logger.log(last_videos[i]);
    
    for(var j=0; j<titles.length; j++){
      Logger.log(links[j]);
      if(links[j] === last_videos[i]) break;
      else value += '<'+links[j]+'|'+titles[j]+'>\n';
    }
    sheet.getRange('B'+(i+2)).setValue(links[0]);
    
    if(value != ''){
      mess.push({
        'fallback':items['user'],
        'pretext':'*'+ items['user'] +'*',
        'fields':[
          {
            'value':value
          }
        ]
      });
    }
  }
  
 if(mess.length > 0) send_mess(mess);
}

function parse_xml(url){
  var xml = UrlFetchApp.fetch(url).getContentText();
  var document = XmlService.parse(xml);
  var dc = XmlService.getNamespace('http://purl.org/dc/elements/1.1/');
  var root = document.getRootElement();
  var items = root.getChild('channel').getChildren('item');

  var user = root.getChild('channel').getChild('creator', dc).getText();  
  var titles = [];
  var links = [];
  for(var i=0; i<items.length; i++){
    var item = items[i];
    titles.push(item.getChild('title').getText());
    links.push(item.getChild('link').getText());
  }
  
  return {'user':user, 'titles':titles, 'links':links};
}

function send_mess(mess){
  var json = {'attachments':mess};
  var data = {
      'method':'post',
      'payload':JSON.stringify(json)
    };
  UrlFetchApp.fetch(webhook_url,data);
}

使い方

使用例
こんな感じで2行目からRSSのURLを書いていく。
lastと書いてある列はプログラム側から追加されるので自分で書く必要はない。