An open API service indexing awesome lists of open source software.

https://github.com/jackchang1025/bbin-websocket-client

一个基于 Hyperf WebSocket Client 的 BBIN WebSocket 客户端,支持事件驱动、消息解析、心跳处理与简单投注消息封装
https://github.com/jackchang1025/bbin-websocket-client

baccarat bbin websocket

Last synced: 5 months ago
JSON representation

一个基于 Hyperf WebSocket Client 的 BBIN WebSocket 客户端,支持事件驱动、消息解析、心跳处理与简单投注消息封装

Awesome Lists containing this project

README

          

BBIN WebSocket Client(PHP)

一个基于 Hyperf WebSocket Client 的 BBIN WebSocket 客户端,支持事件驱动、消息解析、心跳处理与简单投注消息封装。

- 命名空间:`Weijiajia\\BbinWebSocketClient`
- 运行时依赖:`ext-swoole` (>=5.0)
- PHP 版本:>= 8.2

安装
```bash
composer require weijiajia/bbin-websocket-client
```

开发环境若暂时没有安装 Swoole,可在安装阶段忽略平台要求,但运行时仍需在具备 Swoole 的环境中执行:
```bash
composer install --ignore-platform-req=ext-swoole
```

推荐在 Docker 中使用官方 Swoole 运行时执行示例/测试:
```bash
docker run --rm -it -v $PWD:/app -w /app --network host swoole/swoole:php8.3 php -v
```

快速开始
```php
onOpen(function (WebsocketClient $client) {
echo "websocket connect success\n";
});

$client->onMessage(function (WebsocketClient $client, WebsocketMessage $message) {
// 全量消息广播
});

$client->onPing(function (WebsocketClient $client, WebsocketMessage $message) {
// 按协议回 pong(示例协议为原样发回)
$client->push($message->data());
});

$client->on('ready', function (WebsocketClient $client) {
$client->push([
'lang' => 'cn',
'vType' => 'wss',
'site' => '1',
'sid' => 'REPLACE_ME',
'action' => 'hallLogin',
]);
});

$client->on('onHallLogin', function (WebsocketClient $client) {
$client->push([
'dev' => [
'rd' => 'fx', 'ua' => 'UA', 'os' => 'Windows 10', 'dpr' => 1, 'pl' => 'H5',
],
'lang' => 'cn', 'vType' => 'wss', 'vtMode' => true,
'subscription' => ['example'],
'action' => 'login',
'sid' => 'REPLACE_ME',
]);
});

$client->on('onUpdateGameInfo', function (WebsocketClient $client, WebsocketMessage $message) {
$message->gameInfo()->each(function (LotteryResult $lotteryResult) {
echo $lotteryResult->getDeckNumber() . PHP_EOL;
});

$bet = new BetMessage();
$bet->betBanker(20);
$bet->gameCode = '57';
$bet->gameType = '3001';
$bet->roundSerial = 643386079;
$bet->sid = 'REPLACE_ME';
$client->bet($bet);
});

$client->on('onBet', function (WebsocketClient $client, WebsocketMessage $message) {
var_dump($message->data());
});

$client->onError(function (WebsocketClient $client, \\Throwable $e) {
var_dump($e->getMessage());
});

$client->onClose(function () {
echo "websocket close\n";
});

$client->start();
```

事件模型
- 通用事件:`on(string $event, callable $callback)`
- 语义化事件:`onOpen` / `onMessage` / `onPing` / `onError` / `onClose`

API 说明
WebsocketClient
- `__construct(string $host, array $headers = [])`
- `start(): void`、`stop(): void`、`close(): void`
- `push(array $data, int $opcode = WEBSOCKET_OPCODE_TEXT, ?int $flags = null): bool`
- `bet(BetMessage $betMessage): bool`

WebsocketMessage
- `static fromPayload(string $payload): self`
- `data(): array`、`isPing(): bool`、`action(): ?string`
- `assertNoProtocolError(): void`
- `gameInfo(): Collection`

LotteryResult(部分)
- `getDeckNumber()`、`getLastDeckNumber()`、`getNumber()`
- `getTransformationResult()`、`checkLotteryResults()`

BetMessage
- `betBanker(int $amount)` / `betPlayer(int $amount)`(最低 20)
- 设置 `gameType`, `gameCode`, `roundSerial`, `sid`
- `data(): array`

运行与示例
```bash
php src/example/WebsocketClient.php
```

在 Docker 中运行示例:
```bash
docker run --rm -it -v $PWD:/app -w /app --network host \
swoole/swoole:php8.3 php src/example/WebsocketClient.php
```

测试
```bash
composer install -n --prefer-dist
vendor/bin/pest --exclude-group=integration
vendor/bin/pest --group=integration
```

常见问题
- `Class "Swoole\\Coroutine\\Http\\Client" not found`:缺少 `ext-swoole`
- `连接失败: ...` 后跟 `websocket close`:检查 host 与网络
- JSON 解码异常:查看 `error` 事件输出

许可证:MIT