オムライスの備忘録

数学・統計学・機械学習・プログラミングに関することを記す

【ライフハック】はてなブログの記事一覧をGoogle Sheets へ自動で書き出したい (GAS)

モチベーション

はてなブログの一覧を Google Sheets で管理したいと欲求が込み上げてきました. 手動で現在投稿した記事を Sheets にコピペして、新しい記事を書くたびに追加する運用も考えましたが、少し面倒そうです. そこで GAS で簡単にできたらいいなと思い作ってみました.

処理の流れ

  1. スプレッドシート の更新をトリガーにGAS を起動
  2. GAS がはてなブログ記事一覧を取得(AtomPub を使って、XML形式でデータを取得します)
  3. GAS でXMLからブログタイトル一覧を取得
  4. GAS で Sheets 書き込み

作業内容

  1. はてなブログから API key を取得
  2. Google Sheets を作成
  3. Sheets に紐付いた GAS を作成
  4. GAS でコーディング (API key を使用)
  5. GAS のトリガーを設定

はてなブログから API key を取得

はてなブログが提供している API を利用するために、はてなブログの設定から API key を取得します. [設定] → [詳細設定] → [AtomPub] から取得できました.

www.kotanin0.work (ほとんどこのサイトを参考にさせていただきました)

Google Sheets を作成

サイト一覧の情報を書き出す Sheets を作成します.

このとき、書き出す先のシートの idシート名をメモしてください. GAS のコーティングのときに使用します.
シートのid を Sheets の URL の以下の部分です.

https://docs.google.com/spreadsheets/d/sheet_id


シート名はシートを作成すると下にあるタブの名前です.

Sheets に紐付いた GAS を作成

「ツール」 -> 「スクリプト エディタ」を選択し、GAS を作成します.

GAS でコーディング

メインの関数 1 つ(HatenaListGet)と、部分的な関数 4 で構成してみました.

  • XML からブログタイトルを取得する関数 : getTitles
  • XML から次の URL を取得する関数 : getNextURL
  • API を使って、XML を取得する関数 : getXML
  • 取得したブログ一覧を Sheets へ書き込む関数 : setContents


(基本コードをベタばりで動くと思います. 記入箇所を埋めていれば)


function getTitles(xml) {
  var entries = Parser.data(xml).from('<title>').to('</title>').iterate();

  // ブログタイトルを除く
  var blog_title = entries.shift();

  return entries
}
function getNextURL(xml) {
  var url = Parser.data(xml).from('<link rel="next" href="').to('" />').build();

  if (url.slice(0,4) != "http"){
    var url = "Nothing"
  }
  return url
}

ここで、はてなのユーザID と API Key を使います.

function getXML(url) {
  // はてなのユーザID、APIキー
  const user = 'xxx';
  const apiKey = 'xxx';
  // リクエストヘッダの準備
  const options = {
    'method' : 'GET',
    'headers' : {'Authorization' : 'Basic ' + Utilities.base64Encode(user + ':' + apiKey)}
  }  
  // xml形式で返却される
  var xml = UrlFetchApp.fetch(url, options).getContentText();

  return xml
}

ここで、sheets id とシート名を使います. sheet の中のどこの部分に書き出すかを変更する場合は、この関数をいじれば変えれます.

function setContents(contentList){
  var contentLength = contentList.length;

  var spreadsheet_id = 'xxx';
  var sheet_name = 'xxx';

  var spreadsheet = SpreadsheetApp.openById(spreadsheet_id);
  var sheet = spreadsheet.getSheetByName(sheet_name);

  var count = 2;
  contentList.forEach(function(content){
    sheet.getRange("A"+String(count)).setValue(content);
    count += 1;
  });
}

AtomPub へアクセスするためのURL は以下を参考に作ってください.

https://blog.hatena.ne.jp/{はてなID}/{ブログID}/atom/entry
function HatenaListGet() {
  // ルートエンドポイント
  var url = 'xxx';

  var ended = false;
  var contentList = [];
  while (!ended) {
    var xml = getXML(url)

    var entries = getTitles(xml);
    contentList = contentList.concat(entries);

    url = getNextURL(xml);
    console.info(url)

    if (url == "Nothing") {
      break
    }
  }
  contentList = contentList.reverse();
  console.info(contentList)
  setContents(contentList);
}

GAS のトリガーを設定

GAS のトリガーを設定します.

「トリガー」-> 「トリガーを追加」を選択し、関数やソース、イベントの種類を選択します.(ほとんど、デフォルトでいけそうです)

まとめ

  • 今回は、GAS を使ってはてなブログ一覧を取得し、Sheets に書き出しました.
  • XML からの情報抽出を調整すれば、ブログ URL (タイトルではなく)を取得できそうでした.