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

时间:2018-09-03 13:55:06

标签: php slack slack-api

我现在正在为我的频道创建一个非常小的斜线命令。我使用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);

现在,我不想像标题中已经提到的那样在频道中张贴推荐的斜杠,但是对于频道中的每个人,只有服务器的答案应该可见。我找不到适合的文章,所以我问自己:有可能吗?

有人有主意吗?

编辑: 我不希望这个懈怠也将我的命令作为消息发布。这样,只有第二条消息才会发布在频道中: see a screenshot

更新: 我现在已经实现了Erik Kalkoken的建议,但是我没有从curl函数得到任何信号。我还成功检查了我的Web服务器是否支持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);

工作解决方案: 再次考虑到Erik Kalkoken的建议后,它仍然没有起作用。这并不意味着他说错了。相反,我忘记了一些东西。我发现我的$ response数组需要编码为json字符串。在下面您可以看到一个有效的版本。感谢Erik Kalkoken!

    <?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);

1 个答案:

答案 0 :(得分:2)

当您将response_type设置为in_channel时,斜杠命令的标准行为将与您的斜杠命令相呼应。通常这是有道理的,因此该频道中的人们可以在看到斜杠命令之前就看到了该命令的结果。

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

与其直接回复Slack请求,不如将其响应作为新请求发送到response_url,该请求是您在初始请求中从Slack获得的。然后,您只能在通道中得到响应,并且不会回显斜杠命令本身。

顺便说一句。 documentation的“发送延迟的响应”部分中也对此行为进行了说明:

  

与即时响应消息一样,您可以包括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调用,可以顺便删除。