試してみたブログ

AI関連・iPhone/Pixelなどのガジェット・音声入力・サーマルプリンタなど興味をある事をどんどん試してみた際の記録

はてなブログが書いた記事タイトル・URL・投稿日をスプシにまとめる

やりたいこと

ためしてみた

  • 下記変数をGASのスクリプトプロパティに埋め込みます
  • USERNAMEははてなID
  • BLOG_IDはフルのドメイン名(私の場合は tameshitemita.hatenablog.jp となります)
  • APIキーは下記より作成できます。 blog.hatena.ne.jp
  • また作成されたAPIキーは下記より参照できます。設定 > 詳細設定
function getHatenaBlogEntriesAll() {
  var USERNAME = PropertiesService.getScriptProperties().getProperty("USERNAME");
  var BLOG_ID = PropertiesService.getScriptProperties().getProperty("BLOG_ID");
  var API_KEY = PropertiesService.getScriptProperties().getProperty("API_KEY");
  var API_URL = `https://blog.hatena.ne.jp/${USERNAME}/${BLOG_ID}/atom/entry`;
  var headers = {
    'Authorization': 'Basic ' + Utilities.base64Encode(USERNAME + ':' + API_KEY)
  };
  var options = {
    'method': 'get',
    'headers': headers,
    'muteHttpExceptions': true
  };

  var entries = [];
  var url = API_URL;
  while (url) {
    var response = UrlFetchApp.fetch(url, options);
    var xmlContent = response.getContentText();
    var document = XmlService.parse(xmlContent);
    var root = document.getRootElement();
    var atomNS = XmlService.getNamespace('http://www.w3.org/2005/Atom');

    // 記事エントリ抽出
    var entryNodes = root.getChildren('entry', atomNS);
    entryNodes.forEach(function(entry) {
      var links = entry.getChildren('link', atomNS);
      var entryLink = '';
      links.forEach(function(link) {
        if (link.getAttribute('rel') && link.getAttribute('rel').getValue() === 'alternate') {
          entryLink = link.getAttribute('href').getValue();
        }
      });
      var entryData = [
        entry.getChildText('title', atomNS), // タイトル
        entryLink, // URL
        entry.getChildText('published', atomNS) // 投稿日
      ];
      entries.push(entryData);
    });

    // "next"リンク検索(次ページがなければ終了)
    var links = root.getChildren('link', atomNS);
    var nextUrl = '';
    links.forEach(function(link) {
      if (link.getAttribute('rel') && link.getAttribute('rel').getValue() === 'next') {
        nextUrl = link.getAttribute('href').getValue();
      }
    });
    url = nextUrl ? nextUrl : null;
  }
  return entries;
}

function writeTitlesUrlsAndDatesToSheet() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('NewsList');
  sheet.clearContents();
  sheet.getRange(1, 2, 1, 3).setValues([['title', 'link', 'published']]); // B1~D1
  var entries = getHatenaBlogEntriesAll();
  if (entries.length > 0) {
    sheet.getRange(2, 2, entries.length, 3).setValues(entries); // B2~D(…
  }
}

  • 一覧化された物を見ながら偏りがあるなだったり、今度こういうの書こうと思いをはせる。