Yandex.Alice e bot Telegram em PHP com funcionalidade unificada

Bom dia.

Há muitos artigos sobre bots do Telegram, mas poucos falam sobre habilidades para a Alice. Não encontrei informações sobre como criar um bot único, então decidi compartilhar minha experiência sobre como fazer um bot simples do Telegram e uma habilidade do Yandex.Alice para um site, que têm funcionalidades unificadas.

Então, como levantar um servidor web e obter um certificado ssl não vou explicar, já foi escrito o suficiente sobre isso.

Criando um bot no Telegram

Primeiro, vamos criar um bot do Telegram. Para isso, abrimos o Telegram e encontramos o bot BotFather.

Yandex.Alice e bot Telegram em PHP com funcionalidade unificada

Yandex.Alice e bot Telegram em PHP com funcionalidade unificada

Selecionamos /newbot

Yandex.Alice e bot Telegram em PHP com funcionalidade unificada

Digitamos o nome do bot, pelo qual ele irá responder, e depois digitamos o nome do bot. Em resposta, recebemos um token para gerenciar o bot, anotamos essa chave, pois será útil mais tarde.

Yandex.Alice e bot Telegram em PHP com funcionalidade unificada

O próximo passo é informar os servidores do Telegram para qual servidor enviar os dados do bot. Para isso, fazemos um link do tipo:

https://api.telegram.org/bot___TOKEN___/setWebhook?url=https://____CAMINHO_PARA_O_SCRIPT___

___TOKEN___ deve ser substituído pelo nosso token do bot, obtido anteriormente.

____CAMINHO_PARA_O_SCRIPT___ deve ser substituído pelo endereço do script em nosso servidor, onde os dados serão processados (por exemplo, www.meu_servidor.ru/webhook_telegram.php).

Aqui há um problema, o servidor api.telegram.org está bloqueado, mas é possível fazer o seguinte: alugar o mais barato servidor onde não há restrições e dar a esse servidor o comando

wget ___ENDERECO_OBTIDO___

Pronto, o bot do Telegram foi criado e está vinculado ao seu servidor.

Criando uma habilidade para o Yandex.Alice

Vamos passar para a criação de uma habilidade para o Yandex.Alice.

Para criar uma habilidade, você precisa ir à página de desenvolvedores do Yandex.Dialogs a página de desenvolvedores do Yandex.Dialogs, clicar em "Criar diálogo" e escolher "Habilidade na Alice".

Yandex.Alice e bot Telegram em PHP com funcionalidade unificada

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

Yandex.Alice e bot Telegram em PHP com funcionalidade unificada

Vamos começar a inserir as configurações da habilidade.

Digite o nome da sua habilidade.

Yandex.Alice e bot Telegram em PHP com funcionalidade unificada

O nome de ativação deve ser escolhido com muito cuidado, para que a Alice o entenda corretamente. De acordo com alguns detalhes, o aplicativo móvel com a Alice e colunas como Yandex.Station ou Irbis A podem entender as palavras de maneira diferente.

Digite o caminho para o script em nosso servidor da mesma forma que para o Telegram, mas este será um script especificamente para a Alice, por exemplo, www.meu_servidor.ru/webhook_alice.php.

Yandex.Alice e bot Telegram em PHP com funcionalidade unificada

Escolha a voz com a qual a habilidade irá falar, pessoalmente, eu prefiro a voz da Alice.

Yandex.Alice e bot Telegram em PHP com funcionalidade unificada

Se o trabalho se destina apenas a dispositivos móveis ou navegadores, escolha "Precisa de um dispositivo com tela".

Em seguida, vamos inserir as configurações para o diretório de habilidades da Alice. Se você planeja usar a palavra — marca, é necessário passar pela verificação do site da marca no serviço webmaster.yandex.ru.

Yandex.Alice e bot Telegram em PHP com funcionalidade unificada

Com as configurações tudo pronto, vamos para os scripts.

Script do bot do Telegram

Vamos começar com o script para o Telegram.

Conectamos a biblioteca, onde as mensagens do bot e da Alice serão processadas:

include_once 'webhook_parse.php';

Definimos o token do nosso bot:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Recebendo os dados:

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

Analisamos os dados em variáveis:

if (!$request)
{
  die();
    // Alguma saída de erro (requisição não é um JSON válido)
}
else if (!isset($request['update_id']) || !isset($request['message']))
{
  die();
    // Alguma saída de erro (requisição não tem mensagem)
}
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 podemos trabalhar com as variáveis:

$tokens — aqui estão agora todas as palavras que o usuário digitou

$user_id — aqui está o id do usuário

$msg_chat_id — o chat no qual o bot recebeu o comando

$msg_user_name — nome do 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 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 da habilidade para Yandex.Alice

Agora vamos para o script da Alice, que é quase igual ao do Telegram.

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

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

Recebendo 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 há um pouco menos de variáveis:

$tokens — aqui estão agora todas as palavras que o usuário digitou

$user_id — aqui está o id do usuário

O Yandex está sempre verificando as habilidades publicadas, e eu adicionei uma linha para sair imediatamente do script sem executar o processamento completo da mensagem:

  if (strpos($tokens[0], "ping") > -1) {Send_Out("pong", "", true);}

Chamamos a função Parse_Tokens para processamento, que é 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 é um pouco mais complicada aqui:

function Send_Out($user_id, $out_text, $out_tts = "", $is_end = false)
{
  global $data_msg_sess_id, $user_id;

  /////////// GERAR BASE DE SAÍDA ///////////
    $Data_Out = new Alice_Data_Out();
    $Data_Out->response = new Alice_Response();
    $Data_Out->session = new Alice_Session();
  /////////// GERAR BASE DE SAÍDA Fim ///////////

  /////////// GERAR MSG DE SAÍDA ///////////
  $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) 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();
}

Terminamos o script para a Alice.

O próprio script de processamento Parse_Tokens foi feito simplesmente como exemplo, você pode realizar quaisquer verificações e processamentos lá.

function Parse_Tokens($tokens)
{
  $out = "";
  // faça algo com os tokens //
  $out =  "Você digitou " . count($tokens) . " palavras: " . implode($tokens, " ");
  return $out;
}

Se você precisar de uma comunicação com o usuário mais complexa do que uma pergunta-resposta, você precisará armazenar na base de dados (por exemplo, mysql) o $user_id do usuário e já os dados recebidos do usuário e analisá-los na função Parse_Tokens.

Na verdade, isso é quase tudo, se tudo estiver corretamente configurado, o bot do Telegram já estará disponível, e você pode verificar a habilidade da Alice dialogs.yandex.ru/developer, acessando sua nova habilidade na aba de testes.

Yandex.Alice e bot Telegram em PHP com funcionalidade unificada

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

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

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

Os scripts completos estão disponíveis no GitHub baixar.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster