キーワードを指定してTwitterに流れてくるメッセージをSlackに流すGo言語Bot


自社サービスについてのTweetがあったらSlackに通知するというBotを、anacondaというライブラリを使って作成します。
エゴサーチがとっても捗るのでオススメです。

Create New App

Application Managementからアプリケーション追加を行い、以下の認証情報を入手します。

  • Consumer Key
  • Consumer Secret
  • Access Token
  • Access Token Secret

ソースコード

認証情報を使って、以下のように実装します。

twitter_search.go
package main

import(
  "github.com/ChimeraCoder/anaconda"
  "net/http"
  "net/url"
  "fmt"
  "bytes"
  "os"
)

func main() {
  /* 第二引数に検索キーワード(track)を指定 */
  if len(os.Args) != 2 {
    fmt.Print("track not specified!\n")
    os.Exit(1)
  }
  var track string = os.Args[1]

  /* 認証情報を設定 */
  anaconda.SetConsumerKey("REPLACE_WITH_CONSUMER_KEY")
  anaconda.SetConsumerSecret("REPLACE_WITH_CONSUMER_SECRET")
  api := anaconda.NewTwitterApi("REPLACE_WITH_ACCESS_TOKEN", "REPLACE_WITH_ACCESS_TOKEN_SECRET")

  /* フィルタリング条件を指定してstreamを取得 */
  v := url.Values{}
  v.Set("track", track)
  twitterStream := api.PublicStreamFilter(v)

  /* streamから入力があり次第処理 */
  for {
    x := <-twitterStream.C
    switch tweet := x.(type) {
    case anaconda.Tweet:
      /* Tweetの場合はSlackに通知(webhookのURIに対してPOST) */
      jsonStr := `{"text":"https://twitter.com/` + tweet.User.ScreenName + `/status/` + tweet.IdStr + `/","icon_url":"` + tweet.User.ProfileImageUrlHttps + `","username":"` + tweet.User.Name + `"}`
      req, _ := http.NewRequest(
        "POST",
        "https://hooks.slack.com/services/REPLACE_WITH_WEBHOOK_URI",
        bytes.NewBuffer([]byte(jsonStr)),
      )
      req.Header.Set("Content-Type", "application/json")

      /* POST実行 */
      client := &http.Client{}
      resp, err := client.Do(req)
      if err != nil {
        fmt.Print(err)
      }
      defer resp.Body.Close()

    case anaconda.StatusDeletionNotice:
      // pass
    default:
      fmt.Printf("unknown type(%T) : %v \n", x, x)
    }
  }
}

anacondaはgo getする必要があります。

$ go get github.com/ChimeraCoder/anaconda

実行

hello等のよくTweetされそうな単語で実行すると検証しやすいです。

$ go run twitter_search.go '検索キーワード'

参考URL

golang + anacondaでTwitter Streamimg APIを使う