Edited at

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


概要

退職エントリって良いですよね。

人生色々ですよね。


作ったもの

退職エントリまとめ

これ自体は、ただのはてなブログです。


退職エントリをあつめる

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

続編書きました。