概要
退職エントリって良いですよね。
人生色々ですよね。
作ったもの
退職エントリまとめ
これ自体は、ただのはてなブログです。
退職エントリをあつめる
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 追記
続編書きました。