1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Qiita Organizationランキングを社内のチャットワークに通知するGASを作ってみた

Last updated at Posted at 2021-11-18

Qiita OrganizationランキングをChatWorkに通知するスクリプトを作ってみました:muscle:

こちらの記事を参考にチャットワーク風にカスタムさせていただきました

やったこと

/**
 * @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ライブラリを追加してください

スクリプトIDはこちら

スクリーンショット 2021-11-19 4.31.17.png

GASを実行すると以下のようにランキングを通知してくれます!

スクリーンショット 2021-11-19 4.29.50.png

最後に

読んでいただきありがとうございます。
今回の記事はいかがでしたか?
・こういう記事が読みたい
・こういうところが良かった
・こうした方が良いのではないか
などなど、率直なご意見を募集しております。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?