# 17真人推筒子 API
## 環境
| | 網址 |
| -------- | -------- |
| 測試 | https://staging.17gaming.vip/ |
| 正式 | https://17gaming.vip/ |
## 認證資訊
請聯繫我司代理取得測試環境與正式環境連線資訊
## API
### 登入取得 JWT Token
#### Request
`POST /authenticate`
#### Parameter
| 參數 | 說明 | 其他 |
| -------- | -------- | -------- |
| username | 帳號 | String(必填) |
| password | 密碼 | String(必填) |
#### Response
```json=
{
"data": {
"id": "1022ebec-bb41-4c37-9952-99516a4d8cb3",
"name": "jb",
"username": "jb",
"nickname": "jb",
"wallet_type": "basic",
"status": "active",
"jwt_token": "eyJhbGciOiJIUzI1NiJ9.eyJwbGF0Zm9ybV9pZCI6MSwiZXhwIjoxNjI3NjMxNjk4fQ.1RDlAt7nViKwfyEzzPWCfCtBxa93RnxPL9Jbo37EndU",
"jwt_token_expires_at": 1627631698,
"secure_token": "62a10326-d67d-47d4-a2dd-28ec52ef620c",
"login_url": null,
"niuniu_min_bet": 100,
"niuniu_max_bet": 10000,
"baccarat_min_bet": 100,
"baccarat_max_bet": 10000
},
"meta": {
"request_id": "2d9994c9-413f-42bf-8498-1e8ef09317d8"
}
}
```
### 取得推筒子桌列表
#### Request
`GET /tongs`
#### Headers
`Authorization: Bearer 你的JWT_TOKEN`
#### Response
```json=
{
"data": [
{
"id": 1, //房間ID
"name": "推筒子房1", //房間名稱
"socket_url": "wss://17gaming.vip/cable?platform_token=eyJhbGciOiJIUzI1NiJ9.eyJwbGF0Zm9ybV9pZCI6MSwiZXhwIjoxNjI3NjMxNjk4fQ.1RDlAt7nViKwfyEzzPWCfCtBxa93RnxPL9Jbo37EndU", //房間 socket
"live_url": {
"flv": "https://nms-live.17gaming.vip/B37F07/6ADE7D.flv"" // flv視訊源,
"rtmp": "https://nms-rtmp.17gaming.vip/B37F07/6ADE7D.flv"" // RTMP視訊源
}
}
],
"meta": {
"request_id": "a6d072ee-ba39-45a8-8030-e1d91e5a3d22"
}
}
```
### 取得房間遊戲歷史
#### Request
`GET /tongs/{房間ID}/tong_game_records`
#### Parameter
| 參數 | 說明 | 其他 |
| -------- | -------- | -------- |
| start_at | 開始時間 | UNIX_TIMESTAMP(非必填,預設為24小時前,最多也僅可查詢一天內的紀錄) |
| end_at | 結束時間 | UNIX_TIMESTAMP(非必填,預設為當下) |
| page | 頁數 | Integer(非必填,預設為第一頁) |
| per_page | 單頁筆數 | Integer(非必填,預設為50筆,最大 100 筆) |
#### Headers
`Authorization: Bearer 你的JWT_TOKEN`
#### Response
```json=
{
"data": [
{
"game_no": "00AC700C4C91FED7", //遊戲局號
"status": "draw", //遊戲狀態,參考下方 status 事件
"draw": {
"banker": [ //莊家開牌牌面
0,
0
],
"player_1": [ //閒1開牌牌面
2,
2
],
"player_2": [ //閒2開牌牌面
3,
3
],
"player_3": [ //閒3開牌牌面
6,
6
]
},
"result": {
"banker": 20.0, // 莊家點數
"player_1": 12.0, // 閒1點數
"player_2": 13.0, // 閒2點數
"player_3": 16.0 // 閒3點數
},
"created_at": 1627619714, // 遊戲開始時間
"closed_at": 1627619772 // 遊戲結算時間
},
],
"meta": {
"total_pages": 1, // 總頁數
"page": 1, // 當前頁
"total_size": 1 // 本頁筆數
}
}
```
## 房間視訊源
視訊源提供 `http-flv` 與 `rtmp` 兩種格式,請使用[牌桌列表 API](#取得推筒子桌列表)中取得的的 `live_url` 來選擇你要使用的視訊源
## Websocket 連線方式
1. 連線至在[牌桌列表 API](#取得推筒子桌列表)中的 `socket_url`
2. 向 socket 發送下方訂閱資訊,其中 `identifier` 的內容型態為字串,`channel` 內容固定是 `TongRoomChannel`,`roomId`請帶入[牌桌列表 API](#取得推筒子桌列表)中取得的`id`
```json=
{
"command": "subscribe",
"identifier": "{\"channel\":\"TongRoomChannel\",\"roomId\":\"1\"}"
}
```
3. 收到以下資訊表示訂閱成功
```json=
{
"identifier":"{\"channel\":\"TongRoomChannel\",\"roomId\":\"1\"}",
"type":"confirm_subscription"
}
```
4. 收到以下資訊表示訂閱失敗
```json=
{
"identifier":"{\"channel\":\"TongRoomChannel\",\"roomId\":\"1\"}",
"type":"reject_subscription"
}
```
5. 你可以發送 ping 訊息來確認連線是否正常
```json=
{
"command": "message",
"identifier": "{\"channel\":\"TongRoomChannel\",\"roomId\":\"1\"}",
"data": "{\"type\":\"ping\"}"
}
```
若是連線正常則會回傳 pong 訊息
```json=
{
"identifier":"{\"channel\":\"TongRoomChannel\",\"roomId\":\"1\"}",
"message":{"data":"pong"}}
```
## 推筒子點數與牌面
1. 在 Websocket 傳送資訊中,會以`draw`來呈現該門的牌面,其中1~9的數字分別對應一筒到九筒,0代表白皮,例如`[0,3]`代表第一張牌為白皮而第二張牌為三筒
2. 在牌局結束時可在`result`中得到各門的點數計算
| 推筒子點數 | 對應API點數 | 說明 | 範例 |
| -------- | -------- | -------- | -------- |
| 0(鱉十) | 0 | 對應兩個牌面相加點數為10 | 🀚🀠 |
| 1~9點 | 1~9 | 對應兩個牌面相加點數 | 🀝🀜 |
| 半點 | 1.5~9.5 | 含有白皮組合的牌面,例如9.5為9點半 | 🀡🀆 |
| 對子 | 11~19 | 兩張牌為相同對子,例如14為四筒對子 | 🀜🀜 |
| 白皮對子 | 20 | 兩張牌皆為白皮 | 🀆🀆 |
## Websocket 事件
socket 資訊中會收到類似以下格式的資訊
```json=
{
"identifier":"{\"channel\":\"TongRoomChannel\",\"roomId\":\"1\"}",
"message":{
"data":{
"status":"startBet",
"gameNo":"CDAD597A59B715FA"
}
}
}
```
其中`identifier` 作為辨識訂閱房間的資訊,`message`為每次傳送的事件資訊,資訊都將包裝在`data`欄位中,在`data`中都將有`status`作為事件類型以及`gameNo`為每一局局號
### status 事件
`data`中皆有`status`作為事件類型,詳列如下:
#### `startBet`
開始下注(目前下注事件為30秒)
```json=
{
"status":"startBet",
"gameNo":"3DC1D2084687FF5F"
}
```
#### `stopBet`
停止下注
```json=
{
"status":"stopBet",
"gameNo":"3DC1D2084687FF5F"
}
```
#### `bankerDraw`
莊家開牌
```json=
{
"status":"bankerDraw",
"draw":[4,5],
"gameNo":"CDAD597A59B715FA"
}
```
#### `player1Draw`
閒1開牌
#### `player2Draw`
```json=
{
"status":"player1Draw",
"draw":[4,5],
"gameNo":"CDAD597A59B715FA"
}
```
閒2開牌
```json=
{
"status":"player2Draw",
"draw":[4,5],
"gameNo":"CDAD597A59B715FA"
}
```
#### `player3Draw`
閒3開牌
```json=
{
"status":"player3Draw",
"draw":[4,5],
"gameNo":"CDAD597A59B715FA"
}
```
#### `draw`
本局結算
```json=
{
"status":"draw",
"gameNo":"CDAD597A59B715FA",
"draw":
{
"banker":[3,4],
"player1":[4,5],
"player2":[9,9],
"player3":[7,6]
},
"result":{
"banker":7.0,
"player1":9.0,
"player2":19.0,
"player3":3.0
}
}
```
####