Qiita
JavaScript
GoogleAppsScript
gas
Slack

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

概要

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

スクリーンショット 2018-08-12 10.29.48.png

はじめに

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

スクリーンショット_2018-08-12_10_32_40.jpg

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

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

本記事で説明しないこと

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

  • GAS(Google Apps Script)
  • Slack Incoming Webhooks

実装

前回と同様にGASで実装します。

Qiita固有の処理

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

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

// ----------------------------------------------------------------------------
// 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('{"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への投稿処理は前回実装したコードをそのまま流用したので省略します。
やはりメソッドを細かく分割すると便利です。

トリガーの設定

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

スクリーンショット_2018-08-12_12_49_46.jpg

おわりに

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

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