[Скрипт] Алиса и Википедия

Не требует установки программ или изменения файлов

Модераторы: immortal, newz20

skyrider
Сообщения: 138
Зарегистрирован: Ср ноя 22, 2017 11:46 am

Re: [Скрипт] Алиса и Википедия

Сообщение skyrider »

Перестал работать запрос к википедии, сценарий wiki:

Код: Выделить всё

$zap=$params['zapros']; //$zap='Дед Мороз';
say('Запрашиваю у Wikipedia информацию о '.$zap);
$zapurl=urlencode($zap);
$url='http://ru.wikipedia.org/w/api.php?action=opensearch&search='.$zapurl.'&prop=info&format=xml&inprop=url';
$answ=file_get_contents($url);
$xml = simplexml_load_string($answ);
$otvet=$xml->Section->Item->Description;
//echo $otvet;
//избавимся от ударений
$otvet=iconv("UTF-8","CP1251//IGNORE",$otvet);
$otvet=iconv("CP1251","UTF-8",$otvet);
$otvet = preg_replace("#\s\(.*?\)#isu", '', $otvet);
echo( $otvet);
say($otvet,2);
шаблон поведения с названием: (что такое|кто такой|кто такая) (.+)
в шаблоне поведения КОД runScript('wiki', array('zapros' => $matches[2]));

Раньше работало отлично, только у меня перестало работать или у всех?
Аватара пользователя
Krz
Сообщения: 22
Зарегистрирован: Сб мар 24, 2018 3:51 pm
Откуда: Сибирь

Re: [Скрипт] Алиса и Википедия

Сообщение Krz »

Раньше работало отлично, только у меня перестало работать или у всех?
Видимо у всех.
Поменялось API википедии. Раньше запрос возвращал информацию о искомом термине, сейчас выдает список страниц, где описываются созвучные с искомым термины. Вот старый код и перестал понимать получаемый от википедии ответ.
Изображение
Изображение
Аватара пользователя
Krz
Сообщения: 22
Зарегистрирован: Сб мар 24, 2018 3:51 pm
Откуда: Сибирь

Re: [Скрипт] Алиса и Википедия

Сообщение Krz »

Если править ваш код по быстрому, то получим вот это

Код: Выделить всё

$zap=$params['zapros']; //$zap='Дед Мороз';
say('Запрашиваю у Wikipedia информацию о '.$zap);
$zapurl=urlencode($zap);
$url='https://ru.wikipedia.org/w/api.php?action=query&prop=extracts&format=xml&exintro=&titles='.$zapurl;
$answ=file_get_contents($url);
$xml = simplexml_load_string($answ);
$otvet=$xml->query->pages->page->extract;
//echo $otvet;
//избавимся от ударений
$otvet=iconv("UTF-8","CP1251//IGNORE",$otvet);
$otvet=iconv("CP1251","UTF-8",$otvet);
$otvet = preg_replace("#\s\(.*?\)#isu", '', $otvet);
echo( $otvet);
say(strip_tags($otvet),2);
Правда есть недостаток, текст выдаваемый по данному запросу длинноват, да и запрос должен точно соответствовать названию страницы.
Нужно еще поискать решения, не известно сколько этот вариант проработает. А может они к старому формату вернутся и все само заработает.
Изображение
Изображение
Аватара пользователя
Krz
Сообщения: 22
Зарегистрирован: Сб мар 24, 2018 3:51 pm
Откуда: Сибирь

Re: [Скрипт] Алиса и Википедия

Сообщение Krz »

Вот, немного переработал

Код: Выделить всё

$zap=$params['zapros']; //$zap='Дед Мороз';
say('Запрашиваю у Wikipedia информацию о '.$zap);
$zapurl=urlencode($zap);
$url='https://ru.wikipedia.org/w/api.php?action=query&list=search&srlimit=1&format=xml&srsearch='.$zapurl;
$answ=file_get_contents($url);
$xml = simplexml_load_string($answ);
$otvet=$xml->query->search->p->attributes();
$zapurl=urlencode($otvet['title']);
$url='https://ru.wikipedia.org/w/api.php?action=query&prop=extracts&format=xml&exintro=&titles='.$zapurl;
$answ=file_get_contents($url);
$xml = simplexml_load_string($answ);
$otvet=$xml->query->pages->page->extract;
$otvet=iconv("UTF-8","CP1251//IGNORE",$otvet);
$otvet=iconv("CP1251","UTF-8",$otvet);
$otvet = preg_replace("#\s\(.*?\)#isu", '', $otvet);
if (empty($otvet)) { say ("Я не знаю такого слова",2);} else {
echo( $otvet);
//Оставляем первый абзац - начало
preg_match_all('#<p[^>]*?>(.+?)</p>#su', $otvet, $res);
$abz= $res[0][0];
$kstr = array("\r\n", "\n", "\r"); $lch = substr(str_replace($kstr, '', strip_tags($abz)), -1);
if ( $lch!=':') $otvet=$abz;
// Оставляем первый абзац - конец
 say(strip_tags($otvet),2);
}
В этом варианте выдает текст наиболее соответствующей запросу страницы. Например, страница "Паровой двигатель" не существует и предыдущий мой вариант кода ничего не выдавал, этот код выдаст сокращенную информацию с наиболее близкой страницы "Паровая машина".
API википедии теперь выдает относительно длинный текст, поэтому код оставляет только первый значащий абзац. Если желаете получать полное сообщение, то убрать часть кода ограниченную комментариями "Оставляем первый абзац " .
Изображение
Изображение
Skat136
Сообщения: 4
Зарегистрирован: Пн мар 30, 2020 6:42 pm

Re: [Скрипт] Алиса и Википедия

Сообщение Skat136 »

здравствуйте. у меня этот код сразу не заработал, переменная $params['zapros'] не получала сам запрос...
Вот немного подправил, так работает

Код: Выделить всё

 runScript('wiki', array($params = $matches[2]));
$zap=$params; //$zap='Дед Мороз';
say('Запрашиваю у Wikipedia информацию о '.$zap);
$zapurl=urlencode($zap);
$url='https://ru.wikipedia.org/w/api.php?action=query&list=search&srlimit=1&format=xml&srsearch='.$zapurl;
$answ=file_get_contents($url);
$xml = simplexml_load_string($answ);
$otvet=$xml->query->search->p->attributes();
$zapurl=urlencode($otvet['title']);
$url='https://ru.wikipedia.org/w/api.php?action=query&prop=extracts&format=xml&exintro=&titles='.$zapurl;
$answ=file_get_contents($url);
$xml = simplexml_load_string($answ);
$otvet=$xml->query->pages->page->extract;
$otvet=iconv("UTF-8","CP1251//IGNORE",$otvet);
$otvet=iconv("CP1251","UTF-8",$otvet);
$otvet = preg_replace("#\s\(.*?\)#isu", '', $otvet);
if (empty($otvet)) { say ("Я не знаю такого слова",2);} 
else {
echo( $otvet);
//Оставляем первый абзац - начало
preg_match_all('#<p[^>]*?>(.+?)</p>#su', $otvet, $res);
$abz= $res[0][0];
$kstr = array("\r\n", "\n", "\r"); $lch = substr(str_replace($kstr, '', strip_tags($abz)), -1);
if ( $lch!=':') $otvet=$abz;
// Оставляем первый абзац - конец
 say(strip_tags($otvet), 2);
} 
bootdrv
Сообщения: 18
Зарегистрирован: Вс июл 26, 2020 9:46 am

Re: [Скрипт] Алиса и Википедия

Сообщение bootdrv »

Ivan писал(а): Вт авг 25, 2015 10:14 pm http://majordomo.smartliving.ru/forum/v ... 0%BA%D0%BE
Иван, приветствую. Спасибо, попробую разобраться!
bootdrv
Сообщения: 18
Зарегистрирован: Вс июл 26, 2020 9:46 am

Re: [Скрипт] Алиса и Википедия

Сообщение bootdrv »

Skat136 писал(а): Чт апр 16, 2020 10:01 am здравствуйте. у меня этот код сразу не заработал, переменная $params['zapros'] не получала сам запрос...
Вот немного подправил, так работает

Код: Выделить всё

 runScript('wiki', array($params = $matches[2]));
$zap=$params; //$zap='Дед Мороз';
say('Запрашиваю у Wikipedia информацию о '.$zap);
$zapurl=urlencode($zap);
$url='https://ru.wikipedia.org/w/api.php?action=query&list=search&srlimit=1&format=xml&srsearch='.$zapurl;
$answ=file_get_contents($url);
$xml = simplexml_load_string($answ);
$otvet=$xml->query->search->p->attributes();
$zapurl=urlencode($otvet['title']);
$url='https://ru.wikipedia.org/w/api.php?action=query&prop=extracts&format=xml&exintro=&titles='.$zapurl;
$answ=file_get_contents($url);
$xml = simplexml_load_string($answ);
$otvet=$xml->query->pages->page->extract;
$otvet=iconv("UTF-8","CP1251//IGNORE",$otvet);
$otvet=iconv("CP1251","UTF-8",$otvet);
$otvet = preg_replace("#\s\(.*?\)#isu", '', $otvet);
if (empty($otvet)) { say ("Я не знаю такого слова",2);} 
else {
echo( $otvet);
//Оставляем первый абзац - начало
preg_match_all('#<p[^>]*?>(.+?)</p>#su', $otvet, $res);
$abz= $res[0][0];
$kstr = array("\r\n", "\n", "\r"); $lch = substr(str_replace($kstr, '', strip_tags($abz)), -1);
if ( $lch!=':') $otvet=$abz;
// Оставляем первый абзац - конец
 say(strip_tags($otvet), 2);
} 
Спасибо, Попробуем! У вас она без "CONNECT" работает? В "command" в этом шаблоне что у себя вписали? Я имею ввиду содержимое тело шаблона и нужны ли приоритеты? "(что такое|кто такой) (.+)"
Pr0gra2Mer
Сообщения: 19
Зарегистрирован: Ср янв 31, 2018 7:20 am
Откуда: Омск

Re: [Скрипт] Алиса и Википедия

Сообщение Pr0gra2Mer »

У меня только так заработало
Шаблон (К|к)то так(ой|ая) (.+)

runScript('wiki', array('zapros' => $matches[3]));

Сценарий wiki:
$zap=$params['zapros'];
//$zap='Дед Мороз';
say('Запрашиваю у Wikipedia информацию о '.$zap);
и тд...
Система на Lenovo G580
Я в CONNECT
Я в YouTube
Ответить