背景
- エンジニアチーム全体にQiitaへの投稿を促す施策を考えてた
- そうこうしているうちに、みんなが投稿しまくったら、QiitaのOrganization一覧ページで1位を獲得
- 沸き立つエンジニア。
このモチベーションを続けさせたい!
ということで、
- Webサービスと同じで、モニタリングしていく(見える化していく)ことで現在地がわかる
毎日QiitaのOrganization一覧ページの上位20位までをSlackに通知して見える化だ!!
思い立ったが吉日、早速作業に取り掛かる。
最近、Googleスプレッドシート×Google Apps Script(GAS)の組み合わせがお気に入りなので、スクレイピングできないかなーと思って調べてみた。
第一関門は、Webページの要素をGoogleスプレッドシートに落とすこと!!
Googleスプレッドシートの編集
そう、importxml
関数を使えば、スクレイピングもできちゃいます。
- A2
1
- B2
=importxml("https://qiita.com/organizations","//*[@id='main']/div/div/div[1]/ul/li["&$A2&"]/div[2]/h2/a")
- C2
=importxml("https://qiita.com/organizations","//*[@id='main']/div/div/div[1]/ul/li["&$A2&"]/div[2]/h2/a/@href")
- D2
="https://qiita.com"&C2&"/activities"
※ importxml
関数の説明は この記事 を参考にした。
上記の数式を入力すると、
スプレッドシートに表示されのは下記のような表となる。
そして、Googleスプレッドシートの内容を、Slackに通知
-
Incoming WebHooksを有効にする
https://slack.com/services/new/incoming-webhook -
Webhook URLをコピーしておく
-
スプレッドシートの「ツール」>「スクリプトエディタ」を開く
-
スクリプトエディタにソースコードを記載する&トリガーを設定する
var slackUrl = "https://hooks.slack.com/services/aaaaaaaa/bbbbbbbb/xxxxxxxxxxxxxxxxxxxxx"; // 手順2でコピーしたURL
var username = 'Qiita Organization一覧'; // Slack通知のユーザー名を上書き
var icon = ':qiita:'; // Slack通知のアイコン画像を上書き
function postSlack(payload){
var options = {
'contentType' : 'application/json',
'method': 'POST',
'payload': JSON.stringify(payload),
'muteHttpExceptions' : true
};
var response = UrlFetchApp.fetch(slackUrl, options);
return response;
}
function reportOrganization() {
var ssId = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; // スプレッドシートのURLに含まれてるID
var spreadsheet = SpreadsheetApp.openById(ssId);
var sheet = spreadsheet.getSheetByName("organization");
var range = sheet.getRange(2, 1, sheet.getLastRow() - 1, 4);
var values = range.getValues();
var line = '';
// values[i] は 1行目
// values[i][0] は 1列目
// values[i][1] は 2列目
// values[i][2] は 3列目
// values[i][3] は 4列目
for(var i = 0;i<values.length;i++){
values[i].splice(2, 1);
line += values[i].join(" ") + "\n";
}
var body = {
"text" : line,
"username" : username,
"icon_emoji" : icon
};
var postSlackResponse = postSlack(body);
}
最後にGASを自動実行するトリガーを設定する
- 毎朝「時間主導型タイマー」を使って実行を設定
以上で完了です。
時間が来たら、自動的にSlackに通知が入ります!
毎日、20位以内に入るようにみんな更新してくれるかな~
エンジニアのみんなが楽しみながら、知識の定着や新領域の挑戦がしやすい環境を求めて、これからも色々試してみたいと思います!!