Qiita OrganizationランキングをChatWorkに通知するスクリプトを作ってみました
こちらの記事を参考にチャットワーク風にカスタムさせていただきました
やったこと
/**
* @summary ChatWorkに通知します
*/
function main() {
let msg = qiitaOrgGet()
sendChatwork(msg)
}
/**
* qiita organizationのスクレイピングと文字列の整形を行う
*/
function qiitaOrgGet() {
//スクレイピングURL 週間・月間
let url = [
'https://qiita.com/organizations?sort=default',
'https://qiita.com/organizations?sort=activity_stats_total'
]
//organizationURL連結用
let orgurl = 'https://qiita.com/organizations/'
//organization名取得用パース文字
let from1 = '<strong class="ol-Item_name" itemprop="name"><a href='
let to1 = '</a></strong><p class="ol-Item_description" itemprop="description">'
//投稿数取得用パース文字
let from2 = '<div class="ol-Item_postNum mr-1of2">'
let to2 = '</div>'
//orgnizaton情報格納用
let orglist = [[''], ['']]
//emoji変換用
let emoji = ['🥇', '🥈', '🥉', '4', '5']
//ChatWork用
let msg = '*Qiita Organization投稿ランキングチェッカー*' + String.fromCharCode(10) + '順位、投稿数、Organization名' + String.fromCharCode(10)
//スクレイピング&データ加工
for (let i in url) {
let html = UrlFetchApp.fetch(url[i]).getContentText()
let name = Parser(html, from1, to1)
let postCnt = Parser(html, from2, to2)
//事後処理
for (let j in name) {
orglist[i].push([i
, name[j].slice(name[j].indexOf('>') + 1)
, orgurl + name[j].slice(name[j].indexOf('s/') + 2
, name[j].indexOf('>') - 1)
, postCnt[j]])
}
}
//ChatWork用にMSG整形
for (let i in orglist) {
for (let j = 1; j <= 5; j++) {
if (i == 0 && j == 1) {
msg = msg + ' _*週間ランキング*_' + String.fromCharCode(10)
} else if (i == 1 && j == 1) {
msg = msg + String.fromCharCode(10) + ' *月間ランキング*' + String.fromCharCode(10)
}
Logger.log(emoji[j - 1])
msg = msg + '順位' + emoji[j - 1] + ' ' + '投稿数' + orglist[i][j][3] + ' ' + orglist[i][j][1] + ' ' + orglist[i][j][2] + ' ' + String.fromCharCode(10)
}
}
Logger.log(msg)
return msg
}
//直前(from)、直後(to)の文字列で囲われたデータを取得する。
function Parser(data, from, to) {
/*
data ・・ パース対象の文字列が含まれるテキストデータ
from ・・ パース対象の文字列の直前のテキストを指定
to ・・ パース対象の文字列の直後のテキストを指定
from,toで囲われた文字を全て検索して配列に格納します。
*/
//初期値
let tmp = []
let tmpindex
let fromindex = data.indexOf(from)
let toindex = data.indexOf(to)
if (fromindex != -1) {
for (let i = 0; i <= data.length; i++) {
//後続あるなし判定
if (toindex == -1 || fromindex == -1)
break;
//from < to なら代入
if (fromindex + from.length < toindex) {
tmp.push(data.slice(fromindex + from.length, toindex))
}
tmpindex = toindex
//後続indexサーチ
fromindex = data.indexOf(from, tmpindex)
toindex = data.indexOf(to, tmpindex + 1)
}
}
return tmp
}
//チャットワークへMSG送信(ChatWorkClient)
function sendChatwork(ToChatWorkMsg) {
//チャットワークへの通知設定
let client = ChatWorkClient.factory({ token: "xxxxx" });
client.sendMessage({
room_id: xxxxxx,
body: "[info][title]Qiita Organization投稿ランキング[/title]\n" + ToChatWorkMsg + "[/info]"
});
}
解説
Qiitaのorganizationsページで週間・月間を切り替えたときに取得できるParamを設定します
週間:?sort=default
月間:?sort=activity_stats_total
//スクレイピングURL 週間・月間
let url = [
'https://qiita.com/organizations?sort=default',
'https://qiita.com/organizations?sort=activity_stats_total'
]
ChatWorkのユーザーTokenをtokenに指定してください
通知するルームIDをroom_idに指定してください
//チャットワークへの通知設定
let client = ChatWorkClient.factory({ token: "xxxxx" });
client.sendMessage({
room_id: xxxxx,
body: "[info][title]Qiita Organization投稿ランキング[/title]\n" + ToChatWorkMsg + "[/info]"
});
ChatWorkClientライブラリを追加してください
GASを実行すると以下のようにランキングを通知してくれます!
最後に
読んでいただきありがとうございます。
今回の記事はいかがでしたか?
・こういう記事が読みたい
・こういうところが良かった
・こうした方が良いのではないか
などなど、率直なご意見を募集しております。