Help us understand the problem. What is going on with this article?

退職エントリを毎日自動で集めるBlogを作った

More than 1 year has passed since last update.

概要

退職エントリって良いですよね。
人生色々ですよね。

作ったもの

退職エントリまとめ
これ自体は、ただのはてなブログです。

退職エントリをあつめる

cheerio-httpcliで、タイトルに「退職しました」や、「退職します」が付いてるサイトのURLを
Google検索結果から集めます。

const client = require('cheerio-httpcli');

// "退職しました"を検索する。"&tbs=qdr:d"を付与すると24時間以内の検索になる。
const BASE_URL_GOOGLE =
  'https://www.google.com/search?q=%22%E9%80%80%E8%81%B7%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%22&tbs=qdr:d&start=';

// はてブなど、除外したいサイトを登録しておく。
const IGNORE_SITES = [
  'https://b.hatena.ne.jp/',
  'https://newstopics.jp/',
];

// 退職エントリとみなすキーワードを持たせておく。
const RETIREMENT_WORDS = ['退職します', '退職しました'];

const includesIgnoreSites = value => IGNORE_SITES.some(_ => value.includes(_));

const includesRetirementWords = value =>
  RETIREMENT_WORDS.some(_ => value.includes(_));

const getEntries = async () => {
  const retirementEntries = [];
  for (let i = 0; ; i += 10) { // 検索結果10件ずつを取得
    const res = await client.fetch(`${BASE_URL_GOOGLE}${i}`);
    const contents = res.$('div.r > a > h3');
    if (contents.length === 0) {
      // 検索結果が無くなったら終わり
      break;
    }
    contents.each((index, elm) => {
      const url = elm.parent.attribs.href;
      const title = elm.childNodes[0].data;
      if (!title) {
        return;
      }
      if (!includesIgnoreSites(url) && includesRetirementWords(title)) {
        retirementEntries.push({ url: url, title: title });
      }
    });
  }
  return retirementEntries;
};

はてなブログAPIで投稿する

APIの説明はここに載ってるので割愛。
axiosを使ってPOSTしてみます。

const axios = require('axios').default;

const postBlog = async entries => { // さっき取得したエントリ情報を引数に
  const title = `${new Date().toLocaleDateString()}の退職エントリ`;
  let content = '';
  for (const entry of entries) {
    if (content !== '') {
      content += '\r\n';
    }
    content += `[${entry.url}:embed:cite]`; // はてなのカード形式で出るようにする。
  }
  if (content === '') {
    return;
  }
  const data = `<?xml version="1.0" encoding="utf-8"?>
  <entry xmlns="http://www.w3.org/2005/Atom"
         xmlns:app="http://www.w3.org/2007/app">
    <title>${title}</title>
    <content type="text/x-markdown">
${content}
    </content>
  </entry>`;

  await axios.post(
    'https://blog.hatena.ne.jp/{はてなID}/{ブログID}/atom/entry',
    data,
    { auth: { username: /* はてなID */, password: /* APIキー */ } }
  );
};

自動投稿する

上記のコードをGoogle Cloud Functionsに登録して、毎日1回定期実行すればOK。
こんな記事ができます。

良いですね。

2019/7/5 追記

続編書きました。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away