避免 in_channel 响应的斜杠命令回显

Die*_*ion 4 php slack-api slack

我现在正在为我的频道创建一个非常小的斜线命令。我使用 HTTPS 200 将命令发送到 PHP 脚本,对其进行操作并将其作为 JSON 有效负载发送回,基本上如下所示:

<?php
header('Content-Type: application/json');

$text = $_POST['text'];

if ($text === "keyword") $answer = "Hello World";
else $answer = "Nothing in here";

$response = array(
  'response_type' => 'in_channel',
  'text' => $answer,
);

echo json_encode($response);
Run Code Online (Sandbox Code Playgroud)

现在我不想在标题中提到的频道中发布初始斜杠推荐,但只有服务器的答案应该对频道中的每个人可见。我找不到合适的文章,所以我问自己:这可能吗?

有人有主意吗?

编辑: 我不希望那个松弛也将我的命令作为消息发布。这样只有第二条消息会发布在频道中: 请参阅屏幕截图

更新: 我现在已经实现了 Erik Kalkoken 的建议,但我没有从curl 函数中得到信号。我还成功检查了我的网络服务器是否支持curl 功能。我的代码现在看起来像这样(代码已减少到必要):

<?php
header('Content-Type: application/json');

$response = array(
  'response_type' => 'in_channel',
  'text' => "> \\M2\Kunden\_Tutorial"
);

echo json_encode(array('text' => 'One moment...'));

$ch = curl_init($_POST['response_url']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $response);
$exec = curl_exec($ch);
curl_close($ch);
Run Code Online (Sandbox Code Playgroud)

可行的解决方案: 再次考虑 Erik Kalkoken 的建议后,它仍然不起作用。这并不意味着他说错了什么。相反,我忘记了一些事情。我发现我的 $response 数组需要编码为 json 字符串。下面您可以看到一个工作版本。感谢埃里克·卡尔科肯!

    <?php
    $response = array(
      'response_type' => 'in_channel',
      'text' => '> \\M2\Kunden\_Tutorial'
    );

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $_POST['response_url']);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($response));
    curl_setopt($ch, CURLOPT_POST, 1);
    $headers = array();
    $headers[] = "Content-Type: application/json";
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    $result = curl_exec($ch);
    curl_close ($ch);
Run Code Online (Sandbox Code Playgroud)

Eri*_*ken 6

当您使用response_type设置in_channel为斜杠命令的标准行为来回显斜杠命令时。这通常是有道理的,因此该频道中的人们可以在看到斜杠命令的结果之前就知道它是有问题的。

没有直接的方法可以关闭此回声功能,但有一个简单的解决方法。

不要直接回复 Slack 请求,而是将您的响应作为新请求发送到response_url您在初始请求中从 Slack 获得的 。然后你只能在频道中得到响应,并且斜线命令本身不会被回显。

顺便提一句。文档中的“发送延迟响应”部分也解释了此行为:

与立即响应消息一样,您可以包含 response_type 字段。但是,当您将 in_channel 的值与此延迟方法一起使用时,不包括调用该命令的原始文本。

我建议使用curl将请求发送到Slack。

使用curl 调用更新问题后进行编辑

您仍在返回对 Slack 请求的直接响应,这导致 Slack 回显用户命令。除了 200 OK(PHP 脚本会自动执行)之外,您不得返回任何内容。所以请删除这一行:

echo json_encode(array('text' => 'One moment...'));

我还建议通过添加以下行在curl 调用中包含正确的内容标头:

curl_setopt($curl, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);

header()开头的 php 命令不会影响curl 调用,也可以删除。