前提
僕の所属している会社では、Qiita Organizationに企業登録してます。理由としては、アウトプットの奨励であったり、企業ブランディングであったりです。まぁそれは置いといて。
Qiita Organizationで、なにができるかというと、単純に会社に所属しているメンバーを追加することぐらいで、特別な機能があるわけじゃないんですが、社内のエンジニアにQiita投稿を楽しんでやってもらえるキッカケ作りとして取り組んでます。
やりたいこと
というわけで前置きが長くなりましたが、投稿モチベーション維持のため、社内エンジニアのQiita投稿数/獲得ストック数を毎日クロールして、Chatworkのグループに送りつけることで、Qiitaスペックの見える化をしたい。
クロール対象ページ
使うもの
- kimono https://www.kimonolabs.com/
- PHP
- Chatwork API
kimonoを使って、WebページをAPI化
一番面倒くさいの、ページから各ユーザ名と数値を取得する部分。だけど、今はkimonoっていう凄いやつがいるので使ってみます。こいつは、指定したWebページを勝手にクロールして、JSON形式とかでリクエストできるAPI化してくれちゃいます。便利。
ブックマークレットで該当ページを編集
言葉で説明すると、なんか面倒っぽいけど、実際は5分もかからずいけます。
該当ページでブックマークレットを実行し、編集画面にします。
ユーザ名のリストがほしいので、ユーザ名の場所をおもむろにクリックします。ユーザ名の箇所全体が黄色にマーキングされるので、チェックアイコンをクリックして、全要素を追加してください。左上が要素の数表示されます。
そして左上に「user」というプロパティ名を入力します。
今度は、右上の「+」ボタンを押して新しいフィールドを設定します。
続いて、投稿数とストック数を同様にクリックします。あとは保存すればOK。クロールするタイミングも柔軟に設定可能。今回は1日に1回にしました。
PHPでAPIアクセスして、chatworkのAPIで投稿
本当はHerokuとかでやりたかったんですが、計画実行のクレカ登録とか面倒だったので、余っているサーバのcrondで動かすことにしました。超絶面倒くさいので、色々糞なコードですが。
<?php
// kimonoで作ったAPIのURL
$uri = 'https://www.kimonolabs.com/api/example?apikey=hogehoge';
$json = json_decode(file_get_contents($uri));
// Chatworkに投稿するためのメッセージ作成
$message = <<<EOM
[info][title]今日のQiita[/title]
今日のQiitaの投稿数とストック数だよ。
EOM;
$topStock = 0;
$topUser = '';
foreach ($json->results->collection1 as $val) {
$val->stock = htmlentities($val->stock, null, 'utf-8');
list($posts, $stock) = explode('|', str_replace(array(' ', ' ', 'posts', 'post', 'stocked', "\n"), "", $val->stock));
$message .= $val->user->text . " : " . $posts . "投稿 / " . $stock . "ストック\n";
if ($topStock < $stock) {
$topStock = $stock;
$topUser = $val->user->text;
}
}
$message .= <<<EOM
現時点のトップは、{$topUser}です
[/info]
EOM;
system('curl -X POST -H "X-ChatWorkToken: 【ChatworkのAPIキー】" -d "body=' . $message . '" "https://api.chatwork.com/v1/rooms/【ルームID】/messages"');
これで、指定チャットにたいして投稿できます。あとはcrondで1日1回設定すればOK。