---
# System prepended metadata

title: HSG Keyserver API 規格書

---

# HSG Keyserver API 規格書

> 目前HSG的訊號視訊和接收到的API桌號是不一致的，需要透過 https://play.kasar.live/assets/table.json 去mapping訊號。

## chart

```mermaid
graph TD

dealer[現場]-->strat_deal{荷官上桌開始發牌}
strat_deal-->|是| 通知24MIS解除桌檯維護
strat_deal-->|否| maintenance[維護]
通知24MIS解除桌檯維護-->操作Keypad後台解除桌檯維護
操作Keypad後台解除桌檯維護--> keypad後台通知KeyServer
keypad後台通知KeyServer--> KeyServer通知GameServer解除桌檯維護
KeyServer通知GameServer解除桌檯維護-->Cancel_Maintenance{解除桌檯維護成功}
Cancel_Maintenance-->|失敗| maintenance
Cancel_Maintenance-->|成功| keypad中場
keypad中場--> keypad_flow[keypad流程]
keypad_flow --> maintain{是否維護}
maintain-->|是| 荷官進入中場
maintain--> |否| keypad_flow
荷官進入中場--> 荷官通知24MIS進維護
荷官通知24MIS進維護--> maintenance

```

## API 位置
- 測試: keyserver.olacak.live:2570
- 正式機: keyserver.kasar.live:2570


## 維護
| Field   | Type   | Description                   |
| ------- | ------ |:----------------------------- |
| command | string | [牌桌狀態指令](#牌桌狀態指令) |
| type    | int    | [遊戲型別](#遊戲型別)         |
|id|string|牌桌桌號(會與其他遊戲共用桌號, 非唯一值)|
|time|timestamp|發送訊息時間|
|payload|object|資料依[牌桌狀態指令](#牌桌狀態指令)而異|
|&emsp;&emsp;maintenance|bool|是否維護中,true/false|

```json=

{
    "command":"X900",
    "type":1,
    "id":"A",
    "time":1602827720,
    "payload":{
        "maintenance": true // 維護狀態 true or false 
    }
}

```

## 中場

| Field   | Type   | Description                   |
| ------- | ------ |:----------------------------- |
| command | string | [牌桌狀態指令](#牌桌狀態指令) |
| type    | int    | [遊戲型別](#遊戲型別)         |
|id|string|牌桌桌號(會與其他遊戲共用桌號, 非唯一值)|
|time|timestamp|發送訊息時間|
|payload|object|資料依[牌桌狀態指令](#牌桌狀態指令)而異|

```json=

{
    "command":"X000",
    "type":1,
    "id":"A",
    "time":1602827720,
    "payload":null
}

```

## 遊戲中

| Field   | Type   | Description                   |
| ------- | ------ |:----------------------------- |
| command | string | [牌桌狀態指令](#牌桌狀態指令) |
| type    | int    | [遊戲型別](#遊戲型別)         |
|id|string|牌桌桌號(會與其他遊戲共用桌號, 非唯一值)|
|time|timestamp|發送訊息時間|
|payload|object|資料依[牌桌狀態指令](#牌桌狀態指令)而異|
|&emsp;&emsp;round|long|輪號|
|&emsp;&emsp;run|int|局號|
|&emsp;&emsp;status|int|[牌桌狀態](#牌桌狀態)|
|&emsp;&emsp;bettime|int|開始下注至結束下注秒數|
|&emsp;&emsp;cards|array|[數字牌型對應](#數字牌型對應)|
|&emsp;&emsp;dealer|object|荷官資料，牌桌狀態為`compute`(6) 才會帶值，其餘為`null`|
|&emsp;&emsp;&emsp;id|string|荷官ID|
|&emsp;&emsp;&emsp;name|string|荷官姓名|
|&emsp;&emsp;&emsp;photo|string|荷官圖片|

```json=
{
    "command":"X100",
    "type":1,
    "id":"A",
    "time":1602827720,
    "payload":{
        "round":1602827707,
        "run":1,
        "status":1,
        "bettime":30,
        "cards":[12,23,0,11,34,0],
        "dealer":{                 // if status is not compute(6), dealer will be null.
            "id":"123456",
            "name":"王小明"
            "photo":"http://XXXX.XXX.jpg"
        }
    }
}
```

## 更換荷官

| Field   | Type   | Description                   |
| ------- | ------ |:----------------------------- |
| command | string | [牌桌狀態指令](#牌桌狀態指令) |
| type    | int    | [遊戲型別](#遊戲型別)         |
|id|string|牌桌桌號(會與其他遊戲共用桌號, 非唯一值)|
|time|timestamp|發送訊息時間|
|payload|object|資料依[牌桌狀態指令](#牌桌狀態指令)而異|
|&emsp;&emsp;id|string|荷官ID|
|&emsp;&emsp;name|string|荷官姓名|
|&emsp;&emsp;photo|string|荷官圖片|

```json=
{
    "command":"X500",
    "type":1,
    "id":"A",
    "time":1602827720,
    "payload":{
        "id":"123456",
        "name":"王小明",
        "photo":"http://XXXX.XXX.jpg"
    }
}
```

## 牌桌狀態

| Number | Status    |
| ------ |:--------- |
| `1`    | newRound  |
| `2`    | newRun    |
| `3`    | startBet  |
| `4`    | endBet    |
| `5`    | deal      |
| `6`    | compute   |
| `7`    | cancelRun |

## 牌桌狀態指令
| Value  | Description |
|:------ |:----------- |
| `X000` | 中場        |
| `X100` | 遊戲中      |
| `X500` | 更換荷官    |
| `X900` | 維護        |

## 遊戲型別
| Value | Description |
|:----- |:----------- |
| `1`   | 百家樂      |
| `2`   | 骰寶        |
| `3`   | 輪盤        |
| `4`   | 色碟        |
| `5`   | 龍虎        |

## 數字牌型對應
#### 0-52數字陣列
#### 1. 百家樂順序為:Player1,Player2,Player3,Banker1,Banker2,Banker3
#### 2. 龍虎順序為:Dragon, Tiger
#### 3. 輪盤不適用以下數字排型對應, 順序第一個號碼為開出的號碼
#### 4. 色碟不適用以下數字排型對應, 順序第一個號碼為紅色碟數量
| Number | Card      | Number | Card      | Number | Card      | Number | Card     |
|:------ | --------- | ------ | --------- |:------ | --------- | ------ |:-------- |
| `1`    | `黑桃 1`  | `14`   | `紅心 1`  | `27`   | `方塊 1`  | `40`   | `梅花1`  |
| `2`    | `黑桃 2`  | `15`   | `紅心 2`  | `28`   | `方塊 2`  | `41`   | `梅花2`  |
| `3`    | `黑桃 3`  | `16`   | `紅心 3`  | `29`   | `方塊 3`  | `42`   | `梅花3`  |
| `4`    | `黑桃 4`  | `17`   | `紅心 4`  | `30`   | `方塊 4`  | `43`   | `梅花4`  |
| `5`    | `黑桃 5`  | `18`   | `紅心 5`  | `31`   | `方塊 5`  | `44`   | `梅花5`  |
| `6`    | `黑桃 6`  | `19`   | `紅心 6`  | `32`   | `方塊 6`  | `45`   | `梅花6`  |
| `7`    | `黑桃 7`  | `20`   | `紅心 7`  | `33`   | `方塊 7`  | `46`   | `梅花7`  |
| `8`    | `黑桃 8`  | `21`   | `紅心 8`  | `34`   | `方塊 8`  | `47`   | `梅花8`  |
| `9`    | `黑桃 9`  | `22`   | `紅心 9`  | `35`   | `方塊 9`  | `48`   | `梅花9`  |
| `10`   | `黑桃 10` | `23`   | `紅心 10` | `36`   | `方塊 10` | `49`   | `梅花10` |
| `11`   | `黑桃 J`  | `24`   | `紅心 J`  | `37`   | `方塊 J`  | `50`   | `梅花J`  |
| `12`   | `黑桃 Q`  | `25`   | `紅心 Q`  | `38`   | `方塊 Q`  | `51`   | `梅花Q`  |
| `13`   | `黑桃 K`  | `26`   | `紅心 K`  | `39`   | `方塊 K`  | `52`   | `梅花K`  |


## Web API

### Endpoint



| 環境 | 位址 | 
| -------- | -------- | 
| Stage     | http://stage.keypad.admin.kasar.live     | 
| Production | http://keypad.admin.kasar.live |

### 取得路圖資料
> GET /casino-api/v2/roadmap?tableId=F&round=1617867216&gameType=gameType

#### Query string
| 變數 | 型態 | 說明 |
| -------- | -------- | -------- |
| tableId | string | 桌號 |
| round | int | 輪號 |
| gameType | string | 遊戲類型 `Baccarat` `DragonTiger` |

#### Response
```json=
{
  "status": "success",
  "data": [
    {
      "TableName": "Baccarat", // 遊戲類型
      "HistoryId": 589927,     // 牌局紀錄編號
      "TableId": "B",          // 桌號
      "Round": 1602388403,     // 輪號
      "Run": 56,               // 局號
      "Result" : {
        "WinSpot": null,         // 輸贏注區
        "Cards": [0,0,0,0,0,0] //參考 數字牌型對應
      }
      "ModifiedStatus": "Canceled", // 狀態 Modified（改牌）, Canceled（取消）
      "ModifiedTime": "2020-10-11 12:34:58", // 修改時間
      "CreateTime": "2020-10-11 12:34:13" // 建立時間
    },
    ....
  ]
}
```

### 取得改單資料
建議每五分鐘調用一次即可
> GET /casino-api/v2/modify-game?modifyTime=2020-10-10%2020:00:00

#### Query string

| 變數 | 型態 | 說明 |
| -------- | -------- | -------- |
| modifyTime     | DateTime     | 會撈取 `modifyTime` 之後有改單的注單，使用的時區為 GMT+8 時間。   |

#### Response

```json=
{
  "status": "success",
  "data": [
    {
      "TableName": "Baccarat", // 遊戲類型
      "HistoryId": 589927,     // 牌局紀錄編號
      "TableId": "B",          // 桌號
      "Round": 1602388403,     // 輪號
      "Run": 56,               // 局號
      "Result" : {
        "WinSpot": null,         // 輸贏注區
        "Cards": [0,0,0,0,0,0] //參考 數字牌型對應
      }
      "ModifiedStatus": "Canceled", // 狀態 Modified（改牌）, Canceled（取消）
      "ModifiedTime": "2020-10-11 12:34:58", // 修改時間
      "CreateTime": "2020-10-11 12:34:13" // 建立時間
    },
    ....
  ]
}
```


### 平板驗證
> POST /casino-api/live-auth

#### Request parameter

| 變數 | 型態 | 說明 |
| -------- | -------- | -------- |
| gameType     | Enum    |  `Baccarat`、`DragonTiger`、`Roulette`   |
| tableId | String | 桌檯編號 |
| playerName | String | 玩家帳號 |
| verifyNumber| String | 四碼數字組成的字串 |


#### Response

```json=
{
    "status": "success",
    "data": {
        "gameType": "Baccarat",
        "tableId": "Q",
        "playerName": "Test123",
        "verifyNumber": "0000"
    }
}
```



### 查詢牌局

```
GET /casino-api/v2/game-history?
    gameType=<gameType>&
    tableId=<tableId>&
    round=<round>&
    run=<run>
```

#### Request parameter

| 參數名稱 | 參數型態 |     說明    |
|:--------:|:--------:|:-----------:|
|  gameType |  string  |   遊戲類型   |
|  tableId  |  string  |  桌號 |
|  round   | int |    輪號    |
|  run   | int |    局號    |



#### Response

##### Success
```json=
{
    "status": "success",
    "data": {
        "TableName": "Baccarat", // 遊戲類型
        "HistoryId": 589927,     // 牌局紀錄編號
        "TableId": "B",          // 桌號
        "Round": 1602388403,     // 輪號
        "Run": 56,               // 局號
        "Result" : {
        "WinSpot": null,         // 輸贏注區
            "Cards": [0,0,0,0,0,0] //參考 數字牌型對應
        }
        "ModifiedStatus": "Canceled", // 狀態 Modified（改牌）, Canceled（取消）
        "ModifiedTime": "2020-10-11 12:34:58", // 修改時間
        "CreateTime": "2020-10-11 12:34:13" // 建立時間
    }
}
```

##### Failed
```json=
{
    "status": "success",
    "data": null
}
```



## 視訊位址
目前提供 720p 和 420p 兩種位址 格式如下

### 百家樂
| 解析度 | 格式 | 範例 |
| -------- | -------- | -------- |
| 720p     | https://flv.kasar.live/bacc/tw_{桌號}-720.flv     | https://flv.kasar.live/bacc/tw_s.flv     |
| 480p     | https://flv.kasar.live/bacc/tw_{桌號}-480.flv     | https://flv.kasar.live/bacc/tw_s-480.flv     |

### 龍虎
| 解析度 | 格式 | 範例 |
| -------- | -------- | -------- |
| 720p     | https://flv.kasar.live/dt/tw_{桌號}-720.flv     | https://flv.kasar.live/dt/tw_a-720.flv     |
| 480p     | https://flv.kasar.live/dt/tw_{桌號}-480.flv     | https://flv.kasar.live/dt/tw_a-480.flv     |

### 輪盤

| 解析度 | 格式 | 範例 |
| -------- | -------- | -------- |
| 720p     | https://flv.kasar.live/rt/tw_{桌號}-720.flv     | https://flv.kasar.live/rt/tw_b-720.flv     |
| 480p     | https://flv.kasar.live/rt/tw_{桌號}-480.flv     | https://flv.kasar.live/rt/tw_b-480.flv     |

### 色碟

| 解析度 | 格式 | 範例 |
| -------- | -------- | -------- |
| 720p     | https://flv.kasar.live/sd/tw_{桌號}-720.flv     | https://flv.kasar.live/sd/tw_c-720.flv     |
| 480p     | https://flv.kasar.live/sd/tw_{桌號}-480.flv     | https://flv.kasar.live/sd/tw_c-480.flv     |


### 開放桌號

#### 百家樂
- E
- F 
- G
- H
- I
- J
- K
- L
- O
- P
` `
#### 龍虎 
- A

#### 輪盤
- B

#### 色碟
- C
- D

## 錄影位址

```text
https://dvr.kasar.live/<遊戲名稱代碼>/<桌號>/<輪號>/<輪號>-<局號>.mp4
```
桌號請參考[開放卓號](#開放桌號)，遊戲名稱代碼請參考下方表格，輪號局號為API取得。
### 遊戲名稱代碼


| 遊戲 | 代碼 | 
| -------- | -------- |
| 百家樂     | baccarat     |
| 龍虎 | dragon_tiger |
| 輪盤 | roulette |
| 色諜 | sedie |
| 骰寶 | sicbo |