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

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

[こちらの記事を参考にチャットワーク風にカスタムさせていただきました](https://qiita.com/tanaka-kazuki/items/9c41a0e4ce7d395dc9f2)

## やったこと

```
/**
 * @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]"
  });
}

```


## 解説

:::note 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'
  ]
```

:::note info
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]"
  });
```

:::note warn
ChatWorkClientライブラリを追加してください
:::
[スクリプトIDはこちら](https://github.com/cw-shibuya/chatwork-client-gas)

![スクリーンショット 2021-11-19 4.31.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555632/05e28b30-1dd7-eb8f-093c-dd58ae5d4e55.png)

:::note info
GASを実行すると以下のようにランキングを通知してくれます！
:::
![スクリーンショット 2021-11-19 4.29.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555632/2334df14-e4bc-93b3-3fa5-3b63e2432860.png)

## 最後に

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