#laravel #chatbot
#laravel #чат-бот
Вопрос:
Возможно, я не использую для этого подходящий пакет чат-ботов (botman). Я бы хотел избежать использования драйвера Facebook, если это возможно. Мой идеальный сценарий — прослушать вопрос и быстро ответить ссылкой.
$bot->reply('click <a href="http://google.com">here</a> for answers.');
Это отображает только текст.
// controller code, activated after a hears() match
public function askReason()
{
$question = Question::create("If you have questions about $this->town, please visit their community page here:")
->fallback('Unable to ask question')
->callbackId('ask_reason')
->addButtons([
Button::create('Visit')->value('visit'),
Button::create('Ask Something Else')->value('continue')
]);
return $this->ask($question, function (Answer $answer) {
if ($answer->isInteractiveMessageReply()) {
if ($answer->getValue() === 'visit') {
header("Location: http://google.com");
exit();
} else {
$this->say('Alright, lets talk about something else.');
}
}
});
}
/**
* Start the conversation
*/
public function run()
{
$this->askReason();
}
Это выдает ошибку 405, когда выбран параметр «посещение», и я не могу изменить заголовок через xhr. Я также попробовал ‘return redirect(«http://google.com «)’
Кто-нибудь знает, как ответить в botman с помощью простой ссылки, перенаправления, чего-нибудь другого, кроме прямого текста?
Редактировать Это было мое решение. В окне чата, которое отображается в iframed, я добавил проверку на вставку DOMNode и вручную добавил ссылку.
<script>
var ready = true;
// set interval
setInterval(setready, 1000);
function setready() {
ready = true;
}
$(document).on('DOMNodeInserted', "#messageArea", function() {
if(ready == true)
{
setTimeout(replacelink, 200);
ready = false;
}
});
function replacelink() {
$('#messageArea .btn').each(function(){
text = $(this).html();
link = text.match(/(Link:)s(/[^<]*)/g);
if(link)
{
$(this).html(' ');
url = link.toString().substring(5);
text = text.match(/(.*)(Link:)/g).toString().substring(0,5);
$(this).empty();
$(this).html('<a href="' url '">' text '</a>');
$(this).addClass('linked');
}
else
{
$(this).addClass('linked');
}
});
}
</script>
Кажется, что окно перезагружается каждый раз при отправке сообщения, поэтому код должен выполняться каждый раз (например, вы не можете изменить функцию проверки готовности для поиска класса ‘linked’, который я пробовал. Я сохранил это для css-переходов, скрыв кнопки до тех пор, пока они не будут связаны.) В разговоре я делаю ссылку следующим образом:
public function askTown()
{
$slug = str_slug($this->town, '-');
$question = Question::create("If you have questions about $this->town, please visit their community page here:")
->fallback('Unable to ask question')
->callbackId('ask_reason')
->addButtons([
Button::create('Visit Link: /city/'.$slug)->value('visit'),
Button::create('Ask Something Else')->value('continue')
]);
return $this->ask($question, function (Answer $answer) {
if ($answer->isInteractiveMessageReply()) {
if ($answer->getValue() === 'visit') {
$this->say('Glad I could help!');
} else {
$this->say('Alright, let's talk about something else.');
}
}
});
}
Комментарии:
1. что, если вы поместите его в значение кнопки, а затем перенаправите, используя значение кнопки, на которую нажали? В значительной степени похоже на кнопку призыва к действию в разговоре
2. Хорошая идея! Я попробовал это и обновил свой вопрос, поскольку чувствую, что мы ближе, но теперь я получаю ошибку 405.
3. Какой драйвер вы используете в данный момент? Если вы используете что-то вроде веб-виджета, это означает, что ваш чат-фрейм является iframe внутри вашей страницы, и я предполагаю, что это проблема с перенаправлением.
4. Я предполагаю, что вам придется проверять наличие этой конкретной кнопки с помощью javascript и перенаправлять при ее нажатии, если это так
5. Да, я смог заставить это работать. Хотя это действительно очень хакерски. Я обновлю свой вопрос
Ответ №1:
Я решил эту проблему во внешнем интерфейсе, вставив ссылку во фрейм с помощью javascript. Подробности см. в моей правке
Комментарии:
1. Пожалуйста, разместите свой ответ здесь, а не оставляйте его как часть вопроса.