【问题标题】:Avoiding echo of slash command for in_channel responses避免 in_channel 响应的斜线命令回显
【发布时间】:2018-09-06 18:13:53
【问题描述】:

我现在正在为我的频道创建一个非常小的斜杠命令。我使用 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 函数中得到信号。我还成功检查了我的网络服务器是否支持 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);

【问题讨论】:

  • 好的,我该怎么办?我什至可以说 'text' => '' 来返回一个空文本。但我的问题是:如何防止初始斜杠命令也发布在频道中?
  • 从文本中删除命令?您可以使用 str_replace 执行此操作(如果它始终是相同的命令),或者使用 preg_replace 执行正则表达式。要么我不明白你的问题,要么答案真的和我写的一样简单:)
  • 我的意思是:如果我写“/mycommand Some Text”,那么 Slack 会将“/mycommand Some Text”作为来自我的普通消息发布,并将来自外部服务器的答案作为单独的消息附加。但我只想显示来自服务器的答案。
  • Argh sorry :D 在 $text = 和 $response = 变量之间,文本正在完全改变。我将更新我的问题以使其更易于理解。

标签: php slack slack-api


【解决方案1】:

当您使用 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' =&gt; 'One moment...'));

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

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

开头的header() php 命令不影响curl调用,顺便说一句也可以去掉。

【讨论】:

  • 我今天阅读了文档并进行了测试。但我无法让它工作。我应该用新代码更新我的问题还是应该如何继续?
  • 我测试了它,我可以确认它可以工作。所以是的,请使用您的最新代码更新您的问题,以便人们可以帮助您使其正常工作。
  • 我更新了我的答案,指出如何让您的代码按预期工作。
  • 是的,你的权利,而且 $response 应该被编码为 json 字符串。你帮了很多忙!谢谢
猜你喜欢
  • 2021-07-17
  • 2022-06-24
  • 2018-05-14
  • 2012-02-21
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
  • 2022-01-25
  • 2021-06-11
相关资源
最近更新 更多