Избежание эха команды слэша для ответов in_channel - PullRequest
0 голосов
/ 03 сентября 2018

Я сейчас создаю очень маленькую команду слеша для своего канала. Я отправляю команду в скрипт PHP с использованием HTTPS 200, манипулирую ею и отправляю ее обратно в виде полезной нагрузки 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);

Теперь я не хочу размещать начальную косую черту в канале, как уже упоминалось в заголовке, но только ответ сервера должен быть видимым для всех в канале. Я не могу найти подходящую статью для этого, поэтому я спрашиваю себя: возможно ли это?

У кого-нибудь есть идея?

Edit: Я не хочу, чтобы этот провал также отправил мою команду как сообщение. Так что только второе сообщение является постом в канале: см. Скриншот

Обновление: Теперь я реализовал предложение Эрика Калкокена, но не получаю сигнал от функции 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);

Рабочий раствор: После повторного принятия совета Эрика Калкокена он все еще не работал. Что не значит, что он сказал что-то не так. Напротив, я кое-что забыл. Я обнаружил, что мой массив $ 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);

1 Ответ

0 голосов
/ 03 сентября 2018

Когда вы используете response_type, установленный на in_channel, это стандартное поведение для команд слеша, чтобы повторить вашу команду слеша. Обычно это имеет смысл, поэтому люди в этом канале могут видеть, что команда косой черты была проблемной, прежде чем они увидят ее результат.

Нет прямого способа отключить эту функцию эха, но есть простой обходной путь.

Вместо того чтобы отвечать непосредственно на запрос Slack, отправьте свой ответ как новый запрос на response_url, который вы получили от Slack в первоначальном запросе. Тогда вы получите ответ только в канале, и сама команда косой черты не будет отображена.

Btw. это поведение также объясняется в документации в разделе «Отправка отложенных ответов»:

Как и в случае немедленных ответных сообщений, вы можете включить поле 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 и может быть также удалена между прочим.

...