LoginSignup
6
1

More than 3 years have passed since last update.

リングフィットアドベンチャーの運動結果を自動解析した

エンジニアは1日の大半の時間を椅子に座るので体力の衰えを感じ
体を鍛えることが必要だなと最近感じていました。
簡単に楽しく体を鍛れると噂のリングフィットアドベンチャー(※以下RFA)をしています。
GCPとGoを最近触っているのでついでに学べないかと今回この記事を書くに至りました。
後にデータをグラフ化したい…!

ソース

構成図

architect.001.png

概要

  1. スイッチでツイッター投稿
  2. TwitterAPIを通して投稿した画像を取得
  3. 読み込んだ画像をVisionAPIを通してテキスト抽出
  4. テキストをFireStoreに格納

2~4をCloudFunction上で全て実行し
CloudSchedulerにて定期実行しています。

TwitterAPIで画像抽出

func getTweet(usr string) (*os.File, error) {
    anaconda.SetConsumerKey(os.Getenv("Key"))
    anaconda.SetConsumerSecret(os.Getenv("Sec"))
    api := anaconda.NewTwitterApi(os.Getenv("Token"), os.Getenv("TokenSec"))

    v := url.Values{}
    v.Add("user_id", usr)
    v.Add("count", "1")

    timeline, _ := api.GetUserTimeline(v)
    url := getImg(timeline)
    resp, err := http.Get(url)
    if err != nil {
        return nil, err
    }
    defer resp.Body.Close()

    file, TempErr := createTemp("save")
    if TempErr != nil {
        return nil, TempErr
    }

    io.Copy(file, resp.Body)
    return file, nil
}

anacondaを利用し最新のツイートを取得して画像情報を返却します。

 VisionAPIでテキスト抽出

func ocr(ctx context.Context, filename string) ([]*pb.EntityAnnotation, error) {

    client, err := vision.NewImageAnnotatorClient(ctx)
    if err != nil {
        log.Fatalf("Failed to create client: %v", err)
        return nil, err
    }

    file, err := os.Open(filename)
    if err != nil {
        log.Fatalf("Failed to read file: %v", err)
        return nil, err
    }
    defer file.Close()
    image, err := vision.NewImageFromReader(file)
    if err != nil {
        log.Fatalf("Failed to create image: %v", err)
        return nil, err
    }

    texts, err := client.DetectTexts(ctx, image, nil, 10)
    if err != nil {
        log.Fatalf("Failed to detect labels: %v", err)
        return nil, err
    }

    return texts, nil
}

基本公式サンプル通りです。

FireStoreにデータ格納

    client, err := firestore.NewClient(ctx, os.Getenv("GCP_PROJECT"))
    if err != nil {
        return err
    }
    defer client.Close()
    task := Task{Cal: data}

    states := client.Collection("Rfa")
    t := getTime()
    ny := states.Doc(t)
    _, nyerr := ny.Create(ctx, task)
    if nyerr != nil {
        return nyerr
    }
    return nil

取得したデータをFireStoreに格納します。

まとめ

今回初めての記事作成アドベントカレンダーの参加ということで
これであっているのだろうかととても不安ですが
記事の作成をまた書きたいと思ったのと
RFAのデータは今後は格納したデータの見直しをしてデータを管理してグラフ化したいと思ってます。
ここまでご覧いただきありがとうございました。

6
1
0

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
6
1