使い方
Roblox側にそのまま貼れる見本です。⚠️ 先に Game Settings > Security のAllow HTTP Requestsを有効にしてください。
つなぎ先
https://www.vespo.app/v1/… Authorization: Bearer <あなたのAPIキー>
キーは開発者サイトで登録すると、その場で1本もらえます。
1. 置き場所と鍵
⚠️ キーはサーバー側だけに置く。LocalScript に書くと誰にでも見えます。
-- ServerScriptService に置く(クライアントからは見えない場所)
local HttpService = game:GetService("HttpService")
local BASE = "https://www.vespo.app"
-- ⚠️ 直接書かず、Creator Dashboard の Secrets か
-- ServerStorage の非公開の値から読むのが安全
local API_KEY = "ここに自分のキー"
local function call(method, path, body)
local ok, res = pcall(function()
return HttpService:RequestAsync({
Url = BASE .. path,
Method = method,
Headers = {
["Authorization"] = "Bearer " .. API_KEY,
["Content-Type"] = "application/json",
},
Body = body and HttpService:JSONEncode(body) or nil,
})
end)
if not ok then
warn("[Vespo] 通信に失敗:", res)
return nil
end
-- ⚠️ 200番台以外は中身に error が入っている。開発者サイトの「失敗」タブにも残る
if res.StatusCode >= 400 then
warn("[Vespo] " .. res.StatusCode .. " " .. tostring(res.Body))
return nil
end
return HttpService:JSONDecode(res.Body)
end2. トークルームを作る
何度呼んでも同じ結果になります(同じIDなら作り直されません)。返りの created で、新しく出来たかどうかが分かります。
-- roomId は自分で決める文字列。ゲーム側でも同じIDを覚えておく
local res = call("POST", "/v1/rooms", {
roomId = "myGame:lobby",
name = "ロビー",
members = { 12345678, 87654321 }, -- RobloxのUserId
-- アイコンは任意。Robloxのカタログの物を使える
icon = { id = 123456789, thumb = "Asset" }, -- "Asset" か "Bundle"
iconBg = "#ffd9a0",
})
-- res.created が true なら、この呼び出しで新しく出来た
print(res and res.created)3. メッセージを送る
送ると、ゲームを閉じている相手のスマホにも通知が届きます。⚠️ 中身は content(text ではありません)。clientMsgId を付けると、再送しても二重に入りません。
-- ⚠️ presentRobloxIds = いま同じサーバーに居る人。
-- その人はゲーム内でもう見えているので、スマホには鳴らさない
local present = {}
for _, p in Players:GetPlayers() do
table.insert(present, p.UserId)
end
call("POST", "/v1/messages", {
roomId = "myGame:lobby",
senderUserId = player.UserId,
senderName = player.DisplayName,
content = message, -- ⚠️ 2000文字まで
clientMsgId = HttpService:GenerateGUID(false),
experienceId = game.GameId,
presentRobloxIds = present,
})4. いま居る人を知らせる
⚠️ 差分ではなく毎回「全員」を送る。取りこぼしてもズレが残りません。これを1回呼ぶとゲームと自動でつながり、同接数が出ます。
local Players = game:GetService("Players")
local function report()
local ids = {}
for _, p in Players:GetPlayers() do
table.insert(ids, p.UserId)
end
call("POST", "/v1/presence", {
experienceId = game.GameId,
experienceName = "自分のゲーム名",
placeId = game.PlaceId,
serverId = game.JobId,
robloxUserIds = ids,
})
end
task.spawn(function()
while task.wait(30) do
report()
end
end)
-- ⚠️ サーバーが閉じる時は空で送る=その部屋の人が全員消える
game:BindToClose(function()
call("POST", "/v1/presence", {
experienceId = game.GameId,
serverId = game.JobId,
robloxUserIds = {},
})
end)5. 「プレイ中」を見せるか決めてもらう
⚠️ **既定は見せません。** この口を叩かない限り、あなたのゲームで遊んでいることは誰にも出ません(本人が選ぶ物なので、こちらから勝手には出せない)。
-- ゲームの中に「遊んでいることを見せる」のスイッチを置いて、押された時に呼ぶ
call("POST", "/v1/presence-settings", {
robloxUserId = player.UserId,
show = true, -- false にすると誰にも出なくなる
name = "自分のゲーム名", -- 出す時の呼び名(省くとゲーム名)
})
-- ⚠️ 見せる先は「同じトークの人・友だち」まで。誰にでも見えるわけではありません。
-- ⚠️ スイッチは**ゲーム側に置いてください**。RobVerse側には出す場所がありません。
-- ⚠️ 押していない人にも毎回呼ばないこと(本人の選択を上書きすることになります)。6. ルームから抜ける
ゲーム側で誰かが抜けた時に呼びます。Vespo側の一覧からも消えます。
call("POST", "/v1/rooms/leave", {
roomId = "myGame:lobby",
robloxUserId = player.UserId,
})7. Vespo側の操作を受け取る
Vespo側(サイトやスマホ)で退出・名前変更された時に、ゲーム側へ伝わってくる伝言板です。
-- 入室時などに1回。届いた操作は実行したら ack を返す
local ops = call("GET", "/v1/room-ops?robloxUserId=" .. player.UserId)
for _, op in (ops and ops.ops or {}) do
-- op.kind は "leave" / "rename" / "icon_bg" など
-- ここで自分のゲーム側のデータを直す
call("POST", "/v1/room-ops/ack", { ids = { op.id } })
end覚えておくこと
キーはサーバーにだけ置く。
クライアント側に書くと、誰にでも見えてしまいます。
上限は同接に合わせて自動で伸びます(600 + 同接 × 1.5 回/分)。
人気が出たことが理由で止まることはありません。⚠️ 逆に、人が少ないのに呼びすぎると429になります。ループの中で毎フレーム呼ばないでください。
見られる数字は合計と推移だけ。
誰が何を言ったかは、開発者にも運営にも見せません。