마스트돈 타임 라인을 go-mastodon WebSocket을 사용하여 가져옵니다.

자기소개



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

  • 이상, 지적, 보충 등이 있으면 코멘트로 부탁합니다.

    좋은 웹페이지 즐겨찾기