All Articles

RSSフィードで取得したデータを定期的にSlackで通知する

はじめに

RSSはつかっていますか?RSSを使えば、ZennやQiita、その他企業の技術ブログの更新などを受け取ることなどができて便利です。

ただ、毎日見るのにいろんなサイトを行ったり来たりしないとならず、面倒ですよね。 FeedlyやSlackのRSSなどを使えば、まとめて素早くキャッチアップできるようになるのですが、これらのアプリは、情報過多や未対応のサイトがあるなどの辛みがあったようです。

そこで、毎日決まった時間にSlackに様々な技術ブログのリンクを通知してくれるものを勉強がてらGoで作成しました。とりあえず今回はZennのトレンド記事を通知します。

コードの詳細な挙動については詳しく触れないので、ハンズオン的な感覚で参考にしてください。

RSSとは

RSSとは、Really Simple Syndicationの略で、Webサイトやブログなどの情報を配信するための技術のことで、xml形式で記載されています。 エンジニアならば皆見ることがあるであろう、ZennやQiitaやはてなブログなども対応しています。

こちらに様々な技術ブログのRSSがまとめられていたので紹介します。

準備

まずは、botをSlackに追加するためのIncomingURLを取得します。

追加したいチャンネルとワークスペースを選択

https://gyazo.com/98be13a1db7c75f5f8ea93ad8187399c

ソースコード

package main

import (
	"encoding/json"
	"log"
	"net/http"
	"net/url"
	"os"

	"github.com/mmcdole/gofeed"
	"github.com/robfig/cron"
)

type Slack struct {
	Text      string `json:"text"`
	Username  string `json:"username"`
	IconEmoji string `json:"icon_emoji"`
}

func main() {
	//ZennのrssフィードURL
	zenn := "https://zenn.dev/feed"

	fp := gofeed.NewParser()
	feed, _ := fp.ParseURL(zenn)

	items := feed.Items

	IncomingURL := '{取得したIncomingURL}'

	c := cron.New()
	c.AddFunc("0 22 * * *", func() {
		params := Slack{
			Text:      "今日のトレンド記事です!!",
			Username:  "Zenn bot",
			IconEmoji: ":zenn:",
		}
		jsonparams, _ := json.Marshal(params)
		resp, _ := http.PostForm(
			IncomingURL,
			url.Values{"payload": {string(jsonparams)}},
		)
		defer resp.Body.Close()
	})
	c.AddFunc("0 22 * * *", func() {
		for i, _ := range items {
			params := Slack{
				Text:      "「" + items[i].Title + "」" + "\n" + items[i].Link + "\n" + "---------------------------------------",
				Username:  "鉄人28号",
				IconEmoji: ":28:",
			}

			jsonparams, _ := json.Marshal(params)
			resp, _ := http.PostForm(
				IncomingURL,
				url.Values{"payload": {string(jsonparams)}},
			)
			defer resp.Body.Close()
		}
	})

	c.Start()
	defer c.Stop()

	select {}
}

すると最終的にはSlackでこのように表示されるようになります。

https://gyazo.com/0d57cabb1bd9ba461693d243b81fb7dd

Slack structを定義し、ここにbotの名前やアイコン、本文を割り当てていきます。 このあたりはいい感じに自分の見やすいようにすればいいと思います。

ちなみにIconEmojiのところはSlackに追加している絵文字のコマンドです。

Cron

また今回はCronを使って毎日決まった時間に自動的に実行されるようにしたいので、robfig/cronを使用しています。 $ go get github.com/robfig/cronを実行しておいてください。

cronの時間指定についてはこちらに詳しく載っています。 私は、22時に通知が来るようにしたので上記のような時間指定をしています。

ここまでできたら、$ go build main.goを実行してバイナリファイルを作成し、それをmacの「ユーザーとグループ -> ログイン項目」に追加しておけば定期的に実行されるようになります。(再起動する必要あり)

おわりに

他のfeedURLをつかえば様々なサイトから記事を引っ張ってこれます。改良していけば、快適に記事をキャッチアップできそうです。

今回作成したRepository

参考