์๋ ํ์ธ์.
ํ
๋ ๊ทธ๋จ ๋ด์ ์ฃผ์ ๋ก ํ ๊ธ์ ๋ง์ง๋ง ์จ๋ฆฌ์ค์ ์คํฌ์ ๋ํด ๊ธ์ ์ฐ๋ ์ฌ๋์ ๊ฑฐ์ ์๊ณ , ๋จ์ผ ๋ด์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํ ์ ๋ณด๋ ์ฐพ์ ์ ์์ด์ ๋ด์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ฒฝํ์ ๊ณต์ ํ๊ธฐ๋ก ํ์ต๋๋ค. ๋์ผํ ๊ธฐ๋ฅ์ ๊ฐ์ง ์ฌ์ดํธ์ ๋ํ ๊ฐ๋จํ Telegram ๋ด๊ณผ Yandex.Alice ๊ธฐ์ .
๋ฐ๋ผ์ ์น ์๋ฒ๋ฅผ ๊ตฌ์ถํ๊ณ SSL ์ธ์ฆ์๋ฅผ ์ป๋ ๋ฐฉ๋ฒ์ ๋ํด์๋ ์์ธํ ์ค๋ช
ํ์ง ์๊ฒ ์ต๋๋ค.
ํ ๋ ๊ทธ๋จ ๋ด ๋ง๋ค๊ธฐ
๋จผ์ Telegram ๋ด์ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฅผ ์ํด Telegram์ผ๋ก ์ด๋ํ์ฌ ๊ฑฐ๊ธฐ์์ BotFather ๋ด์ ์ฐพ์ต๋๋ค.
/newbot์ ์ ํํ์ธ์
์๋ตํ ๋ด์ ์ด๋ฆ์ ์
๋ ฅํ ๋ค์ ๋ด์ ์ด๋ฆ์ ์
๋ ฅํ๊ณ ์ด์ ๋ํ ์๋ต์ผ๋ก ๋ด์ ์ ์ดํ ํ ํฐ์ ๋ฐ๊ณ ์ด ํค๋ฅผ ์ ์ด๋๋ฉด ๋์ค์ ์ ์ฉํ ๊ฒ์
๋๋ค.
๋ค์ ๋จ๊ณ๋ ๋ด์์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ์๋ฒ๋ฅผ Telegram ์๋ฒ์ ์๋ ค์ฃผ๋ ๊ฒ์
๋๋ค. ์ด๋ฅผ ์ํด ๋ค์ ํ์์ ๋งํฌ๋ฅผ ๋ง๋ญ๋๋ค.
https: //api.telegram.org/bot___ะขะะะะ___/setWebhook?url=https://____ะะฃะขะฌ_ะะ_ะกะะ ะะะขะ___
____TOKEN___ ์ด์ ์ ๋ฐ์ ๋ด์ ํ ํฐ์ผ๋ก ๋์ฒดํฉ๋๋ค.
____PATH_TO_SCRIPT____ ๋ฐ์ดํฐ๊ฐ ์ฒ๋ฆฌ๋ ์๋ฒ์ ์คํฌ๋ฆฝํธ ์ฃผ์๋ก ๋ฐ๊ฟ๋๋ค(์:
์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. api.telegram.org ์๋ฒ๊ฐ ์ฐจ๋จ ์ค์ด์ง๋ง ์ด๋ ๊ฒ ํ ์ ์์ต๋๋ค. ์ ํ์ด ์๋ ๊ฐ์ฅ ์ ๋ ดํ ์๋ฒ๋ฅผ ์๋ํ๊ณ ์ด ์๋ฒ์ ์ฝ์์์ ๋ช ๋ น์ ๋ด๋ฆฌ์ธ์.
wget ___ะะะะฃะงะะะจะะะกะฏ_ะะะ ะะก___
์ด์ Telegram ๋ด์ด ์์ฑ๋์ด ์๋ฒ์ ์ฐ๊ฒฐ๋ฉ๋๋ค.
Yandex.Alisa์ ๋ํ ์คํฌ ์์ฑ
Yandex.Alice์ ๋ํ ์คํฌ ์์ฑ์ผ๋ก ๋์ด ๊ฐ์๋ค.
๊ธฐ์ ์ ์์ฑํ๋ ค๋ฉด Yandex.Dialogues ๊ฐ๋ฐ์ ํ์ด์ง๋ก ์ด๋ํด์ผ ํฉ๋๋ค.
์คํฌ ์ค์ ๋ํ ์์๊ฐ ์ด๋ฆฝ๋๋ค.
์คํฌ ์ค์ ์ ๋ค์ด๊ฐ๊ธฐ ์์ํฉ๋๋ค.
์คํฌ ์ด๋ฆ์ ์ ๋ ฅํ์ธ์.
ํ์ฑํ ์ด๋ฆ์ Alice๊ฐ ๋์์ค๋ก๋ถํฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ ์ ์๋๋ก ๋งค์ฐ ์ ์คํ๊ฒ ์ ํํด์ผ ํฉ๋๋ค. Alice์ Yandex.Station ๋๋ Irbis A์ ๊ฐ์ ์ด์ด ํฌํจ๋ ๋ชจ๋ฐ์ผ ์ ํ๋ฆฌ์ผ์ด์
์ ๋จ์ด๋ฅผ ๋ค๋ฅด๊ฒ ์ธ์ํ ์ ์์ต๋๋ค.
Telegram๊ณผ ๋์ผํ ๋ฐฉ์์ผ๋ก ์๋ฒ์ ์คํฌ๋ฆฝํธ ๊ฒฝ๋ก๋ฅผ ์
๋ ฅํ์ง๋ง ์๋ฅผ ๋ค์ด Alice๋ฅผ ์ํ ์คํฌ๋ฆฝํธ๊ฐ ๋ฉ๋๋ค.
์คํฌ์ด ๋งํ ๋ชฉ์๋ฆฌ๋ฅผ ์ ํํ๋๋ฐ, ์ ๋ ์จ๋ฆฌ์ค์ ๋ชฉ์๋ฆฌ๋ฅผ ๋ ์ข์ํฉ๋๋ค.
๋ชจ๋ฐ์ผ ์ฅ์น๋ ๋ธ๋ผ์ฐ์ ์์๋ง ์์
ํ๋ ค๋ ๊ฒฝ์ฐ "ํ๋ฉด์ด ์๋ ์ฅ์น๊ฐ ํ์ํฉ๋๋ค."๋ฅผ ์ ํํ์ธ์.
๋ค์์ผ๋ก Alice์ ์คํฌ ์นดํ๋ก๊ทธ ์ค์ ์ ์ ๋ ฅํฉ๋๋ค. ํ์ฑํ๋ฅผ ์ํด "๋ธ๋๋"๋ผ๋ ๋จ์ด๋ฅผ ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ webmaster.yandex.ru ์๋น์ค์์ ๋ธ๋๋ ์น์ฌ์ดํธ๋ฅผ ํ์ธํด์ผ ํฉ๋๋ค.
์ค์ ์ด ๋ชจ๋ ๋๋ฌ์ต๋๋ค. ์คํฌ๋ฆฝํธ๋ก ๋์ด ๊ฐ์๋ค.
ํ ๋ ๊ทธ๋จ ๋ด ์คํฌ๋ฆฝํธ
Telegram ์คํฌ๋ฆฝํธ๋ถํฐ ์์ํ๊ฒ ์ต๋๋ค.
๋ด๊ณผ Alice์ ๋ฉ์์ง๊ฐ ์ฒ๋ฆฌ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐ๊ฒฐํฉ๋๋ค.
include_once 'webhook_parse.php';
๋ด์ ํ ํฐ์ ์ค์ ํฉ๋๋ค.
$tg_bot_token = "_____YOUR_BOT_TOKEN_____";
๋ฐ์ดํฐ ์์ :
$request = file_get_contents('php://input');
$request = json_decode($request, TRUE);
๋ฐ์ดํฐ๋ฅผ ๋ณ์๋ก ๊ตฌ๋ฌธ ๋ถ์ํฉ๋๋ค.
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);
}
์ด์ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ ํ ์ ์์ต๋๋ค.
$tokens - ์ด์ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๋ชจ๋ ๋จ์ด๊ฐ ์ฌ๊ธฐ์ ์์ต๋๋ค.
$user_id - ์ฌ๊ธฐ์ ์ฌ์ฉ์ ID๊ฐ ์์ต๋๋ค.
$msg_chat_id - ๋ด์ด ๋ช ๋ น์ ๋ฐ์ ์ฑํ
$msg_user_name - ์ฌ์ฉ์ ์ด๋ฆ
๋ค์์ผ๋ก ์ฒ๋ฆฌ๋ฅผ ์ํด Parse_Tokens ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
$Out_Str = Parse_Tokens($tokens);
๊ทธ๋ฆฌ๊ณ ์๋ต์ ๋ณด๋ด์ธ์:
Send_Out($user_id, $Out_Str);
Send_Out ํจ์๋ ๊ฐ๋จํ๋ฉฐ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
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);
}
Yandex.Alisa์ ๊ธฐ์ ์คํฌ๋ฆฝํธ
์ด์ Alice์ ์คํฌ๋ฆฝํธ๋ก ๋์ด๊ฐ๊ฒ ์ต๋๋ค. Telegram์ ์คํฌ๋ฆฝํธ์ ๊ฑฐ์ ๋์ผํฉ๋๋ค.
๋ํ ๋ด๊ณผ Alice์ ๋ฉ์์ง๊ฐ ์ฒ๋ฆฌ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ Alice์ ๋ํ ํด๋์ค๊ฐ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐ๊ฒฐํฉ๋๋ค.
include_once 'classes_alice.php';
include_once 'webhook_parse.php';
๋ฐ์ดํฐ ์์ :
$data = json_decode(trim(file_get_contents('php://input')), true);
๋ฐ์ดํฐ๋ฅผ ๋ณ์๋ก ๊ตฌ๋ฌธ ๋ถ์ํฉ๋๋ค.
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'];}
}
}
์ฌ๊ธฐ์๋ ๋ช ๊ฐ์ง ๋ณ์๊ฐ ์์ต๋๋ค.
$tokens - ์ด์ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๋ชจ๋ ๋จ์ด๊ฐ ์ฌ๊ธฐ์ ์์ต๋๋ค.
$user_id - ์ฌ๊ธฐ์ ์ฌ์ฉ์ ID๊ฐ ์์ต๋๋ค.
Yandex๋ ๊ฒ์๋ ๊ธฐ์ ์ ์ง์์ ์ผ๋ก ํํ๋ฏ๋ก ๋ฉ์์ง์ ์ ์ฒด ์ฒ๋ฆฌ๋ฅผ ์์ํ์ง ์๊ณ ์คํฌ๋ฆฝํธ๋ฅผ ์ฆ์ ์ข ๋ฃํ๋ ์ค์ ์ถ๊ฐํ์ต๋๋ค.
if (strpos($tokens[0], "ping") > -1) {Send_Out("pong", "", true);}
์ฒ๋ฆฌ๋ฅผ ์ํด Parse_Tokens ํจ์๋ฅผ ํธ์ถํฉ๋๋ค. ์ด๋ Telegram๊ณผ ๋์ผํฉ๋๋ค.
$Out_Str = Parse_Tokens($tokens);
๊ทธ๋ฆฌ๊ณ ์๋ต์ ๋ณด๋ด์ธ์:
Send_Out($user_id, $Out_Str);
Send_Out ํจ์๋ ์ฌ๊ธฐ์์ ๋ ๋ณต์กํฉ๋๋ค.
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();
}
์จ๋ฆฌ์ค์ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ์ต๋๋ค.
Parse_Tokens ์ฒ๋ฆฌ ์คํฌ๋ฆฝํธ ์์ฒด๋ ์์ ํ ์์์ฉ์ผ๋ก ๋ง๋ค์ด์ง ๊ฒ์ด๋ฏ๋ก ์ฌ๊ธฐ์ ํ์ธํ๊ณ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
function Parse_Tokens($tokens)
{
$out = "";
// do something with tokens //
$out = "Your eneter " . count($tokens) . " words: " . implode($tokens, " ");
return $out;
}
์ง๋ฌธ-๋ต๋ณ๋ณด๋ค ๋ณต์กํ ํํ์ ์ฌ์ฉ์์ ์ํตํด์ผ ํ๋ค๋ฉด ์ฌ์ฉ์์ $user_id์ ์ฌ์ฉ์๋ก๋ถํฐ ์ด๋ฏธ ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค(์: mysql)์ ์ ์ฅํ๊ณ ๋ถ์ํด์ผ ํ๋ค. Parse_Tokens ํจ์.
์ค์ ๋ก ์ด๊ฒ์ ๊ฑฐ์ ๋ชจ๋ ๊ฒ์
๋๋ค. ๋ชจ๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์๋ฃ๋๋ฉด ์ด๋ฏธ Telegram ๋ด์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ Alice์ ๊ธฐ์ ์ ํ์ธํ ์ ์์ต๋๋ค
๋ชจ๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋ ๊ฒฝ์ฐ "์กฐ์ ์ฉ" ๋ฒํผ์ ํด๋ฆญํ์ฌ ์กฐ์ ์ฉ ์คํฌ์ ๋ณด๋ผ ์ ์์ต๋๋ค.
์ด์ ๋์ผํ ๋ฐฉ์์ผ๋ก ์๋ํ๋ ์๋ก ๋ค๋ฅธ ํ๋ซํผ์ ๋ํ ๋ ๊ฐ์ ๋ด์ด ๋์์ ์์ต๋๋ค.
Yandex.Dialogs ์๋น์ค์ ๋ํ ๋ฌธ์
github์ ๊ฒ์๋ ์ ์ฒด ์คํฌ๋ฆฝํธ
์ถ์ฒ : habr.com