微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将使用事件 APIHTTP 端点的 Slack 应用程序迁移到 Slack 套接字模式

如何解决将使用事件 APIHTTP 端点的 Slack 应用程序迁移到 Slack 套接字模式

我已经使用 PHP(HTTP 端点)实现了一个 Slack 应用程序。在 slack slash 命令下,我插入了请求 URL(指向我用 PHP 编写的代码以打开 Slack Modal 的 HTTP 端点),以打开一个对话框(Slack Modal)。提交表单后,它将转到 GitHub,我已在交互和快捷方式(有效负载)中的请求 URL 下插入了我用 PHP 编写的代码的 URL。

但由于安全措施,我想将应用程序迁移到套接字模式。有人可以告诉我如何在本地 VM 中为 PHP 实现套接字模式吗?

这是在slack中打开对话框的代码

<?PHP

$slack_token = 'xoxb-******************';

// Dialog Form:
$dialog = [
  'callback_id' => 'git_issue','title' => 'Add issue','submit_label' => 'Create','elements' => [
    [
      'type' => 'text','label' => 'Name','name' => 'name'
    ],[
      'type' => 'text','label' => 'E-mail','name' => 'email'
    ],$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,'https://slack.com/api/dialog.open');
curl_setopt($ch,CURLOPT_HTTPHEADER,[
    'Content-Type: application/x-www-form-urlencoded'
]);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,true);

// set the POST query parameters
curl_setopt($ch,CURLOPT_POST,CURLOPT_POSTFIELDS,http_build_query($query));

// execute curl request
$response = curl_exec($ch);

如何将应用迁移到socket模式?

提前致谢

解决方法

我使用这个自己编写的代码。可能它并不完美,但它有效:

<?php
    require 'vendor/autoload.php';
    
    // Slack config:
    $slack_token = 'xapp-*';
    $bot_token = 'xoxb-*';
    
    $url = false;
    
    $dialog = [
      'callback_id' => 'git_issue','title' => 'Add new GitHub Issue','submit_label' => 'Create','elements' => [
        [
          'type' => 'text','label' => 'Developer\'s Name','name' => 'name'
        ],]
    ];
    
    $ch = curl_init();
    curl_setopt($ch,CURLOPT_URL,'https://slack.com/api/apps.connections.open');
    curl_setopt($ch,CURLOPT_HTTPHEADER,[
        'Content-Type: application/x-www-form-urlencoded','Authorization: Bearer '.$slack_token
    ]);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
    curl_setopt($ch,CURLOPT_FOLLOWLOCATION,true);
    
    // set the POST query parameters
    curl_setopt($ch,CURLOPT_POST,true);
    
    // execute curl request
    $response = curl_exec($ch);
    
    // close
    curl_close($ch);
    
    if ($response) {
        $resp = json_decode($response);
        if (isset($resp->url)) {
            $url = $resp->url;
        }
    }
    
    if ($url) {
        echo 'Slack returned the websocket URL'.PHP_EOL;
        $client = new WebSocket\Client($url,['timeout' => 3600]);
        while (true) {
            try {
                $message = $client->receive();
                
                echo $message.PHP_EOL.PHP_EOL;
    
                if ($message) {
                    $data = json_decode($message);
                    if (isset($data->payload)) {
                        if (isset($data->payload->command) && $data->payload->command == '/git') {
                            // Open Dialog:
    
                            // define POST query parameters
                            $query = [
                                'token' => $bot_token,'dialog' => json_encode($dialog),'trigger_id' => $data->payload->trigger_id,];
    
                            // define the curl request
                            $ch = curl_init();
                            curl_setopt($ch,'https://slack.com/api/dialog.open');
                            curl_setopt($ch,[
                                'Content-Type: application/x-www-form-urlencoded'
                            ]);
                            curl_setopt($ch,true);
                            curl_setopt($ch,true);
    
                            // set the POST query parameters
                            curl_setopt($ch,CURLOPT_POSTFIELDS,http_build_query($query));
    
                            // execute curl request
                            $response = curl_exec($ch);
    
                            // close
                            curl_close($ch);
                            
                            $query = [
                                'envelope_id' => $data->envelope_id
                            ];
                            $client->text(json_encode($query));
                            // -----------
                        }
    
                        if (isset($data->payload->type) && $data->payload->type == 'dialog_submission') {
                            
                            // collect submitted data:
                            $name = $data->payload->submission->name;
                            
    
                            $query = [
                                'envelope_id' => $data->envelope_id,];
                            $client->text(json_encode($query));
                        }
                    }
                }
               
            } catch (\WebSocket\ConnectionException $e) {
                // Possibly log errors
                var_dump($e);
            }
        }
        $client->close();
    }

配置您的 Slack 应用并创建令牌:

  • 转到https://api.slack.com/apps页面并选择现有的一个或 创建一个新应用
  • 进入“基本信息”页面,找到“App-Level 令牌”部分。创建一个新令牌。我使用这些范围 “连接:写入,授权:读取”
  • 转到“OAuth & Permissions”页面并生成“Bot User OAuth Token”
  • 转到“斜线命令”页面并创建一个命令。在我的代码示例中,我们将它命名为“/git”
  • 转到“套接字模式”页面并使用滑动按钮启用该模式

对于通过 PHP 的 websockets 连接,我使用来自 GitHub 的 Textalk/websocket-php 实现。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。