mixi2-js 0.1.2 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -547
- package/dist/chunk-4NKIICB5.js +107 -0
- package/dist/client-BmF_2lFq.d.cts +295 -0
- package/dist/client-BmF_2lFq.d.ts +295 -0
- package/dist/helpers/index.cjs +206 -0
- package/dist/helpers/index.d.cts +109 -0
- package/dist/helpers/index.d.ts +109 -0
- package/dist/helpers/index.js +178 -0
- package/dist/index.d.cts +3 -295
- package/dist/index.d.ts +3 -295
- package/dist/index.js +17 -91
- package/package.json +16 -2
package/README.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
|
|
3
|
-
<
|
|
3
|
+
<a href="https://otoneko1102.github.io/mixi2-js/">
|
|
4
|
+
<img src="./img/icon.svg" width="200px" height="200px">
|
|
5
|
+
</a>
|
|
4
6
|
|
|
5
7
|
# mixi2-js
|
|
6
8
|
|
|
@@ -17,6 +19,12 @@
|
|
|
17
19
|
[](eslint.config.js)
|
|
18
20
|
[](https://prettier.io/)
|
|
19
21
|
|
|
22
|
+
<div align="center">
|
|
23
|
+
|
|
24
|
+
**[📖 ドキュメント](https://otoneko1102.github.io/mixi2-js/)** | **[npm](https://www.npmjs.com/package/mixi2-js)** | **[JSR](https://jsr.io/@otoneko1102/mixi2-js)**
|
|
25
|
+
|
|
26
|
+
</div>
|
|
27
|
+
|
|
20
28
|
mixi2 の [Application API](https://developer.mixi.social/docs) を利用するための **非公式** TypeScript/JavaScript SDK です。
|
|
21
29
|
|
|
22
30
|
[公式 Go SDK](https://github.com/mixigroup/mixi2-application-sdk-go) および [公式 API 仕様](https://github.com/mixigroup/mixi2-api) に基づいて作成されています。
|
|
@@ -26,34 +34,6 @@ mixi2 の [Application API](https://developer.mixi.social/docs) を利用する
|
|
|
26
34
|
|
|
27
35
|
---
|
|
28
36
|
|
|
29
|
-
## 目次
|
|
30
|
-
|
|
31
|
-
- [インストール](#インストール)
|
|
32
|
-
- [機能概要](#機能概要)
|
|
33
|
-
- [クイックスタート](#クイックスタート)
|
|
34
|
-
- [認証](#認証)
|
|
35
|
-
- [API クライアント](#api-クライアント)
|
|
36
|
-
- [Webhook サーバー](#webhook-サーバー)
|
|
37
|
-
- [gRPC ストリーミング](#grpc-ストリーミング)
|
|
38
|
-
- [API リファレンス](#api-リファレンス)
|
|
39
|
-
- [OAuth2Authenticator](#oauth2authenticator)
|
|
40
|
-
- [Client](#client)
|
|
41
|
-
- [WebhookServer](#webhookserver)
|
|
42
|
-
- [StreamWatcher](#streamwatcher)
|
|
43
|
-
- [EventHandler](#eventhandler)
|
|
44
|
-
- [RPC メソッド一覧](#rpc-メソッド一覧)
|
|
45
|
-
- [型定義](#型定義)
|
|
46
|
-
- [Enum 定義](#enum-定義)
|
|
47
|
-
- [環境変数](#環境変数)
|
|
48
|
-
- [イベント](#イベント)
|
|
49
|
-
- [レート制限](#レート制限)
|
|
50
|
-
- [セキュリティ](#セキュリティ)
|
|
51
|
-
- [関連リンク](#関連リンク)
|
|
52
|
-
- [コントリビュート](#コントリビュート)
|
|
53
|
-
- [ライセンス](#ライセンス)
|
|
54
|
-
|
|
55
|
-
---
|
|
56
|
-
|
|
57
37
|
## インストール
|
|
58
38
|
|
|
59
39
|
```bash
|
|
@@ -77,536 +57,28 @@ ESM・CommonJS の両方に対応しています。TypeScript の型定義 (`.d.
|
|
|
77
57
|
| `WebhookServer` | HTTP Webhook サーバー(Ed25519 署名検証・Ping 自動応答) |
|
|
78
58
|
| `StreamWatcher` | gRPC ストリーミング(指数バックオフによる自動再接続) |
|
|
79
59
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
## クイックスタート
|
|
83
|
-
|
|
84
|
-
### 前提条件
|
|
85
|
-
|
|
86
|
-
- **Node.js 18 以上**
|
|
87
|
-
- [mixi2 Developer Platform](https://developer.mixi.social) で開発者登録が完了していること
|
|
88
|
-
- アプリケーションを作成し、認証情報(Client ID / Client Secret / Token URL 等)を取得済みであること
|
|
89
|
-
|
|
90
|
-
### 認証
|
|
91
|
-
|
|
92
|
-
```typescript
|
|
93
|
-
// ESM
|
|
94
|
-
import { OAuth2Authenticator } from 'mixi2-js';
|
|
95
|
-
// CJS
|
|
96
|
-
const { OAuth2Authenticator } = require('mixi2-js');
|
|
97
|
-
|
|
98
|
-
const authenticator = new OAuth2Authenticator({
|
|
99
|
-
clientId: process.env.CLIENT_ID!,
|
|
100
|
-
clientSecret: process.env.CLIENT_SECRET!,
|
|
101
|
-
tokenUrl: process.env.TOKEN_URL!,
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
// アクセストークンを取得(キャッシュ済みの場合は即座に返却)
|
|
105
|
-
const token = await authenticator.getAccessToken();
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
### API クライアント
|
|
109
|
-
|
|
110
|
-
```typescript
|
|
111
|
-
// ESM
|
|
112
|
-
import { OAuth2Authenticator, Client, MediaUploadType, LanguageCode } from 'mixi2-js';
|
|
113
|
-
// CJS
|
|
114
|
-
const { OAuth2Authenticator, Client, MediaUploadType, LanguageCode } = require('mixi2-js');
|
|
115
|
-
|
|
116
|
-
const authenticator = new OAuth2Authenticator({
|
|
117
|
-
clientId: process.env.CLIENT_ID!,
|
|
118
|
-
clientSecret: process.env.CLIENT_SECRET!,
|
|
119
|
-
tokenUrl: process.env.TOKEN_URL!,
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
const client = new Client({
|
|
123
|
-
apiAddress: process.env.API_ADDRESS!,
|
|
124
|
-
authenticator,
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
// ユーザー情報取得
|
|
128
|
-
const users = await client.getUsers(['user-id-1', 'user-id-2']);
|
|
129
|
-
|
|
130
|
-
// ポスト作成
|
|
131
|
-
const post = await client.createPost({ text: 'Hello mixi2!' });
|
|
132
|
-
|
|
133
|
-
// ポスト情報取得
|
|
134
|
-
const posts = await client.getPosts(['post-id-1']);
|
|
135
|
-
|
|
136
|
-
// チャットメッセージ送信(ユーザーからの DM 受信後のみ)
|
|
137
|
-
const message = await client.sendChatMessage({
|
|
138
|
-
roomId: 'room-id',
|
|
139
|
-
text: 'Hello!',
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
// メディアアップロード → ポスト添付の流れ
|
|
143
|
-
const upload = await client.initiatePostMediaUpload({
|
|
144
|
-
contentType: 'image/png',
|
|
145
|
-
dataSize: 1024,
|
|
146
|
-
mediaType: MediaUploadType.IMAGE,
|
|
147
|
-
});
|
|
148
|
-
// upload.uploadUrl に PUT でメディアデータを送信
|
|
149
|
-
const status = await client.getPostMediaStatus(upload.mediaId);
|
|
150
|
-
// status.status === MediaUploadStatus.COMPLETED になったら添付可能
|
|
151
|
-
await client.createPost({ text: '画像付き!', mediaIdList: [upload.mediaId] });
|
|
152
|
-
|
|
153
|
-
// スタンプ一覧取得
|
|
154
|
-
const stamps = await client.getStamps({ officialStampLanguage: LanguageCode.JP });
|
|
155
|
-
|
|
156
|
-
// ポストにスタンプを付与
|
|
157
|
-
await client.addStampToPost('post-id', 'stamp-id');
|
|
158
|
-
|
|
159
|
-
// クライアントを閉じる
|
|
160
|
-
client.close();
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
### Webhook サーバー
|
|
164
|
-
|
|
165
|
-
```typescript
|
|
166
|
-
// ESM
|
|
167
|
-
import { WebhookServer, EventType } from 'mixi2-js';
|
|
168
|
-
import type { EventHandler, Event } from 'mixi2-js';
|
|
169
|
-
// CJS
|
|
170
|
-
const { WebhookServer, EventType } = require('mixi2-js');
|
|
171
|
-
|
|
172
|
-
const handler: EventHandler = {
|
|
173
|
-
handle: async (event: Event) => {
|
|
174
|
-
switch (event.eventType) {
|
|
175
|
-
case EventType.POST_CREATED:
|
|
176
|
-
console.log('Post created:', event.postCreatedEvent?.post?.text);
|
|
177
|
-
break;
|
|
178
|
-
case EventType.CHAT_MESSAGE_RECEIVED:
|
|
179
|
-
console.log('Chat message:', event.chatMessageReceivedEvent?.message?.text);
|
|
180
|
-
break;
|
|
181
|
-
}
|
|
182
|
-
},
|
|
183
|
-
};
|
|
184
|
-
|
|
185
|
-
// 公開鍵は Base64 からデコード
|
|
186
|
-
const publicKey = Buffer.from(process.env.SIGNATURE_PUBLIC_KEY!, 'base64');
|
|
187
|
-
|
|
188
|
-
const server = new WebhookServer({
|
|
189
|
-
port: 8080,
|
|
190
|
-
publicKey,
|
|
191
|
-
handler,
|
|
192
|
-
});
|
|
193
|
-
|
|
194
|
-
await server.start();
|
|
195
|
-
console.log('Webhook server started on :8080');
|
|
196
|
-
|
|
197
|
-
// エンドポイント:
|
|
198
|
-
// POST /events - イベント受信
|
|
199
|
-
// GET /healthz - ヘルスチェック
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
サーバーレス環境(Vercel、AWS Lambda など)では `syncHandling: true` を設定してください:
|
|
203
|
-
|
|
204
|
-
```typescript
|
|
205
|
-
const server = new WebhookServer({
|
|
206
|
-
port: 8080,
|
|
207
|
-
publicKey,
|
|
208
|
-
handler,
|
|
209
|
-
syncHandling: true, // レスポンス後にプロセスが終了する環境向け
|
|
210
|
-
});
|
|
211
|
-
|
|
212
|
-
export default server.httpServer;
|
|
213
|
-
```
|
|
214
|
-
|
|
215
|
-
### gRPC ストリーミング
|
|
216
|
-
|
|
217
|
-
ローカル開発やプロトタイピングに推奨される方式です。外部公開 URL が不要です。
|
|
218
|
-
|
|
219
|
-
```typescript
|
|
220
|
-
// ESM
|
|
221
|
-
import { OAuth2Authenticator, StreamWatcher, EventType } from 'mixi2-js';
|
|
222
|
-
import type { EventHandler, Event } from 'mixi2-js';
|
|
223
|
-
// CJS
|
|
224
|
-
const { OAuth2Authenticator, StreamWatcher, EventType } = require('mixi2-js');
|
|
225
|
-
|
|
226
|
-
const authenticator = new OAuth2Authenticator({
|
|
227
|
-
clientId: process.env.CLIENT_ID!,
|
|
228
|
-
clientSecret: process.env.CLIENT_SECRET!,
|
|
229
|
-
tokenUrl: process.env.TOKEN_URL!,
|
|
230
|
-
});
|
|
231
|
-
|
|
232
|
-
const handler: EventHandler = {
|
|
233
|
-
handle: async (event: Event) => {
|
|
234
|
-
console.log('Received event:', event.eventId, EventType[event.eventType]);
|
|
235
|
-
},
|
|
236
|
-
};
|
|
237
|
-
|
|
238
|
-
const watcher = new StreamWatcher({
|
|
239
|
-
streamAddress: process.env.STREAM_ADDRESS!,
|
|
240
|
-
authenticator,
|
|
241
|
-
});
|
|
242
|
-
|
|
243
|
-
// イベント監視開始(接続エラー時は自動再接続: 1s → 2s → 4s, 最大 3 回)
|
|
244
|
-
await watcher.watch(handler);
|
|
245
|
-
|
|
246
|
-
// 停止
|
|
247
|
-
watcher.stop();
|
|
248
|
-
```
|
|
249
|
-
|
|
250
|
-
---
|
|
251
|
-
|
|
252
|
-
## API リファレンス
|
|
253
|
-
|
|
254
|
-
### OAuth2Authenticator
|
|
255
|
-
|
|
256
|
-
OAuth2 Client Credentials フローによる認証を管理します。
|
|
257
|
-
|
|
258
|
-
```typescript
|
|
259
|
-
new OAuth2Authenticator(options: AuthenticatorOptions)
|
|
260
|
-
```
|
|
261
|
-
|
|
262
|
-
| プロパティ | 型 | 説明 |
|
|
263
|
-
|---|---|---|
|
|
264
|
-
| `clientId` | `string` | OAuth2 クライアント ID |
|
|
265
|
-
| `clientSecret` | `string` | OAuth2 クライアントシークレット |
|
|
266
|
-
| `tokenUrl` | `string` | トークンエンドポイント URL |
|
|
267
|
-
|
|
268
|
-
| メソッド | 戻り値 | 説明 |
|
|
269
|
-
|---|---|---|
|
|
270
|
-
| `getAccessToken()` | `Promise<string>` | アクセストークンを取得。有効期限の 1 分前までキャッシュし、自動更新する |
|
|
271
|
-
|
|
272
|
-
`Authenticator` インターフェースを実装しているため、カスタム認証を独自に実装することも可能です。
|
|
273
|
-
|
|
274
|
-
---
|
|
275
|
-
|
|
276
|
-
### Client
|
|
277
|
-
|
|
278
|
-
8 つの RPC メソッドを提供する gRPC API クライアントです。
|
|
279
|
-
|
|
280
|
-
```typescript
|
|
281
|
-
new Client(options: ClientOptions)
|
|
282
|
-
```
|
|
283
|
-
|
|
284
|
-
| プロパティ | 型 | 必須 | 説明 |
|
|
285
|
-
|---|---|---|---|
|
|
286
|
-
| `apiAddress` | `string` | ○ | API サーバーアドレス |
|
|
287
|
-
| `authenticator` | `Authenticator` | ○ | 認証インスタンス |
|
|
288
|
-
|
|
289
|
-
#### RPC メソッド一覧
|
|
290
|
-
|
|
291
|
-
| メソッド | 引数 | 戻り値 | 説明 |
|
|
292
|
-
|---|---|---|---|
|
|
293
|
-
| `getUsers(userIdList)` | `string[]` | `Promise<User[]>` | ユーザー情報を一括取得 |
|
|
294
|
-
| `getPosts(postIdList)` | `string[]` | `Promise<Post[]>` | ポスト情報を一括取得 |
|
|
295
|
-
| `createPost(request)` | `CreatePostRequest` | `Promise<Post>` | ポストを作成(返信/引用/メディア添付対応) |
|
|
296
|
-
| `initiatePostMediaUpload(request)` | `InitiatePostMediaUploadRequest` | `Promise<InitiatePostMediaUploadResponse>` | メディアアップロードを開始 |
|
|
297
|
-
| `getPostMediaStatus(mediaId)` | `string` | `Promise<GetPostMediaStatusResponse>` | メディアの処理状況を取得 |
|
|
298
|
-
| `sendChatMessage(request)` | `SendChatMessageRequest` | `Promise<ChatMessage>` | チャットメッセージを送信 |
|
|
299
|
-
| `getStamps(request?)` | `GetStampsRequest?` | `Promise<OfficialStampSet[]>` | スタンプ一覧を取得 |
|
|
300
|
-
| `addStampToPost(postId, stampId)` | `string, string` | `Promise<Post>` | ポストにスタンプを付与 |
|
|
301
|
-
| `close()` | - | `void` | gRPC 接続を閉じる |
|
|
302
|
-
|
|
303
|
-
#### CreatePostRequest
|
|
304
|
-
|
|
305
|
-
| フィールド | 型 | 必須 | 説明 |
|
|
306
|
-
|---|---|---|---|
|
|
307
|
-
| `text` | `string` | ○ | ポスト本文(最大 149 文字) |
|
|
308
|
-
| `inReplyToPostId` | `string` | - | 返信先ポスト ID |
|
|
309
|
-
| `quotedPostId` | `string` | - | 引用対象ポスト ID |
|
|
310
|
-
| `mediaIdList` | `string[]` | - | 添付メディア ID(最大 4 件) |
|
|
311
|
-
| `postMask` | `PostMask` | - | マスク設定(センシティブ/ネタバレ) |
|
|
312
|
-
| `publishingType` | `PostPublishingType` | - | 配信設定 |
|
|
313
|
-
|
|
314
|
-
> `inReplyToPostId` と `quotedPostId` は同時に指定できません。
|
|
315
|
-
|
|
316
|
-
#### InitiatePostMediaUploadRequest
|
|
317
|
-
|
|
318
|
-
| フィールド | 型 | 必須 | 説明 |
|
|
319
|
-
|---|---|---|---|
|
|
320
|
-
| `contentType` | `string` | ○ | Content-Type(例: `image/jpeg`) |
|
|
321
|
-
| `dataSize` | `number` | ○ | データサイズ(バイト) |
|
|
322
|
-
| `mediaType` | `MediaUploadType` | ○ | メディア種別(`IMAGE` / `VIDEO`) |
|
|
323
|
-
| `description` | `string` | - | メディアの説明 |
|
|
324
|
-
|
|
325
|
-
#### SendChatMessageRequest
|
|
326
|
-
|
|
327
|
-
| フィールド | 型 | 必須 | 説明 |
|
|
328
|
-
|---|---|---|---|
|
|
329
|
-
| `roomId` | `string` | ○ | 送信先ルーム ID |
|
|
330
|
-
| `text` | `string` | △ | テキスト(`text` または `mediaId` のいずれか必須) |
|
|
331
|
-
| `mediaId` | `string` | △ | 添付メディア ID |
|
|
332
|
-
|
|
333
|
-
---
|
|
334
|
-
|
|
335
|
-
### WebhookServer
|
|
336
|
-
|
|
337
|
-
Ed25519 署名検証付きの HTTP Webhook サーバーです。
|
|
60
|
+
### Helpers (拡張機能)
|
|
338
61
|
|
|
339
|
-
|
|
340
|
-
new WebhookServer(options: WebhookServerOptions)
|
|
341
|
-
```
|
|
342
|
-
|
|
343
|
-
| プロパティ | 型 | 必須 | デフォルト | 説明 |
|
|
344
|
-
|---|---|---|---|---|
|
|
345
|
-
| `publicKey` | `Buffer` | ○ | - | Ed25519 公開鍵(Base64 をデコードしたもの) |
|
|
346
|
-
| `handler` | `EventHandler` | ○ | - | イベントハンドラ |
|
|
347
|
-
| `port` | `number` | - | `8080` | リッスンポート |
|
|
348
|
-
| `syncHandling` | `boolean` | - | `false` | イベントを同期処理するか |
|
|
349
|
-
|
|
350
|
-
| メソッド | 戻り値 | 説明 |
|
|
351
|
-
|---|---|---|
|
|
352
|
-
| `start()` | `Promise<void>` | サーバーを起動 |
|
|
353
|
-
| `shutdown()` | `Promise<void>` | サーバーを停止 |
|
|
354
|
-
| `address` | `string` | リッスンアドレス |
|
|
355
|
-
| `httpServer` | `http.Server` | 内部の HTTP サーバーインスタンス |
|
|
356
|
-
| `eventHandlerFunc` | `Function` | イベントハンドラ関数(フレームワーク統合用) |
|
|
357
|
-
|
|
358
|
-
#### エンドポイント
|
|
359
|
-
|
|
360
|
-
| パス | メソッド | 説明 |
|
|
361
|
-
|---|---|---|
|
|
362
|
-
| `/events` | POST | イベント受信(署名検証 → protobuf デコード → ハンドラ呼出) |
|
|
363
|
-
| `/healthz` | GET | ヘルスチェック(常に `200 OK`) |
|
|
364
|
-
|
|
365
|
-
#### 署名検証の仕様
|
|
366
|
-
|
|
367
|
-
| 項目 | 値 |
|
|
368
|
-
|---|---|
|
|
369
|
-
| 署名ヘッダ | `x-mixi2-application-event-signature`(Base64) |
|
|
370
|
-
| タイムスタンプヘッダ | `x-mixi2-application-event-timestamp`(Unix 秒) |
|
|
371
|
-
| 署名対象 | リクエストボディ + タイムスタンプ |
|
|
372
|
-
| 許容時刻ズレ | ±300 秒(5 分) |
|
|
373
|
-
| 署名失敗レスポンス | HTTP 401 |
|
|
374
|
-
| 成功レスポンス | HTTP 204 |
|
|
375
|
-
|
|
376
|
-
---
|
|
377
|
-
|
|
378
|
-
### StreamWatcher
|
|
379
|
-
|
|
380
|
-
gRPC ストリーミングによるリアルタイムイベント受信を行います。
|
|
381
|
-
|
|
382
|
-
```typescript
|
|
383
|
-
new StreamWatcher(options: StreamWatcherOptions)
|
|
384
|
-
```
|
|
385
|
-
|
|
386
|
-
| プロパティ | 型 | 必須 | 説明 |
|
|
387
|
-
|---|---|---|---|
|
|
388
|
-
| `streamAddress` | `string` | ○ | Stream サーバーアドレス |
|
|
389
|
-
| `authenticator` | `Authenticator` | ○ | 認証インスタンス |
|
|
390
|
-
|
|
391
|
-
| メソッド | 戻り値 | 説明 |
|
|
392
|
-
|---|---|---|
|
|
393
|
-
| `watch(handler)` | `Promise<void>` | イベント監視を開始 |
|
|
394
|
-
| `stop()` | `void` | 監視を停止し接続を閉じる |
|
|
395
|
-
|
|
396
|
-
#### 再接続の仕様
|
|
397
|
-
|
|
398
|
-
| 項目 | 値 |
|
|
399
|
-
|---|---|
|
|
400
|
-
| 再接続方式 | 指数バックオフ(1 秒 → 2 秒 → 4 秒) |
|
|
401
|
-
| 最大リトライ回数 | 3 回 |
|
|
402
|
-
| Ping イベント | SDK 内部で処理(`handle` には渡されない) |
|
|
403
|
-
|
|
404
|
-
> 再接続中に発生したイベントは失われます。厳密な到達保証が必要な場合は Webhook 方式を使用してください。
|
|
405
|
-
|
|
406
|
-
---
|
|
407
|
-
|
|
408
|
-
### EventHandler
|
|
409
|
-
|
|
410
|
-
Webhook・gRPC ストリーム共通のイベントハンドラインターフェースです。
|
|
411
|
-
|
|
412
|
-
```typescript
|
|
413
|
-
interface EventHandler {
|
|
414
|
-
handle(event: Event): void | Promise<void>;
|
|
415
|
-
}
|
|
416
|
-
```
|
|
417
|
-
|
|
418
|
-
- `handle` 内で発生したエラーはログ出力され、処理は継続します
|
|
419
|
-
- Ping イベントは SDK 内部で処理されるため `handle` には渡されません
|
|
420
|
-
- Webhook 方式では `handle` の結果にかかわらず常に HTTP 204 が返されます
|
|
421
|
-
|
|
422
|
-
---
|
|
423
|
-
|
|
424
|
-
### 型定義
|
|
425
|
-
|
|
426
|
-
#### モデル型
|
|
427
|
-
|
|
428
|
-
| 型 | 説明 |
|
|
429
|
-
|---|---|
|
|
430
|
-
| `User` | ユーザー情報(ID・表示名・プロフィール・アバター等) |
|
|
431
|
-
| `UserAvatar` | ユーザーアバター画像情報(大小 2 サイズ) |
|
|
432
|
-
| `Post` | ポスト情報(本文・作成日時・メディア・マスク・スタンプ等) |
|
|
433
|
-
| `PostMedia` | ポスト添付メディア(画像 / 動画) |
|
|
434
|
-
| `PostMediaImage` | ポスト添付画像の詳細 |
|
|
435
|
-
| `PostMediaVideo` | ポスト添付動画の詳細 |
|
|
436
|
-
| `PostMask` | ポストマスク(センシティブ / ネタバレ) |
|
|
437
|
-
| `PostStamp` | ポストに付与されたスタンプ(スタンプ情報 + 回数) |
|
|
438
|
-
| `Media` | メッセージ添付メディア |
|
|
439
|
-
| `MediaImage` | メッセージ添付画像の詳細 |
|
|
440
|
-
| `MediaVideo` | メッセージ添付動画の詳細 |
|
|
441
|
-
| `MediaStamp` | スタンプ画像情報 |
|
|
442
|
-
| `ChatMessage` | チャットメッセージ(ルーム ID・本文・メディア等) |
|
|
443
|
-
| `OfficialStampSet` | 公式スタンプセット(名前・スプライト URL・有効期間等) |
|
|
444
|
-
| `OfficialStamp` | 個別の公式スタンプ |
|
|
445
|
-
|
|
446
|
-
#### イベント型
|
|
447
|
-
|
|
448
|
-
| 型 | 説明 |
|
|
449
|
-
|---|---|
|
|
450
|
-
| `Event` | イベント(ID・種別・イベントボディの oneof) |
|
|
451
|
-
| `PingEvent` | 接続確認イベント(フィールドなし) |
|
|
452
|
-
| `PostCreatedEvent` | ポスト作成イベント(理由リスト・ポスト・発行者) |
|
|
453
|
-
| `ChatMessageReceivedEvent` | チャットメッセージ受信イベント(理由リスト・メッセージ・発行者) |
|
|
454
|
-
|
|
455
|
-
#### リクエスト/レスポンス型
|
|
62
|
+
`mixi2-js/helpers` は、公式 API 仕様には含まれない **SDK 独自の便利ユーティリティ**を提供します。
|
|
456
63
|
|
|
457
|
-
|
|
|
64
|
+
| ヘルパー | 説明 |
|
|
458
65
|
|---|---|
|
|
459
|
-
| `
|
|
460
|
-
| `
|
|
461
|
-
| `
|
|
462
|
-
| `
|
|
463
|
-
| `SendChatMessageRequest` | チャットメッセージ送信リクエスト |
|
|
464
|
-
| `GetStampsRequest` | スタンプ一覧取得リクエスト |
|
|
465
|
-
|
|
466
|
-
---
|
|
467
|
-
|
|
468
|
-
### Enum 定義
|
|
469
|
-
|
|
470
|
-
#### EventType
|
|
471
|
-
|
|
472
|
-
| 名前 | 値 | 説明 |
|
|
473
|
-
|---|---|---|
|
|
474
|
-
| `UNSPECIFIED` | 0 | 未指定 |
|
|
475
|
-
| `PING` | 1 | 接続確認 |
|
|
476
|
-
| `POST_CREATED` | 2 | ポスト作成 |
|
|
477
|
-
| `CHAT_MESSAGE_RECEIVED` | 4 | メッセージ受信 |
|
|
478
|
-
|
|
479
|
-
#### EventReason
|
|
480
|
-
|
|
481
|
-
| 名前 | 値 | 説明 |
|
|
482
|
-
|---|---|---|
|
|
483
|
-
| `UNSPECIFIED` | 0 | 未指定 |
|
|
484
|
-
| `PING` | 1 | 接続確認 |
|
|
485
|
-
| `POST_REPLY` | 2 | ポストに返信された |
|
|
486
|
-
| `POST_MENTIONED` | 3 | ポストでメンションされた |
|
|
487
|
-
| `POST_QUOTED` | 4 | ポストが引用された |
|
|
488
|
-
| `DIRECT_MESSAGE_RECEIVED` | 8 | DM を受信した |
|
|
489
|
-
|
|
490
|
-
#### PostVisibility / PostAccessLevel
|
|
491
|
-
|
|
492
|
-
| Enum | 値 | 説明 |
|
|
493
|
-
|---|---|---|
|
|
494
|
-
| `PostVisibility.VISIBLE` | 1 | 閲覧可能 |
|
|
495
|
-
| `PostVisibility.INVISIBLE` | 2 | 閲覧不可 |
|
|
496
|
-
| `PostAccessLevel.PUBLIC` | 1 | 公開 |
|
|
497
|
-
| `PostAccessLevel.PRIVATE` | 2 | 非公開 |
|
|
498
|
-
|
|
499
|
-
#### PostMaskType
|
|
500
|
-
|
|
501
|
-
| 名前 | 値 | 説明 |
|
|
502
|
-
|---|---|---|
|
|
503
|
-
| `SENSITIVE` | 1 | 刺激的なコンテンツ |
|
|
504
|
-
| `SPOILER` | 2 | ネタバレ防止 |
|
|
505
|
-
|
|
506
|
-
#### PostPublishingType
|
|
507
|
-
|
|
508
|
-
| 名前 | 値 | 説明 |
|
|
509
|
-
|---|---|---|
|
|
510
|
-
| `UNSPECIFIED` | 0 | フォロワーのタイムラインに公開(デフォルト) |
|
|
511
|
-
| `NOT_PUBLISHING` | 1 | プロフィールにのみ公開 |
|
|
512
|
-
|
|
513
|
-
#### MediaUploadType / MediaUploadStatus
|
|
514
|
-
|
|
515
|
-
| Enum | 値 | 説明 |
|
|
516
|
-
|---|---|---|
|
|
517
|
-
| `MediaUploadType.IMAGE` | 1 | 画像 |
|
|
518
|
-
| `MediaUploadType.VIDEO` | 2 | 動画 |
|
|
519
|
-
| `MediaUploadStatus.UPLOAD_PENDING` | 1 | アップロード待機中 |
|
|
520
|
-
| `MediaUploadStatus.PROCESSING` | 2 | 処理中 |
|
|
521
|
-
| `MediaUploadStatus.COMPLETED` | 3 | 完了 |
|
|
522
|
-
| `MediaUploadStatus.FAILED` | 4 | 失敗 |
|
|
523
|
-
|
|
524
|
-
#### UserVisibility / UserAccessLevel
|
|
525
|
-
|
|
526
|
-
| Enum | 値 | 説明 |
|
|
527
|
-
|---|---|---|
|
|
528
|
-
| `UserVisibility.VISIBLE` | 1 | 閲覧可能 |
|
|
529
|
-
| `UserVisibility.INVISIBLE` | 2 | 閲覧不可 |
|
|
530
|
-
| `UserAccessLevel.PUBLIC` | 1 | 公開 |
|
|
531
|
-
| `UserAccessLevel.PRIVATE` | 2 | 非公開 |
|
|
532
|
-
|
|
533
|
-
#### その他
|
|
534
|
-
|
|
535
|
-
| Enum | 値 | 説明 |
|
|
536
|
-
|---|---|---|
|
|
537
|
-
| `LanguageCode.JP` | 1 | 日本語 |
|
|
538
|
-
| `LanguageCode.EN` | 2 | 英語 |
|
|
539
|
-
| `MediaType.IMAGE` | 1 | 画像 |
|
|
540
|
-
| `MediaType.VIDEO` | 2 | 動画 |
|
|
541
|
-
| `PostMediaType.IMAGE` | 1 | 画像 |
|
|
542
|
-
| `PostMediaType.VIDEO` | 2 | 動画 |
|
|
543
|
-
| `StampSetType.DEFAULT` | 1 | デフォルト |
|
|
544
|
-
| `StampSetType.SEASONAL` | 2 | 季節限定 |
|
|
545
|
-
|
|
546
|
-
---
|
|
547
|
-
|
|
548
|
-
## 環境変数
|
|
549
|
-
|
|
550
|
-
| 変数名 | 必須 | 説明 |
|
|
551
|
-
|---|---|---|
|
|
552
|
-
| `CLIENT_ID` | ○ | OAuth2 クライアント ID |
|
|
553
|
-
| `CLIENT_SECRET` | ○ | OAuth2 クライアントシークレット |
|
|
554
|
-
| `TOKEN_URL` | ○ | トークンエンドポイント URL |
|
|
555
|
-
| `API_ADDRESS` | △ | API サーバーアドレス(API クライアント使用時) |
|
|
556
|
-
| `STREAM_ADDRESS` | △ | Stream サーバーアドレス(gRPC ストリーミング使用時) |
|
|
557
|
-
| `SIGNATURE_PUBLIC_KEY` | △ | イベント署名検証用の公開鍵(Base64)(Webhook 使用時) |
|
|
558
|
-
| `PORT` | - | Webhook サーバーポート(デフォルト: `8080`) |
|
|
559
|
-
|
|
560
|
-
---
|
|
561
|
-
|
|
562
|
-
## イベント
|
|
563
|
-
|
|
564
|
-
アプリケーションが受信できるイベントの一覧です。
|
|
565
|
-
|
|
566
|
-
| イベント種別 | イベントタイプ | 説明 |
|
|
567
|
-
|---|---|---|
|
|
568
|
-
| ポスト作成 | `EVENT_TYPE_POST_CREATED` | ユーザーがメンション・リプライ・引用を行った場合 |
|
|
569
|
-
| メッセージ受信 | `EVENT_TYPE_CHAT_MESSAGE_RECEIVED` | ユーザーが DM を送信した場合 |
|
|
570
|
-
| Ping | `EVENT_TYPE_PING` | 接続確認(SDK 内部で処理、ハンドラには渡されない) |
|
|
571
|
-
|
|
572
|
-
### イベント配信の特性
|
|
573
|
-
|
|
574
|
-
- **順序保証なし** — イベントは発生順と異なる順序で届く可能性があります
|
|
575
|
-
- **Best-effort 配信** — gRPC ストリーム接続中断時のイベントは失われます
|
|
576
|
-
- **Webhook リトライ** — 配信失敗時に最大 3 回(30 秒間隔)リトライされます。冪等な処理を推奨します
|
|
577
|
-
|
|
578
|
-
---
|
|
579
|
-
|
|
580
|
-
## レート制限
|
|
581
|
-
|
|
582
|
-
API ごとのレート制限(アプリケーション単位で適用):
|
|
583
|
-
|
|
584
|
-
| RPC | 制限 | ウィンドウ |
|
|
585
|
-
|---|---|---|
|
|
586
|
-
| `CreatePost` | 10 回 | 1 分 |
|
|
587
|
-
| `SendChatMessage` | 10 回 | 1 分 |
|
|
588
|
-
| `InitiatePostMediaUpload` | 10 回 / 100 回 | 1 分 / 1 時間 |
|
|
589
|
-
| `AddStampToPost` | 10 回 | 1 分 |
|
|
590
|
-
| `GetUsers` | 10 回 | 1 分 |
|
|
591
|
-
| `GetPosts` | 10 回 | 1 分 |
|
|
592
|
-
|
|
593
|
-
`GetStamps`・`GetPostMediaStatus`・`SubscribeEvents` にはレート制限はありません。
|
|
594
|
-
|
|
595
|
-
制限超過時は gRPC ステータス `RESOURCE_EXHAUSTED` が返されます。`retry-after` ヘッダに従って待機してください。
|
|
66
|
+
| `EventRouter` | イベントタイプ別にハンドラを登録できるルーター |
|
|
67
|
+
| `PostBuilder` | メソッドチェーンでポスト作成リクエストを組み立てるビルダー |
|
|
68
|
+
| `MediaUploader` | メディアアップロードの開始〜完了待機を自動化 |
|
|
69
|
+
| `ReasonFilter` | `EventReason` ベースでイベントをフィルタリング |
|
|
596
70
|
|
|
597
71
|
---
|
|
598
72
|
|
|
599
|
-
##
|
|
73
|
+
## ドキュメント
|
|
600
74
|
|
|
601
|
-
|
|
602
|
-
- **署名検証** — Webhook リクエストは Ed25519 署名で検証されます。
|
|
603
|
-
- **リプレイ攻撃防止** — タイムスタンプ検証により ±5 分を超えるリクエストを拒否します。
|
|
604
|
-
- **TLS** — gRPC 接続はすべて TLS で暗号化されます。
|
|
75
|
+
使い方・API リファレンス・拡張機能の詳細は **[ドキュメントサイト](https://otoneko1102.github.io/mixi2-js/)** を参照してください。
|
|
605
76
|
|
|
606
77
|
---
|
|
607
78
|
|
|
608
79
|
## 関連リンク
|
|
609
80
|
|
|
81
|
+
- **[mixi2-js ドキュメント](https://otoneko1102.github.io/mixi2-js/)**
|
|
610
82
|
- [mixi2 Developer Platform 公式ドキュメント](https://developer.mixi.social/docs)
|
|
611
83
|
- [mixi2-api](https://github.com/mixigroup/mixi2-api) — API 定義(Protocol Buffers)
|
|
612
84
|
- [mixi2-application-sdk-go](https://github.com/mixigroup/mixi2-application-sdk-go) — 公式 Go SDK
|