🤖Twitter検索の結果をIFTTTとGASでRSS配信

あるいは、スプレッドシートの情報をRSS配信する方法。

動機

Twitterの検索、見たい時に検索、tweetdeckのカラム作成して見たりslackへの投稿、IFTTTのメールダイジェスト機能で事足りるかもしれないが、RSSとして取得した方が見やすく処理しやすい場合も存在する。その場合には野良サービスを使用することになるが有名どころが特に無く、以前使用していたものは突然サービス終了して使えなくなった経験があるので、ある程度枯れていていきなりサービス終了になる危険性が無いものを使用してシステム構築をしておきたい。

プログラムを書くのも構わないが更新する必要が無い物にしておきたい。例えばLambdaのnodeバージョンを更新する手間すら省きたい(超重要)

そうなるとGoogleAppsScriptを使用したRSSの配信 + 自動化処理の定番のIFTTTを使用するのが個人的定番なので設定方法をまとめておく。

設定方法

IFTTTで以下のApplet作成
Twitter「New tweet from search」 => Google sheets「Add row to spreadsheet」

作成されたspreadsheeのGoogleAppsScriptに以下のコードを設定

// 公開 -> ウェブアプリケーションとして導入 -> 「全員(匿名ユーザーも含む)」で公開すること

function doGet() {
  var xml = createXml();
  // xml出力
  return ContentService.createTextOutput(xml)
    .setMimeType(ContentService.MimeType.XML);
}


function createXml() {
  var spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  var channel = createXmlChannel(spreadSheet);
  // 200 + 50 行まで抜き出し、200を超えている分は削除
  var rows = getRowsAndDeleteOdd(spreadSheet, 200, 50);


  for (var i = 0; i < rows.length; i++) {
    var item = createXmlItem(rows[i]);
    channel.addContent(item);
  }


  // rss 2.0形式で整形
  var root = XmlService.createElement('rss')
    .setAttribute('version', "2.0")
    .addContent(channel);


  var document = XmlService.createDocument(root);
  var xml = XmlService.getPrettyFormat().format(document);


  return xml;
}


function getRowsAndDeleteOdd(spreadSheet, count, spanCount) {
  var sheet = spreadSheet.getSheetByName('シート1');
  var range = sheet.getRange(1, 1, count + spanCount, 5);
  var rows = range.getValues();
  rows = rows.filter(function (r) { return r[0]; } );
  rows = rows.reverse();
  if (rows.length > count) {
    var delCount = rows.length - count;
    sheet.deleteRows(1, delCount);
  }
  return rows;
}


function createXmlChannel(spreadSheet) {
  var channel = XmlService.createElement('channel');


  channel.addContent(XmlService.createElement('title').setText(spreadSheet.getName()));
  channel.addContent(XmlService.createElement('link').setText(spreadSheet.getUrl()));
  channel.addContent(XmlService.createElement('language').setText('ja'));
  return channel;
}


function createXmlItem(row) {
  // IFTTTからの出力形式に合わせて変更
  var date = row[0];
  var title = row[1];
  var desc = row[2];
  var link = row[3];


  var item = XmlService.createElement('item');


  item.addContent(XmlService.createElement('title').setText(title));
  item.addContent(XmlService.createElement('link').setText(link));
  item.addContent(XmlService.createElement('description').setText(desc));
  item.addContent(XmlService.createElement('pubDate').setText(date));


  return item;
}

IFTTTのspreadsheetの制約は2000行を超えると新しいスプレッドシートが作成されてしまうので、200行を超えた段階で古いものから削除していく実装にしている。

あとはGoogleAppsScriptのメニューから

  1. 公開
  2. ウェブアプリケーションとして導入
  3. 「全員(匿名ユーザーも含む)」で公開

を実行して外部アクセスができるようにすれば完了です。生成されたURLをRSSリーダー等に食わせれば勝手に取得されるでしょう。feedlyから読み込みできるのも確認しました。

投稿者: soramugi

#立川 #ラジオ #electron #WordPress #JavaScript #NodeJS #VueJS #Ruby #Rails #PHP #Symfony #Ubuntu #MySQL #文鳥飼い #インフラ #Jenkins

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中