Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

概要

毎日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:

uhooi
iOSアプリ開発とSwiftが好きです✨ 趣味:テニス、アナログゲーム
https://theuhooi.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away