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: "edPostId,
})
if err != nil {
log.Fatal(err)
}in_reply_to_post_id と quoted_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_id と upload_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.UploadUrlStep 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: ポストへの添付
処理が完了したら、CreatePost で media_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)
}ユースケース
- リプライや引用ポストを受信した際に、元のポスト情報(本文、メディア、スタンプ等)を取得
- メンションされたポストの添付メディアやスタンプ情報を確認
アプリケーションがアクセス可能なポストのみ取得可能です。
次のステップ
- アプリケーション開発 - Webhook URL の設定、デプロイ
- イベント - イベントの種類と構造
- Webhook でイベントを受信する - Webhook 方式の実装
- gRPC ストリームでイベントを受信する - gRPC 方式の実装
- API リファレンス - API の完全な仕様