iyuichiの私的開発ログ

渋谷で働くWebエンジニアのログ. Java, Android, iOS, Docker, GCP, AWS, ゲーム開発

はてなブログの過去記事からランダムに抽出した記事をつぶやく方法

今回、サイトマップから取得したURLの中からランダムに選んだ記事のURLとタイトルをTwitterでつぶやくアプリを作って見ました。

最近なんだかNode.js書くのが楽しいのでNode.jsで実装しています。

Nodeクックブック

新品価格
¥3,672から
(2015/4/24 19:34時点)

まず、ソースはGitHubにアップしましたので興味がある方はご覧下さい。

github.com

サイトマップXMLをパースする

まず、はてなブログにはサイトマップXMLが生成されています。 このブログの場合は以下です。

http://iyuichi.hatenablog.jp/sitemap.xml

こいつをパースして記事のURL一覧を取得して適当に選ぶ部分を実装します。 世の中にあるものは基本利用したいのでモジュールを検索してみました。 こいつが使えそう!とおもったので利用して動かしてみました。

hawaiianchimp/sitemap-parser · GitHub

そのままでも実装できないこともなさそうだったのですが、これを実行するとsitemapindexのURL数分コールバックが呼ばれてしまいどうもつかいにくい。。。ということで全体としてここが一番苦労しました。

試したのは以下のようなソースです。

var sitemap = require("sitemapper");
var _ = require('underscore');

sitemap.getSites("http://iyuichi.hatenablog.jp/sitemap.xml", function(err, sites){
    if(!err)console.log(_.size(sites));
    else console.log(error);
});

結果が、

100
200
300
400
500
600
700
800
900
1000
1022
1124
1224

全部入りのコレクションが返ってくる1224のときだけコールバックされるのを期待したのだが。 ということで今回は基本はこのソースのまま直してみることにしました。MIT Licenseなんで問題ないよね?

sitemap.xmlをパースしてURLの一覧を取り出す

もっといい書き方あるだろ!って方はpull requestください。 今回はこれで動いたんで先に進むことにしました。

ランダムに記事を選択する

この機能はunderscore.jsにリストからランダムに値を取り出せるメソッドがあったのでありがたく使わせてもらうことにしまいsた。 よって、記事の人気度とか投稿した日時とか細かい抽出条件は実装していません。

var samples = __.sample(sites, 1);

タイトルを取得する

ランダムに1つのURLを取得できるようになったら、選択されたURLから記事のタイトルを取得します。 この機能には、これが使えました。

ktty1220/cheerio-httpcli · GitHub

var htmlParser = require('cheerio-httpcli');
htmlParser.fetch(url).then(
    function(result){
        console.log(result.$('title').text());
    }
);

こんな感じで簡単にタイトルが取得できました。すばらしい。

Twitterにつぶやく

これ使いました。特に苦労もなくすぐにつぶやくことができました。

desmondmorris/node-twitter · GitHub

ソースは実際に今回実装したものをみていただければすぐわかるかと思います。 Twitterの認証キーは環境変数から取得するようにしていますが、ほかには特に変わったことはしていません。

https://github.com/y16ra/random_tweet_bot/blob/master/bin/index.js

Herokuで動かしてみる

手元の環境で手動で叩くとその度に過去記事から適当につぶやけるところまできました。 そこでHerokuにデプロイしてスケジューラで動かしてみることにします。

この作業をするにあたっては以下のサイトが参考になりました。

Defining Node.js task for Heroku Scheduler - Rafal Spacjer blog

  • デプロイ デプロイ自体はgit pushすればすぐにできます。

Deploying with Git | Heroku Dev Center

$ heroku login
$ heroku create
$ heroic push heroku master
  • 環境変数の設定をします。 自分の場合はこんな感じ。(認証情報は伏せています。)
$ heroku config:set TW_CONSUMER_KEY=xxxxxxxxxxxxxxxx
$ heroku config:set TW_CONSUMER_SECRET=xxxxxxxxxxxxxxxx
$ heroku config:set TW_ACCESS_TOKEN=xxxxxxxxxxxxxxxx
$ heroku config:set TW_ACCESS_TOKEN_SECRET=xxxxxxxxxxxxxxxx
$ heroku config:set SITEMAP_URL=http://iyuichi.hatenablog.jp/sitemap.xml
$ heroku config:set TWEET_PREFIX=過去記事ガチャ:
  • 動作確認 pushしたら動作の確認をしてみます。
$ heroku run bin/index.js
  • スケジューラを追加
$ heroku addons:add scheduler
$ heroku addons:open scheduler

画面で好きな時間に設定できます。表示がUTCなので日本時間は+9:00です。

f:id:iyuichi:20150424192555p:plain

こんな感じでHerokuで動くことも確認できました。 これで明日から1日1回、ランダムで抽出した過去記事がつぶやかれます!

もしよかったら利用していただいて、ソースの改善プルリクもしてもらえたらうれしいです。

y16ra/random_tweet_bot · GitHub

プロフェッショナルのための 実践Heroku入門 プラットフォーム・クラウドを利用したアプリケーション開発と運用 (アスキー書籍)