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

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

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

skyrider
Сообщения: 136
Зарегистрирован: Ср ноя 22, 2017 11:46 am
Благодарил (а): 35 раз
Поблагодарили: 7 раз

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

Сообщение skyrider » Чт янв 16, 2020 10:27 pm

Перестал работать запрос к википедии, сценарий 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
Сообщения: 19
Зарегистрирован: Сб мар 24, 2018 3:51 pm
Откуда: Сибирь
Благодарил (а): 2 раза
Поблагодарили: 14 раз

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

Сообщение Krz » Ср янв 22, 2020 1:26 pm

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

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

Сообщение Krz » Ср янв 22, 2020 2:03 pm

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

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

$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
Сообщения: 19
Зарегистрирован: Сб мар 24, 2018 3:51 pm
Откуда: Сибирь
Благодарил (а): 2 раза
Поблагодарили: 14 раз

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

Сообщение Krz » Ср янв 22, 2020 4:20 pm

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

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

$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 википедии теперь выдает относительно длинный текст, поэтому код оставляет только первый значащий абзац. Если желаете получать полное сообщение, то убрать часть кода ограниченную комментариями "Оставляем первый абзац " .
За это сообщение автора Krz поблагодарили (всего 2):
xor (Ср янв 22, 2020 10:38 pm) • TrDA (Чт янв 23, 2020 12:50 pm)
Рейтинг: 2.44%
Изображение
Изображение
Skat136
Сообщения: 2
Зарегистрирован: Пн мар 30, 2020 6:42 pm
Благодарил (а): 0
Поблагодарили: 0

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

Сообщение 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);
} 
bootdrv
Сообщения: 18
Зарегистрирован: Вс июл 26, 2020 9:46 am
Благодарил (а): 3 раза
Поблагодарили: 0

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

Сообщение bootdrv » Пт июл 31, 2020 2:35 am

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

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

Сообщение bootdrv » Пт июл 31, 2020 2:40 am

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" в этом шаблоне что у себя вписали? Я имею ввиду содержимое тело шаблона и нужны ли приоритеты? "(что такое|кто такой) (.+)"
Ответить