LoginSignup
12
14

More than 5 years have passed since last update.

マストドンのタイムラインをgo-mastodon のWebSocketを使用し取得する

Last updated at Posted at 2017-04-24

自己紹介

Qiita初めてです。13年前から日本にいますが、日本生まれではないです。
よろしくお願いします。

はじめに

  • マストドンのインスタンスのログイン情報が必須になります。LOGIN_EMAIL、LOGIN_PASSWORDに入れ替えてください。
  • デモ用としてpawooのAPIを使用しています。

環境

  • OSX/Linux
  • golangインストールされてGOPATHなどが通っている状態

前準備

  • go get github.com/mattn/go-mastodon

  • ClientIDとClientSecretを新規で作りたい場合は以下のスクリプトを実行し、発行された内容と入れ替える。

client_token.sh
MASTODON_HOST=https://pawoo.net
CLIENT_NAME=test
curl -X POST -sS "${MASTODON_HOST}/api/v1/apps" \
  -F "client_name=${CLIENT_NAME}" \
  -F "redirect_uris=urn:ietf:wg:oauth:2.0:oob" \
  -F "scopes=read write follow"

実際のコード

stream.go
package main

import (
    "context"
    "fmt"
    "log"

    m "github.com/mattn/go-mastodon"
)

func main() {
    config := &m.Config{
        Server:       "https://pawoo.net",
        ClientID:     "039223b0337ae9db946f9ad3290a5f5897ab847a67adeffdb95bbfa66b3c6f18",
        ClientSecret: "0b00c0b0e8d5ea34eb6974a971fa2dc3e377a518eeeb970bf880b9204bcff684",
    }

    // 新規のクライアントインスタントを作成
    c := m.NewClient(config)

    // ログインユーザ名とパスワードを入力
    err := c.Authenticate(context.Background(), "LOGIN_EMAIL", "LOGIN_PASSWORD")
    if err != nil {
        log.Fatal(err)
    }

    // WebSocket用のサブインスタンスを作成
    wsc := c.NewWSClient()

    // 第2引数がfalseの場合は、連合タイムライン、trueの場合はローカルタイムラインになります
    q, err := wsc.StreamingWSPublic(context.Background(), false)
    if err != nil {
        fmt.Printf("  ERR: %s\n", err)
    }

    // pawooのメディアタイムラインはWebSocketではない(今のところ?)ため、以下のように取得できます。
    // こちらも第2引数がfalseの場合は、連合タイムライン、trueの場合はローカルタイムラインになります
    // statues, err = c.GetTimelineMedia(ctx, false)
    // ただこちらはストリームではない(ただのstatusの配列)なため以下のうようになります。
    // for _, status := range s {
    //  fmt.Print ...
    // }

    // ストリーミングデータを取得 (メディアタイムライン以外)
    for e := range q {
        // 削除イベントとかもあるため、更新(トウート?)のみに絞る
        if t, ok := e.(*m.UpdateEvent); ok {
            // ストリームからメディアを手動でフィルタする場合は、以下をコメントアウト(コメントの開発者本人のコメントも参照してください)
            // if len(t.Status.MediaAttachments) > 0 {
                // 時刻:アカウント名:メッセージを色つけて表示する
                fmt.Printf("\x1b[37m[%s] \x1b[35m%-20s: \x1b[33m%s\n", t.Status.CreatedAt.Local().Format("15:04:05"), t.Status.Account.Acct, t.Status.Content)
                // 色に関してはこちらを参考 http://misc.flogisoft.com/bash/tip_colors_and_formatting
            // }
        }
    }
}

実行結果

  • go run stream.go aaaaaa.png

以上、指摘、補足などがあればコメントでお願いします。

12
14
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
14