weijiajia / bbin-websocket-client
BBIN WebSocket client based on Hyperf WebSocket Client
dev-main
2025-08-28 10:05 UTC
Requires
- php: >=8.2
- ext-swoole: ^5.0
- hyperf/websocket-client: 3.2.x-dev
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.75
- hyperf/ide-helper: ^3.0
- mockery/mockery: ^1.5
- pestphp/pest: 3.x
- swoole/ide-helper: ~5.0.0
- symfony/var-dumper: ^7.2
This package is not auto-updated.
Last update: 2025-08-28 16:35:34 UTC
README
BBIN WebSocket Client(PHP)
一个基于 Hyperf WebSocket Client 的 BBIN WebSocket 客户端,支持事件驱动、消息解析、心跳处理与简单投注消息封装。
- 命名空间:
Weijiajia\\BbinWebSocketClient
- 运行时依赖:
ext-swoole
(>=5.0) - PHP 版本:>= 8.2
安装
composer require weijiajia/bbin-websocket-client
开发环境若暂时没有安装 Swoole,可在安装阶段忽略平台要求,但运行时仍需在具备 Swoole 的环境中执行:
composer install --ignore-platform-req=ext-swoole
推荐在 Docker 中使用官方 Swoole 运行时执行示例/测试:
docker run --rm -it -v $PWD:/app -w /app --network host swoole/swoole:php8.3 php -v
快速开始
<?php require __DIR__ . '/vendor/autoload.php'; use Weijiajia\\BbinWebSocketClient\\WebsocketClient; use Weijiajia\\BbinWebSocketClient\\WebsocketMessage; use Weijiajia\\BbinWebSocketClient\\BetMessage; use Weijiajia\\BbinWebSocketClient\\LotteryResult; $client = new WebsocketClient('wss://example.com/fxLive/fxLB?gameType=h5multi3'); $client->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>
LotteryResult(部分)
getDeckNumber()
、getLastDeckNumber()
、getNumber()
getTransformationResult()
、checkLotteryResults()
BetMessage
betBanker(int $amount)
/betPlayer(int $amount)
(最低 20)- 设置
gameType
,gameCode
,roundSerial
,sid
data(): array
运行与示例
php src/example/WebsocketClient.php
在 Docker 中运行示例:
docker run --rm -it -v $PWD:/app -w /app --network host \
swoole/swoole:php8.3 php src/example/WebsocketClient.php
测试
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