つくりおき

スタートアップで働くWebエンジニアのブログ

slackにyoutubeのチャンネル登録者数やtwitterのフォロワー数を通知する

趣味のVのやつでslackにyoutubeのチャンネル登録者数とかtwitterのフォロワー数やらを通知するやつを実装したのでメモ。
今回はNode.js + AWS Lambda + slack Incoming Webhookを使って実装。AWSアカウントはLambdaでバッチスクリプトを実行させるだけになってきたな…。

Youtubeのチャンネル登録者数、総再生回数を通知

APIキー取得

こちらを参照してAPIキーを取得する
承認の認証情報を取得する  |  YouTube Data API (v3)  |  Google Developers

slack Incoming webhookからエンドポイントを取得

ここにYoutube, TwitterAPIから取得した数値をPOSTしてやる
参考にしました qiita.com

チャンネル登録者数を取得しslackに通知

GET https://www.googleapis.com/youtube/v3/channels で取得する
ドキュメント⇒ Channels: list  |  YouTube Data API (v3)  |  Google Developers

チャンネルの統計情報が欲しかったのでpartには statistics を指定

const request = require('request')

module.exports.handler = () => {
  const options = {
    method: 'GET',
    url: 'https://www.googleapis.com/youtube/v3/channels',
    qs: {
      part: 'statistics',
      id: 'XXXXXXXXXXXXXXXXXX',
      key: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXX'
    } 
  }
  
  // 上記設定値でyoutubeからチャンネル登録者数、総再生回数を取得
  request(options, function (error, response, body) {
    if (error) throw new Error(error)
  
    const data = JSON.parse(body)
    const subscriberCount = data.items[0].statistics.subscriberCount
    const viewCount = data.items[0].statistics.viewCount
    
    // slackに通知
    request.post({
      uri: 'https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXX',
      headers: { 'Content-Type': 'application/json' },
      json: {
        text: `チャンネル登録者数: ${subscriberCount}\n総再生回数: ${viewCount}回`
      }
    }, function(error, response, body) {
      if (!error && response.statusCode === 200) {
        console.log(body)
      } else {
        console.log('error')
      }
    })
  })
}

いつも自分はこういう時Postmanから好きな言語のソースコードを出力している。
Node.jsだとrequestモジュール使うのがおすすめ
Generate code snippets | Postman Learning Center

後はAWS Lambdaの関数として配置して毎日実行されるようにCloud Watch eventをトリガーとして設定すればOK

Twitterのフォロワー数を通知

TwitterAPIキーを取得

参考にしました qiita.com

フォロワー数を取得しslackに通知

楽そうだったのでtwitterのライブラリを使用した
GET /users/showTwitterのscreen_nameから情報を取得する
GET users/show — Twitter Developers

const Twitter = require('twitter')
const request = require('request')

module.exports.handler = () => {
    const client = new Twitter({
        consumer_key: '最近',
        consumer_secret: '趣味で',
        access_token_key: 'Vtuber作ってるので',
        access_token_secret: '動画編集できるようになってきた'
    })

    const params = { screen_name: 'realDonaldTrump' }
    client.get('users/show', params, (error, user) => {
        if (!error) {
            // slackに通知
            request.post({
                uri: 'https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXX',
                headers: { 'Content-Type': 'application/json' },
                json: {
                  text: `${user.name}(${user.screen_name})のフォロワー数は${user.followers_count}人です`
                }
              }, function(error, response, body){
                if (!error && response.statusCode === 200) {
                  console.log(body)
                } else {
                  console.log('error')
                }
            })
        }
    })
}

所感