Yandex.Alice e Telegram bot em PHP com uma única funcionalidade

Boa tarde

Existem muitos artigos sobre o tema dos robôs de telegrama, mas poucos escrevem sobre habilidades para Alice, e eu não encontrei nenhuma informação sobre como criar um único bot, então decidi compartilhar minha experiência sobre como criar um bot de telegrama simples e o Yandex. tendo um único funcional.

Portanto, não vou lhe dizer como criar um servidor Web e obter um certificado SSL, já foi escrito o suficiente.

Criando um bot de Telegram


Primeiro, crie um bot do Telegram, para isso, vá ao Telegram e encontre o bot do BotFather lá.





Escolha / newbot



Nós inserimos o nome do bot pelo qual ele responderá, depois o nome do bot; em resposta, obtemos um token para controlar o bot, escrevemos essa chave, será útil para nós no futuro.



O próximo passo é informar aos servidores do Telegram para qual servidor enviar os dados do bot. Para fazer isso, faça um link do formulário:

https: //api.telegram.org/bot______/setWebhook?url=https://_________ 

___ TOKEN ___ substitua por nosso token de bot recebido anteriormente

____ PATH_DO_SCRIPT ___ é substituído pelo endereço do script em nosso servidor onde os dados serão processados ​​(por exemplo, www.my_server.ru/webhook_telegram.php ).

Há um problema, 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 do Telegram é criado e conectado ao seu servidor.

Criando uma habilidade para Yandex.Alice


Vamos continuar a criar a habilidade para o Yandex.Alice.

Para criar uma habilidade, você precisa acessar a página de desenvolvedores do Yandex.Dialogs, a página de desenvolvedores do Yandex.Dialogs, clique em "Criar caixa de diálogo" e selecione "Habilidade em Alice".



A caixa de diálogo de configurações de habilidades é aberta.



Começamos a inserir as configurações de habilidade.

Digite o nome da sua habilidade.



O nome da ativação deve ser selecionado com muito cuidado para que Alice o entenda corretamente, a partir das nuances - um aplicativo móvel com Alice e colunas como Yandex.Station ou Irbis A pode perceber as palavras de maneiras diferentes.

Nós inserimos o caminho para o script em nosso servidor da mesma maneira que para o Telegram, mas será um script especificamente para Alice, por exemplo, www.my_server.ru/webhook_alice.php .



Nós escolhemos a voz que a habilidade falará, eu prefiro a voz de Alice.



Se você planeja trabalhar apenas em dispositivos móveis ou em um navegador, selecione "Precisa de um dispositivo com uma tela".

Em seguida, insira as configurações do catálogo de habilidades de Alice. Se você planeja usar a palavra marca para ativação, precisa passar pela verificação do site da marca no serviço webmaster.yandex.ru.



Com as configurações, vá para os scripts.

Script de bot de telegrama


Vamos começar com o script do Telegram.

Nós conectamos a biblioteca onde as mensagens do bot e Alice serão processadas:

 include_once 'webhook_parse.php'; 

Definimos o token do nosso bot:

 $tg_bot_token = "_____YOUR_BOT_TOKEN_____"; 

Nós obtemos os dados:

 $request = file_get_contents('php://input'); $request = json_decode($request, TRUE); 

Analisamos 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 - agora todas as palavras que o usuário digitou aqui

$ user_id - aqui está o ID do usuário

$ msg_chat_id - bate-papo no qual o bot recebeu um comando

$ msg_user_name - nome de usuário

Em seguida, chamamos a função Parse_Tokens para processamento:

 $Out_Str = Parse_Tokens($tokens); 

E enviamos a resposta:

 Send_Out($user_id, $Out_Str); 

a função Send_Out é simples e tem a seguinte aparência:

 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.Alice


Agora, vamos ao roteiro de Alice, é quase o mesmo que para o Telegram.

Também conectamos a biblioteca onde as mensagens do bot e Alice serão processadas, além de uma biblioteca com classes para Alice:

 include_once 'classes_alice.php'; include_once 'webhook_parse.php'; 

Nós obtemos os dados:

 $data = json_decode(trim(file_get_contents('php://input')), true); 

Analisamos 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'];} } } 

Aqui as variáveis ​​necessárias são um pouco menos:

$ tokens - agora todas as palavras que o usuário digitou aqui

$ user_id - aqui está o ID do usuário

O Yandex constantemente aperta as habilidades publicadas, e eu 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 que para o Telegram:

 $Out_Str = Parse_Tokens($tokens); 

E enviamos a 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(); } 

Terminou o roteiro de Alice.

O script de processamento Parse_Tokens em si foi feito exclusivamente por exemplo, você pode fazer verificações 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 e resposta, precisará salvar no banco de dados (por exemplo, mysql) $ user_id do usuário e os dados já recebidos do usuário e analisá-los na função Parse_Tokens.

Na verdade, isso é quase tudo, se tudo for feito corretamente, o bot do Telegram já estará disponível. A habilidade de Alice pode ser verificada em dialogs.yandex.ru/developer , acessando sua nova habilidade na guia de testes.



Se tudo funcionar corretamente, você pode enviar a habilidade para moderação, clicando no botão "Moderação".

Agora você tem dois bots para plataformas diferentes que funcionam da mesma maneira.

Documentação do serviço Yandex.Dialog aqui

Os scripts completos são publicados no download do github.

Update: agrupou tudo nas classes e atualizou o repositório no github

Source: https://habr.com/ru/post/pt446174/


All Articles