【Qiita】トレンドの新着のみをSlackに投稿する

## 概要

毎日5:00と17:00の2回、Qiitaのトレンド(新着のみ)をSlackに投稿するbotを作成します。

<img width="541" alt="スクリーンショット 2018-08-12 10.29.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/138245/c506d54a-29f6-ba6e-964e-c2960b4a72f5.png">

## はじめに

私は毎日Qiitaのトレンドをチェックし、興味のある記事があったら読んでいます。
ただ、人気のある記事はしばらくトレンドに残り続けるので、毎日チェックしていると読んだことのある記事ばかりになります。

<img width="1038" alt="スクリーンショット_2018-08-12_10_32_40.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/138245/896eafd7-8796-4051-a384-0f706e5c9260.jpeg">

更新時間と更新頻度、新着マーク(つい最近までなかった気がします)がご丁寧に記載されているので、これは __Qiitaが新着トレンド投稿botを作りやすくしてくれている__ と直感しました:smirk:

以上の理由より、トレンドの新着のみをSlackに投稿するbotを作成したので、その手順を紹介します。

## 本記事で説明しないこと

以下について説明すると長くなるため、本記事では説明しません。

- GAS(Google Apps Script)
- Slack Incoming Webhooks

## 実装

[前回と同様](https://qiita.com/uhooi/items/08828a82a30173d0286d)にGASで実装します。

### Qiita固有の処理

`https://qiita.com/trend` のソースを見ながら、前回実装したコードを参考に実装します。
例によってゴリゴリにスクレイピングしています。

`QIITA_INCOMING_URL` には自分のSlack Incoming Webhooksを代入してください。

```js
// ----------------------------------------------------------------------------
// Post Qiita New Trends
//
// QiitaのトレンドをSlackに通知する(新着のみ)
// 参考：https://qiita.com/trend
// ----------------------------------------------------------------------------

var QIITA_INCOMING_URL = 'https://hooks.slack.com/services/…'
var QIITA_BASE_URL = 'https://qiita.com'
var QIITA_TRENDS_URL = 'https://qiita.com/trend'
var QIITA_COLOR = '#5ac300'

function postQiitaNewTrends() {
  var attachments = makeQiitaAttachments(QIITA_TRENDS_URL, true)
  var text = 'Qiitaのトレンドです。\nnew：' + attachments.length + '件'
  postSlack(QIITA_INCOMING_URL, 'qiita', 'Qiitaトレンド新着通知bot', ':qiita:', text, attachments)
}

function makeQiitaAttachments(url, isOnlyNewArrival) {
  var attachments = []
  var html = UrlFetchApp.fetch(url).getContentText()
  var items = Parser.data(html).from('{&quot;followingLikers').to('}}}').iterate()
  for (var i = 0; i < items.length; i++) {
    var isNewArrival = items[i].match(/isNewArrival&quot;:(.+?),/)[1]
    if (isOnlyNewArrival && isNewArrival == 'false') {
      continue
    }
    var createdAt = items[i].match(/createdAt&quot;:&quot;(.+?)&quot;,/)[1]
    var likesCount = items[i].match(/likesCount&quot;:(.+?),/)[1]
    var title = items[i].match(/title&quot;:&quot;(.+?)&quot;,/)[1]
    var uuid = items[i].match(/uuid&quot;:&quot;(.+?)&quot;,/)[1]
    var profileImageUrl = items[i].match(/profileImageUrl&quot;:&quot;(.+?)&quot;,/)[1]
    var urlName = items[i].match(/urlName&quot;:&quot;(.+?)&quot;/)[1]
    var link = QIITA_BASE_URL + '/' + urlName + '/items/' + uuid
    attachments.push(makeQiitaAttachment(isNewArrival, createdAt, likesCount, title, profileImageUrl, urlName, link, i))
  }
  return attachments
}

function makeQiitaAttachment(isNewArrival, createdAt, likesCount, title, profileImageUrl, urlName, link, i) {
  return makeAttachment(QIITA_COLOR,
                        'No.' + (i + 1),
                        title,
                        link,
                        profileImageUrl,
                        makeQiitaFields(isNewArrival, createdAt, likesCount, urlName))
}

function makeQiitaFields(isNewArrival, createdAt, likesCount, urlName) {    
  return [makeField('投稿者', urlName, true),
          makeField('投稿日', createdAt, true),
          makeField('いいね', likesCount, true),
          makeField('new', isNewArrival, true)]
}
```

`postQiitaNewTrends()` メソッドを実行することでQiitaのトレンドがSlackに投稿されます。

`makeQiitaAttachments()` メソッドの第2引数を `false` にすることで、新着以外のトレンドも全て投稿されるようにできます。

### Slack通知処理

Slackへの投稿処理は[前回実装したコード](https://qiita.com/uhooi/items/08828a82a30173d0286d#slack通知処理)をそのまま流用したので省略します。
やはりメソッドを細かく分割すると便利です。

## トリガーの設定

「毎日5/17時に更新」と記載されているので、その時間にスクリプトが実行されるようにトリガーを設定します。

<img width="861" alt="スクリーンショット_2018-08-12_12_49_46.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/138245/c59ccd1e-cfa4-46c1-a194-37e0e0dd2ac0.jpeg">

## おわりに

これで新着を見逃さずにQiitaから技術動向を把握することができます:relaxed:

いつか私が投稿した記事もこのbotで通知される日が来るといいなぁ…:envelope_with_arrow: