Boa tarde.
Existem muitos artigos sobre bots do Telegram, mas poucas pessoas escrevem sobre habilidades para Alice, e não encontrei nenhuma informação sobre como fazer um único bot, então decidi compartilhar minha experiência sobre como fazer um bot Telegram simples e a habilidade Yandex.Alice para o site com a mesma funcionalidade.
Portanto, não vou dizer como criar um servidor da Web e obter um certificado SSL, já foi escrito o suficiente sobre isso.
Criando um bot do Telegram
Primeiro, vamos criar um bot Telegram, para isso vamos ao Telegram e encontramos o bot BotFather lá.
Escolha /newbot
Inserimos o nome do bot pelo qual ele responderá, a seguir inserimos o nome do bot, em resposta obtemos um token para controlar o bot, anotamos esta chave, será útil para nós no futuro.
A próxima etapa é informar aos servidores do Telegram para qual servidor enviar dados do bot. Para fazer isso, fazemos um link do formulário:
https: //api.telegram.org/bot___ТОКЕН___/setWebhook?url=https://____ПУТЬ_ДО_СКРПИТА___
___TOKEN___ substituímos pelo nosso token do bot, recebido anteriormente
____PATH_TO_SCRIPT____ substituímos pelo endereço do script em nosso servidor onde os dados serão processados (por exemplo,
Há um problema aqui, o servidor api.telegram.org está bloqueado, mas você pode fazer isso: alugue o servidor mais barato onde não há restrições e dê o comando no console deste servidor
wget ___ПОЛУЧИВШИЙСЯ_АДРЕС___
É isso, o bot Telegram é criado e conectado ao seu servidor.
Criando uma habilidade para Yandex.Alisa
Vamos criar uma habilidade para Yandex.Alice.
Para criar uma habilidade, você precisa ir para a página de desenvolvedores do Yandex.Dialogues
A caixa de diálogo de configurações de habilidade será aberta.
Começamos a inserir as configurações de habilidade.
Digite o nome da sua habilidade.
O nome da ativação deve ser escolhido com muito cuidado para que Alice o entenda corretamente, desde as nuances - um aplicativo móvel com Alice e colunas como Yandex.Station ou Irbis A pode perceber as palavras de maneira diferente.
Entramos no caminho para o script em nosso servidor da mesma forma que no Telegram, mas será um script específico para Alice, por exemplo
A gente escolhe a voz com que a skill vai falar, eu gosto mais da voz da Alice.
Se você planeja trabalhar apenas em dispositivos móveis ou em um navegador, selecione "Você precisa de um dispositivo com tela".
Em seguida, insira as configurações do catálogo de habilidades de Alice. Se você planeja usar a palavra "marca" para ativação, verifique o site da marca no serviço webmaster.yandex.ru.
Isso é tudo com as configurações, vamos passar para os scripts.
Script de bot de telegrama
Vamos começar com um script para Telegram.
Conectamos a biblioteca onde serão processadas as mensagens do bot e de Alice:
include_once 'webhook_parse.php';
Definimos o token do nosso bot:
$tg_bot_token = "_____YOUR_BOT_TOKEN_____";
Recebemos dados:
$request = file_get_contents('php://input');
$request = json_decode($request, TRUE);
Analisando os dados em variáveis:
if (!$request)
{
die();
// Some Error output (request is not valid JSON)
}
else if (!isset($request['update_id']) || !isset($request['message']))
{
die();
// Some Error output (request has not message)
}
else
{
$user_id = $request['message']['from']['id'];
$msg_user_name = $request['message']['from']['first_name'];
$msg_user_last_name = $request['message']['from']['last_name'];
$msg_user_nick_name = $request['message']['from']['username'];
$msg_chat_id = $request['message']['chat']['id'];
$msg_text = $request['message']['text'];
$msg_text = mb_strtolower($msg_text, 'UTF-8');
$tokens = explode(" ", $msg_text);
}
Agora você pode trabalhar com variáveis:
$tokens - aqui estão agora todas as palavras que o usuário digitou
$user_id - ID do usuário aqui
$msg_chat_id - chat no qual o bot recebeu o comando
$msg_user_name - nome de usuário
Em seguida, chamamos a função Parse_Tokens para processamento:
$Out_Str = Parse_Tokens($tokens);
E envie uma resposta:
Send_Out($user_id, $Out_Str);
a função Send_Out é simples e se parece com isso:
function Send_Out($user_id, $text, $is_end = true)
{
global $tg_bot_token;
if (strlen($user_id) < 1 || strlen($text) < 1) {return;}
$json = file_get_contents('https://api.telegram.org/bot' . $tg_bot_token . '/sendMessage?chat_id=' . $user_id . '&text=' . $text);
}
Script de habilidade para Yandex.Alisa
Agora vamos passar para o script de Alice, é quase o mesmo do Telegram.
Também conectamos a biblioteca onde serão processadas as mensagens do bot e da Alice, além de uma biblioteca com classes para a Alice:
include_once 'classes_alice.php';
include_once 'webhook_parse.php';
Recebemos dados:
$data = json_decode(trim(file_get_contents('php://input')), true);
Analisando os dados em variáveis:
if (isset($data['request']))
{
//original_utterance
if (isset($data['meta']))
{
$data_meta = $data['meta'];
if (isset($data_meta['client_id'])) {$client_id = $data_meta['client_id'];}
}
if (isset($data['request']))
{
$data_req = $data['request'];
if (isset($data_req['original_utterance']))
{
$original_utterance = $data_req['original_utterance'];
}
if (isset($data_req['command'])) {$data_msg = $data_req['command'];}
if (isset($data_req['nlu']))
{
$data_nlu = $data_req['nlu'];
if (isset($data_nlu['tokens'])) {$tokens = $data_nlu['tokens'];}
// $data_token_count = count($data_tokens);
}
}
if (isset($data['session']))
{
$data_session = $data['session'];
if (isset($data_session['new'])) {$data_msg_new = $data_session['new'];}
if (isset($data_session['message_id'])) {$data_msg_id = $data_session['message_id'];}
if (isset($data_session['session_id'])) {$data_msg_sess_id = $data_session['session_id'];}
if (isset($data_session['skill_id'])) {$skill_id = $data_session['skill_id'];}
if (isset($data_session['user_id'])) {$user_id = $data_session['user_id'];}
}
}
Existem algumas variáveis a menos aqui:
$tokens - aqui estão agora todas as palavras que o usuário digitou
$user_id - ID do usuário aqui
O Yandex faz ping constantemente nas habilidades publicadas e adicionei uma linha para sair imediatamente do script sem iniciar o processamento completo da mensagem:
if (strpos($tokens[0], "ping") > -1) {Send_Out("pong", "", true);}
Chamamos a função Parse_Tokens para processamento, é a mesma do Telegram:
$Out_Str = Parse_Tokens($tokens);
E envie uma resposta:
Send_Out($user_id, $Out_Str);
A função Send_Out é mais complicada aqui:
function Send_Out($user_id, $out_text, $out_tts = "", $is_end = false)
{
global $data_msg_sess_id, $user_id;
///// GENERATE BASE OF OUT //////
$Data_Out = new Alice_Data_Out();
$Data_Out->response = new Alice_Response();
$Data_Out->session = new Alice_Session();
///// GENERATE BASE OF OUT End //////
///// OUT MSG GENERATE /////
$Data_Out->session->session_id = $data_msg_sess_id;;
$Data_Out->session->user_id = $user_id;
$Data_Out->response->text = $out_text;
$Data_Out->response->tts = $out_tts;
if (strlen($out_tts) < 1) {$Data_Out->response->tts = $out_text;}
$Data_Out->response->end_session = $is_end;
header('Content-Type: application/json');
print(json_encode($Data_Out, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT));
die();
}
Terminei o roteiro de Alice.
O próprio script de processamento do Parse_Tokens foi feito apenas para um exemplo, você pode fazer qualquer verificação e processamento lá.
function Parse_Tokens($tokens)
{
$out = "";
// do something with tokens //
$out = "Your eneter " . count($tokens) . " words: " . implode($tokens, " ");
return $out;
}
Se você precisar se comunicar com um usuário de uma forma mais complexa do que uma pergunta-resposta, precisará salvar o $user_id do usuário e os dados já recebidos do usuário no banco de dados (por exemplo, mysql) e analisá-los em a função Parse_Tokens.
Na verdade, isso é quase tudo, se tudo for feito corretamente, o bot do Telegram já está disponível, a habilidade de Alice pode ser verificada
Se tudo funcionar corretamente, você pode enviar a habilidade para moderação clicando no botão "Para moderação".
Agora você tem dois bots para plataformas diferentes ao mesmo tempo, que funcionam da mesma forma.
Documentação para o serviço Yandex.Dialogues
Scripts completos postados no github
Fonte: habr.com