mixi2 Developer Platform
開発ガイド

API の使い方

mixi2 API を使用してポストの作成・削除、DM の送信、メディアのアップロードなどを行う方法を解説します。

このガイドでは、mixi2 API を使用してアプリケーションから各種操作を行う方法を解説します。

前提条件

主要 API 一覧

RPC説明
CreatePostポストを作成(返信/引用/メディア添付対応)
DeletePostポストを削除
SendChatMessageチャットメッセージを送信(テキスト/メディア添付)
InitiatePostMediaUploadメディアアップロードを開始
GetPostMediaStatusメディアのアップロード/処理状況を取得
GetStampsスタンプ一覧を取得
AddStampToPostポストにスタンプを付与
GetUsersユーザー情報を取得
GetPostsポスト情報を取得

共通の初期化処理

各 API のサンプルコードは、以下のクライアント、認証、接続の初期化が完了している前提で記述しています。

import (
    "context"
    "crypto/tls"
    "log"
    "os"

    "github.com/mixigroup/mixi2-application-sdk-go/auth"
    application_apiv1 "github.com/mixigroup/mixi2-application-sdk-go/gen/go/social/mixi/application/api/v1"
    "google.golang.org/grpc"
    "google.golang.org/grpc/credentials"
)

// 認証の設定
authenticator, err := auth.NewAuthenticator(
    os.Getenv("CLIENT_ID"),
    os.Getenv("CLIENT_SECRET"),
    os.Getenv("TOKEN_URL"),
)
if err != nil {
    log.Fatal(err)
}

// API サーバーへの接続
apiConn, err := grpc.NewClient(
    os.Getenv("API_ADDRESS"),
    grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{})),
)
if err != nil {
    log.Fatal(err)
}
defer apiConn.Close()

// API クライアントの作成
client := application_apiv1.NewApplicationServiceClient(apiConn)

// 認証済みコンテキストの取得
authCtx, err := authenticator.AuthorizedContext(context.Background())
if err != nil {
    log.Fatal(err)
}

ポストの作成

CreatePost RPC を使用してポストを作成します。

基本的なポスト

_, err := client.CreatePost(authCtx, &application_apiv1.CreatePostRequest{
    Text: "こんにちは!",
})
if err != nil {
    log.Fatal(err)
}

リプライ

受信したポストに返信する場合は、in_reply_to_post_id を指定します。

inReplyToPostId := event.Post.PostId
_, err := client.CreatePost(authCtx, &application_apiv1.CreatePostRequest{
    Text:         "これは面白い投稿ですね!",
    InReplyToPostId: &inReplyToPostId,
})
if err != nil {
    log.Fatal(err)
}

引用ポスト

他のポストを引用する場合は、quoted_post_id を指定します。

quotedPostId := originalPostId
_, err := client.CreatePost(authCtx, &application_apiv1.CreatePostRequest{
    Text:         "これは面白い投稿ですね!",
    QuotedPostId: &quotedPostId,
})
if err != nil {
    log.Fatal(err)
}

in_reply_to_post_idquoted_post_id は同時に指定できません。

マスク付きポスト

センシティブなコンテンツやネタバレを含むポストには、マスクを適用できます。

caption := "映画のネタバレ注意"
_, err := client.CreatePost(authCtx, &application_apiv1.CreatePostRequest{
    Text: "ネタバレを含む内容です...",
    PostMask: &modelv1.PostMask{
        MaskType: constv1.PostMaskType_POST_MASK_TYPE_SPOILER,
        Caption:  &caption,
    },
})
if err != nil {
    log.Fatal(err)
}
マスク種別説明
POST_MASK_TYPE_SENSITIVE刺激的なコンテンツに対する注意喚起
POST_MASK_TYPE_SPOILERネタバレ防止のための注意喚起

ユースケース:

  • センシティブな可能性があるコンテンツに予防的にマスクを適用
  • ゲーム攻略・レビューボットでネタバレを含む返信にスポイラーマスクを適用
  • ユーザーが「ネタバレあり」などのキーワードを含めた場合に自動でマスクを適用

配信設定

ポストの配信範囲を制御できます。

publishingType := constv1.PostPublishingType_POST_PUBLISHING_TYPE_NOT_PUBLISHING
_, err := client.CreatePost(authCtx, &application_apiv1.CreatePostRequest{
    Text:           "このポストはプロフィールにのみ表示されます",
    PublishingType: &publishingType,
})
if err != nil {
    log.Fatal(err)
}
配信設定説明
POST_PUBLISHING_TYPE_UNSPECIFIEDフォロワーのタイムラインに公開(デフォルト)
POST_PUBLISHING_TYPE_NOT_PUBLISHINGプロフィールにのみ公開

NOT_PUBLISHING は、特定ユーザーへの返信時にフォロワー全体のタイムラインに流さない場合や、テスト投稿に便利です。

ポスト作成の制限

項目制限
テキスト最大文字数149 文字
メディア添付最大 4 件
メンション数文字数に収まる限り制限なし

ポストの削除

DeletePost RPC を使用して、アプリケーションが作成したポストを削除します。

// 作成したポストのIDを使用
createResp, err := client.CreatePost(authCtx, &application_apiv1.CreatePostRequest{
    Text: "テスト投稿",
})
if err != nil {
    log.Fatal(err)
}

// ポストを削除
_, err = client.DeletePost(authCtx, &application_apiv1.DeletePostRequest{
    PostId: createResp.Post.PostId,
})
if err != nil {
    log.Fatal(err)
}

ユースケース

  • デバッグ投稿の削除: アプリケーション開発時にテストで投稿した内容を削除
  • 誤投稿の削除: アプリケーションが誤って投稿した内容を削除
  • 期間限定コンテンツ: 一定期間後に自動削除するポスト(例: 限定告知)

ポスト削除の制限

項目制限
削除可能なポストアプリケーション自身が作成したポストのみ
削除の不可逆性削除したポストは復元できない
関連データへの影響返信・引用は残るが、削除されたポストの内容は表示されない

ポストを削除すると復元できません。また、存在しないポストや削除権限のないポストを指定した場合はエラーが返されます。

DM の送信

SendChatMessage RPC を使用して DM を送信します。

text := "メッセージを受け取りました!"
_, err := client.SendChatMessage(authCtx, &application_apiv1.SendChatMessageRequest{
    RoomId: event.Message.RoomId,
    Text:   &text,
})
if err != nil {
    log.Fatal(err)
}

アプリケーションから先に DM を送ることはできません。ユーザーから DM を受信した際に、イベントに含まれる room_id を使用して返信できます。

DM 送信の制限

項目制限
先送り可否不可(ユーザーからの DM 受信後のみ返信可能)
必須フィールドtext または media_id のいずれか

メディアのアップロード

ポストや DM にメディア(画像・動画)を添付するには、以下のフローで処理します。

Step 1: アップロードの開始

InitiatePostMediaUpload を呼び出して、media_idupload_url を取得します。

// メディアデータを準備(例: ファイルから読み込み)
imageData, err := os.ReadFile("image.jpg")
if err != nil {
    log.Fatal(err)
}

description := "画像の説明(任意)"
resp, err := client.InitiatePostMediaUpload(authCtx, &application_apiv1.InitiatePostMediaUploadRequest{
    MediaType:   application_apiv1.InitiatePostMediaUploadRequest_TYPE_IMAGE,
    ContentType: "image/jpeg",
    DataSize:    uint64(len(imageData)),
    Description: &description,
})
if err != nil {
    log.Fatal(err)
}

mediaId := resp.MediaId
uploadUrl := resp.UploadUrl

Step 2: メディアのアップロード

取得した upload_url にメディアデータを POST で送信します。Authorization ヘッダーにアクセストークンを設定する必要があります。

Step 1 の InitiatePostMediaUpload に渡す ContentType は、メディア登録開始時に、アップロード対象のファイル種別を mixi2 API に伝える値です。一方、upload_url への Content-Type ヘッダーは、実際に送る HTTP リクエストのボディ形式を示すもので、この例ではバイナリデータをそのまま送るため application/octet-stream を指定します。

// アクセストークンを取得
accessToken, err := authenticator.GetAccessToken(authCtx)
if err != nil {
    log.Fatal(err)
}

// アップロードリクエストを作成
uploadReq, err := http.NewRequest(http.MethodPost, uploadUrl, bytes.NewReader(imageData))
if err != nil {
    log.Fatal(err)
}

uploadReq.Header.Set("Authorization", "Bearer "+accessToken)
uploadReq.Header.Set("Content-Type", "application/octet-stream")

// タイムアウト付きでアップロードを実行
httpClient := &http.Client{
    Timeout: 30 * time.Second,
}
uploadResp, err := httpClient.Do(uploadReq)
if err != nil {
    log.Fatal(err)
}
defer uploadResp.Body.Close()

// レスポンスステータスを確認
if uploadResp.StatusCode != http.StatusOK && uploadResp.StatusCode != http.StatusAccepted {
    respBody, _ := io.ReadAll(uploadResp.Body)
    log.Fatalf("media upload failed with status %s: %s", uploadResp.Status, string(respBody))
}

Step 3: 処理状況の確認

GetPostMediaStatus でメディアの処理状況を確認します。異常時に待ち続けないよう、全体のタイムアウトを設けたうえで STATUS_COMPLETED になるまでポーリングしてください。

pollCtx, cancel := context.WithTimeout(authCtx, 2*time.Minute)
defer cancel()

ticker := time.NewTicker(5 * time.Second)
defer ticker.Stop()

pollLoop:
for {
    select {
    case <-pollCtx.Done():
        log.Fatalf("timed out waiting for media processing: %v", pollCtx.Err())
    case <-ticker.C:
        statusResp, err := client.GetPostMediaStatus(pollCtx, &application_apiv1.GetPostMediaStatusRequest{
            MediaId: mediaId,
        })
        if err != nil {
            log.Fatal(err)
        }

        if statusResp.Status == application_apiv1.GetPostMediaStatusResponse_STATUS_COMPLETED {
            break pollLoop
        }
        if statusResp.Status == application_apiv1.GetPostMediaStatusResponse_STATUS_FAILED {
            log.Fatal("media processing failed")
        }
    }
}
ステータス説明
STATUS_UPLOAD_PENDINGアップロード待機中
STATUS_PROCESSING処理中
STATUS_COMPLETED完了
STATUS_FAILED失敗

Step 4: ポストへの添付

処理が完了したら、CreatePostmedia_id を指定してポストを作成します。

_, err := client.CreatePost(authCtx, &application_apiv1.CreatePostRequest{
    Text:        "画像を添付しました!",
    MediaIdList: []string{mediaId},
})
if err != nil {
    log.Fatal(err)
}

メディアアップロードの制限

項目制限
画像最大サイズ15 MB
動画最大サイズ50 MB
対応フォーマットJPEG, PNG, GIF, MP4 など
アップロード有効期限(画像)200 秒
アップロード有効期限(動画)600 秒

STATUS_FAILED になったメディアは再利用できません。InitiatePostMediaUpload からやり直してください。

スタンプの付与

AddStampToPost RPC を使用して、ポストにスタンプを付与できます。

// 利用可能なスタンプ一覧を取得
language := constv1.LanguageCode_LANGUAGE_CODE_JP
stampsResp, err := client.GetStamps(authCtx, &application_apiv1.GetStampsRequest{
    OfficialStampLanguage: &language,
})
if err != nil {
    log.Fatal(err)
}

// スタンプを付与
_, err = client.AddStampToPost(authCtx, &application_apiv1.AddStampToPostRequest{
    PostId:  postId,
    StampId: stampsResp.OfficialStampSets[0].Stamps[0].StampId,
})
if err != nil {
    log.Fatal(err)
}

スタンプ付与の制限

項目制限
対象ポストアプリケーションにメンションしているポストのみ
使用可能なスタンプ公式スタンプのみ
付与回数同じポストに複数回付与不可

アプリケーションが付与したスタンプを取り消す機能は現在提供されていません。

ユースケース

  • ユーザーからのメンションに対して「確認しました」の意味でスタンプを付与
  • 特定のキーワードを含むメンションにリアクションスタンプを付与
  • 返信の代わりに軽量なリアクションとして使用

ユーザー情報の取得

GetUsers RPC を使用して、ユーザー情報を取得できます。

resp, err := client.GetUsers(authCtx, &application_apiv1.GetUsersRequest{
    UserIdList: []string{event.Post.CreatorId},
})
if err != nil {
    log.Fatal(err)
}

for _, user := range resp.Users {
    fmt.Printf("ユーザー名: %s\n", user.DisplayName)
}

ユースケース

  • イベントで受信したユーザーの詳細情報(表示名、アイコン URL)を取得
  • ポスト作成者の情報を取得してログ出力や管理画面に表示

アプリケーションがアクセス可能なユーザー情報のみ取得できます。

ポスト情報の取得

GetPosts RPC を使用して、ポスト情報を取得できます。

resp, err := client.GetPosts(authCtx, &application_apiv1.GetPostsRequest{
    PostIdList: []string{event.Post.GetInReplyToPostId()},
})
if err != nil {
    log.Fatal(err)
}

for _, post := range resp.Posts {
    fmt.Printf("ポスト本文: %s\n", post.Text)
}

ユースケース

  • リプライや引用ポストを受信した際に、元のポスト情報(本文、メディア、スタンプ等)を取得
  • メンションされたポストの添付メディアやスタンプ情報を確認

アプリケーションがアクセス可能なポストのみ取得可能です。

次のステップ

On this page