Bot Yandex.Alisa e Telegram em PHP com a mesma funcionalidade

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

Bot Yandex.Alisa e Telegram em PHP com a mesma funcionalidade

Bot Yandex.Alisa e Telegram em PHP com a mesma funcionalidade

Escolha /newbot

Bot Yandex.Alisa e Telegram em PHP com a mesma funcionalidade

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.

Bot Yandex.Alisa e Telegram em PHP com a mesma funcionalidade

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, www.my_server.ru/webhook_telegram.php).

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 Página do desenvolvedor Yandex.Dialogs, clique em "Criar diálogo" e selecione "Habilidade em Alice".

Bot Yandex.Alisa e Telegram em PHP com a mesma funcionalidade

A caixa de diálogo de configurações de habilidade será aberta.

Bot Yandex.Alisa e Telegram em PHP com a mesma funcionalidade

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

Digite o nome da sua habilidade.

Bot Yandex.Alisa e Telegram em PHP com a mesma funcionalidade

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 www.my_server.ru/webhook_alice.php.

Bot Yandex.Alisa e Telegram em PHP com a mesma funcionalidade

A gente escolhe a voz com que a skill vai falar, eu gosto mais da voz da Alice.

Bot Yandex.Alisa e Telegram em PHP com a mesma funcionalidade

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.

Bot Yandex.Alisa e Telegram em PHP com a mesma funcionalidade

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 dialogs.yandex.ru/developeracessando sua nova habilidade na guia de teste.

Bot Yandex.Alisa e Telegram em PHP com a mesma funcionalidade

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 aqui

Scripts completos postados no github baixar.

Fonte: habr.com

Adicionar um comentário