gabrieljaime/wa-laravel

用于Laravel使用WhatsApp Baileys Api的包装器

dev-main 2022-08-07 06:55 UTC

This package is auto-updated.

Last update: 2024-09-07 11:40:17 UTC


README

[PT-BR] 此包增加了Laravel中使用WhatsApp的功能。它是一个包装器,利用由@tiagoandrepro/baileys-api提供的API,该API简化了@adiwajshing/Baileys库的使用。

安装

composer require rocketslab/wa-laravel

服务提供者将自动注册到Laravel中。

php artisan wa:install

上面的命令安装了JavaScript依赖项,包括介绍中提到的库。

可选地,您可以发布配置文件

php artisan vendor:publish --provider=RocketsLab\\WALaravel\\WALaravelServiceProvider

由于此包高度依赖WebSockets,因此已包含@beyondcode/laravel-websockets库。

启动服务

需要启动两个服务器:websocket和自己的库baileys-api

默认情况下,websocket服务器监听端口6001。可以使用其他端口和websocket的其他配置,所有这些都在beyondcode/laravel-websockets的文档中有描述。websocket的配置应按其文档中所述进行。

启动websocket服务器

php artisan websocket:serve

下一步是启动baileys-api服务器。

php artisan wa:serve

默认情况下,WA API服务器在本地主机上的端口3333启动通信。这些配置可以在config/wa-laravel配置文件中更改。

功能

此包装器通过触发事件并在应用程序中通过WebHooks通知发生的事件来运行,从而在WhatsApp中通知发生了什么。

包中已经包含了一个EventSubscriber和一个EventDispatcher来处理生成的事件,但如果您想对这些事件有更大的控制权,可以通过将配置文件config/walaravel.php中的register_events参数更改为false来禁用事件的自动注册。

服务器端

创建新会话

    /* Com o servidor da API iniciado...
    // O segundo parâmetro é opcional. E informa a API
    */ que é uma versão legada do WA 
      
    $wa = \RocketsLab\WALaravel\WhatsApp::factory();
    /* Recomenda-se remover a sessão existente */
    $wa->removeSession('session-id');   
    $wa->startSession('session-id', false);

方法返回的是由Laravel的Http客户端提供的Http/Response

发送消息

// No arquivo de rotas
Route::post('sendMessage', funciton(Request $request) {
    /* Pode-se extrair somente o necessário da requisição */
    $data = $request->only(['receiver', 'message', 'sessionId']);
    
    \RocketsLab\WALaravel\WhatsApp::factory()
        ->sendText(...$data);
})

客户端(Laravel Echo)

按照文档配置Laravel Echo。

API发送的钩子以POST请求的形式到达服务器,该包已预配置了这些路由,并且对于每个接收到的钩子,都会在服务器端触发一个事件,并将接收到的数据作为事件进行广播。

为了使客户端/浏览器能够接收这些事件并处理信息,需要在walaravel.{id-da-sessão}中监听一个特定的频道。

目前可以监听的事件有

以下是一个小例子

在布局文件(app.blade.php)中的更改...

在布局的头部中,我们需要移除对app.js的链接,并将此链接移到布局的body末尾。

<head>
    ....
    <!-- remover essa linha -->
    <link rel="stylesheet" href="{{ asset('js/app.js') }}" defer>
</head>
<body>
    ...
    <!-- incluir ela aqui no final -->
    <link rel="stylesheet" href="{{ asset('js/app.js') }}">
    @stack('scripts')
</body>

加载视图...

在加载视图的路线中,可以传递一个$sessionId属性来标识将接收事件的会话,这样如果发送了来自其他会话的事件,则会将其丢弃。

Route::get('whatsapp-config', function() { 
   
   $sessionId = 'my-session';
   return view('wa-config', compact('sessionId')); 

});

为会话my-session监听Echo...

在某个Blade视图中,在末尾放置@push块。这里的$sessionId是加载视图时作为返回接收的,可以是静态的或来自数据库。

<!-- VIEW: wa-config -->

@push('scripts') 
    <script>
        Echo.channel('{{ ".meesage-upsert.{$sessionId}" }}') 
            .listen('.message-upsert', ({ event }) => {
                console.log("MU: " + JSON.stringify(event))
            });
    </script>
@endpush

继续...

此文档正在WIP中,就像此包一样。

如有疑问或建议,请通过

oi@rocketslab.com.br

jjsquady 创建

合作者 tiagoandre

@2022 火箭实验室