Страница 9 из 9

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

Добавлено: Чт янв 16, 2020 10:27 pm
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]));

Раньше работало отлично, только у меня перестало работать или у всех?

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

Добавлено: Ср янв 22, 2020 1:26 pm
Krz
Раньше работало отлично, только у меня перестало работать или у всех?
Видимо у всех.
Поменялось API википедии. Раньше запрос возвращал информацию о искомом термине, сейчас выдает список страниц, где описываются созвучные с искомым термины. Вот старый код и перестал понимать получаемый от википедии ответ.

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

Добавлено: Ср янв 22, 2020 2:03 pm
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);
Правда есть недостаток, текст выдаваемый по данному запросу длинноват, да и запрос должен точно соответствовать названию страницы.
Нужно еще поискать решения, не известно сколько этот вариант проработает. А может они к старому формату вернутся и все само заработает.

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

Добавлено: Ср янв 22, 2020 4:20 pm
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 википедии теперь выдает относительно длинный текст, поэтому код оставляет только первый значащий абзац. Если желаете получать полное сообщение, то убрать часть кода ограниченную комментариями "Оставляем первый абзац " .