354
233

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-07-03

概要

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

作ったもの

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

退職エントリをあつめる

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 追記

続編書きました。

354
233
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
354
233

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?