読者です 読者をやめる 読者になる 読者になる

Facebook JSON取得、RSS作成

imabari.hateblo.jp
IDとアクセストークンを取得
Facebook Developers
https://developers.facebook.com/

アクセストークンの有効期限確認
https://developers.facebook.com/tools/debug
Expiresに有効期限

extend access tokenをクリックすると60日間有効になる。

facebook.gsを作成

function facebook() {

  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.clear();

  var row = 1;

  var message, title;

  var page_id = [
    '1581803415398707', //今治市
    '529355933789876', //しまなみアースランド・今治自然塾
    //    '451654508329008',  //愛顔つなぐえひめ国体今治市実行委員会
    //    '846734798739895',  //今治市海事都市推進室・ 今治市海事都市交流委員会
    '1584197405165144', //今治市勤労青少年ホーム
    '315810218457131', //FM Radio BariBari
    '552863164757010', //公益社団法人今治地方観光協会
    '552863164757010', //今治市民のまつり「おんまく」
    '101284090065667' //FC今治
  ];

  var url = 'https://graph.facebook.com/v2.3/';
  var access_token = 'アクセストークン入力';
  for (var i = 0; i < page_id.length; i++) {

    Logger.log(url + page_id[i] + '/feed?access_token=' + access_token);

    var result = UrlFetchApp.fetch(url + page_id[i] + '/feed?access_token=' + access_token);

    var json = result.getContentText();
    var data = JSON.parse(json);

    for (var j = 0; j < 10; j++) {

      if (data.data[j].message) { 
        message = data.data[j].message.replace(/(^\s+)|(\s+$)/g, '');
        title = message.split("\n");
        sheet.getRange(row, 1).setValue(title[0]);

      } else {
        message = 'なし';
        title = data.data[j].from.name;
        sheet.getRange(row, 1).setValue(title);
      }

      sheet.getRange(row, 2).setValue(data.data[j].actions[0].link);
      sheet.getRange(row, 3).setValue(data.data[j].created_time);
      sheet.getRange(row, 4).setValue(message);

      row++;
    }
    sheet.sort(3, false);
  }
}

facebook関数をトリガーに登録


imabari.hateblo.jp
を参考に作成


rssTemplate.htmlを作成

<rss version="2.0"
 xmlns:content="http://purl.org/rss/1.0/modules/content/"
 xmlns:dc="http://purl.org/dc/elements/1.1/">

<channel>
 <title><?= getSpreadSheetTitle() ?></title>
 <link><?= getSpreadSheerLink() ?></link>
 <description />
 <?
 for(var i=0;i<50;i++){
 if(!getRowData(i)[1]) continue;
 ?>
 <item>
 <title><?= getRowData(i)[0] ?></title>
 <link><?= getRowData(i)[1] ?></link>
 <pubDate><?= getRowDate(i) ?></pubDate>
 <dc:creator>ore</dc:creator>
 <category />
 <description><?= getRowData(i)[3] ?></description>
 </item>
 <? } ?>
</channel>

</rss>

server.gsを作成

var spreadSheetId = "シートID";
var spreadSheet;
var range;

function doGet() {
 // スプレッドシート取得
 spreadSheet = SpreadsheetApp.openById(spreadSheetId);
 
 // 50x4セルのデータを一度に取得しておく
 range = spreadSheet.getSheetByName('Reader').getRange(1, 1, 50, 4);
 
 // テンプレート呼び出し(rssTemplate.html)
 var output = HtmlService.createTemplateFromFile('rssTemplate');
 var result= output.evaluate();
 
// コンテントタイプ指定
 return ContentService.createTextOutput(result.getContent()).setMimeType(ContentService.MimeType.XML);
}

// 行データ取得
function getRowData(rowNum){
  return range.getValues()[rowNum];
}

// 日付取得
function getRowDate(rowNum){
  var text = range.getValues()[rowNum];
  var date = new Date(text[2].substr(0,19).replace('T',' ').replace(/-/g,'/'));

  return Utilities.formatDate(date, 'JST', 'EEE, d MMM yyyy HH:mm:ss Z');
}

// シートのタイトル取得
function getSpreadSheetTitle(){
  return spreadSheet.getName();
}

// シートのリンク取得
function getSpreadSheerLink(){
  return spreadSheet.getUrl();
}

ウェブアプリケーションに登録

v2.4だと記事のURLも取得できない。
feedで取得できるのmessageとcreated_timeだけ
まだしばらくはv2.3使えるのでいいけどFacebookFacebook以外から見せたくないのかな?

指定された URL に送信されているトラフィックの量が多すぎるため、UrlFetch に失敗しました。
とエラーがでて取得できなくなった。