Давно мечтал, что бы компьютер со мной разговаривал, и вот сбылось - Алиса(MajorDoMo) говорит.
Настраивать все в методе commandReceived мне показалось уныло, так что для команд я создал объект voice_command и заполнил его нужными и не очень командами.
текст commandReceived теперь не меняется и выглядит так:
Код: Выделить всё
$command=$params['command'];
$short_command='';
$dt=recognizeTime($command,$short_command);
global $find;
$find='No';
//выход из режима Диалога - переход в командный режим
if (!getGlobal("ThisComputer.voice_command")
&&preg_match('/'.mb_strtolower("командный режим",'utf-8').'(.*)/is',mb_strtolower($command,'utf-8'),$m)){
callMethod("командный режим".".action");
return;
}
if (getGlobal("ThisComputer.voice_command")){
$objects=getObjectsByClass("voice_command");
foreach($objects as $obj) {
if (preg_match('/'.mb_strtolower($obj['TITLE'],'utf-8').'(.*)/is',mb_strtolower($command,'utf-8'),$m)) {
if ($dt>0) {
addScheduledJob("command".$dt,"processCommand('".$short_command."');",$dt);
say('Задача принята');
return;
}
callMethod($obj['TITLE'].".action",array("command"=>$m[1]));
$find='Yes';
}
}
if ($find=='No'){
say('Неизвестная команда: '.$command);
}
}else{
callMethod("Chat_request.action",array("command"=>$command));
}
исключение из общей обработки сделано для команды входа в режим команд.
Сами action у команд настроены по-разному. Примеры можно смотреть у меня в коннекте(msh555).
Теперь интеллектуальный чат.
Что бы не создавать самому с нуля я прикрутил хороший чат-бот iii.ru
Текст PHP украден здесь http://www.ab-log.ru/forum/viewtopic.php?f=1&t=475
У меня сходу не заработало, пришлось повозиться. Если будут вопросы - спрашивайте, помогу.
текст Chat_request.action (есть в коннекте)
Код: Выделить всё
class ModIiiRu
{
const IiiID = '3aecd642-3f4c-431d-8124-123906a34882';
public function cmd($cmd)
{
$data = json_encode(array(self::IiiID, $cmd));
$data = self::xorKey($data, false);
$data = self::sendMessage($data);
$data = json_decode($data);
$text = $data->result->text->value;
return $text;
}
private static function sendMessage($send){
$url='http://iii.ru/api/2.0/json/Chat.request';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 3);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $send);
$res = curl_exec($ch);
if (!$res)
return false;
curl_close($ch);
return self::xorKey($res, true);
}
public static function xorKey($res, $decode)
{
$key = "some very-very long string without any non-latin characters due to different string representations inside of variable programming languages";
$keylen = strlen($key);
$res = $decode ? base64_decode($res) : base64_encode($res);
$strlen = strlen($res);
$i = 0;
$result = '';
while ($i<$strlen)
{
$buf = $res[$i] ^ $key[$i % $keylen];
$result .= $buf;
$i++;
}
$result= $decode ? base64_decode($result) : base64_encode($result);
return $result;
}
}
$command=$params['command'];
$mod = new ModIiiRu();
say($mod->cmd($command));