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

egismeteo.tcl - Погода с gismeteo.ru

СообщениеДобавлено: 20 дек 2014 20:41
tvrsh
Название: egismeteo.tcl
Версия: 1.0
Автор: tvrsh
Описание: Скрипт показывает погоду с сайта gismeteo.ru, написан на смену моей погоде с яндекса.
Поддержка Suzi: Да
Пример работы:
<tvrsh> !п Сакраменто
<+bionic> Сакраменто / Калифорния: Пасмурно, +12°C, Ветер юго-восточный: 5м/с(18 км/ч), Давление: 765мм.рт.ст, Влажность: 88%, Температура воды: +11°C.

Дополнительная информация:
Пока с минимальным функционалом, постепенно буду дописывать.
Ссылка на скрипт:

Re: egismeteo.tcl - Погода с gismeteo.ru

СообщениеДобавлено: 21 дек 2014 18:18
tvrsh
Переписал скрипт для работы с бета-версией нового сайта, добавил возможность использования алиасов городов.

Re: egismeteo.tcl - Погода с gismeteo.ru

СообщениеДобавлено: 22 дек 2014 16:28
Pitstopper
В патилайне при запросе погоды выдает такое:

Tcl error [::egismeteo::egismeteo_pub]: can't read "place": no such variable

Re: egismeteo.tcl - Погода с gismeteo.ru

СообщениеДобавлено: 22 дек 2014 19:14
Vertigo
Pitstopper писал(а):В патилайне при запросе погоды выдает такое:

Tcl error [::egismeteo::egismeteo_pub]: can't read "place": no such variable

IP твоего бота скорее всего забанен на сервере гисметео, потому и не сработал парсер в скрипте. Это уже прошедшая практика. Скриптом пользоваться в таком случае не получится.
Чтобы убедиться в этом, добавь код
set ncode [http::ncode $egismeteo_tok]
set code [http::code $egismeteo_tok]
if {$ncode != "200"} {putserv "PRIVMSG $chan :\00304HTTP-Error\003: $code"; return}

после строки
set d [::http::data $egismeteo_tok]

Вообще tvrsh ленится добавлять подобные проверки в скрипт, а они между прочим, значительно облегчают диагностику ошибок при работе скрипта.

Re: egismeteo.tcl - Погода с gismeteo.ru

СообщениеДобавлено: 24 дек 2014 16:02
Pitstopper
Vertigo, после добавления твоего кода - ситуация не изменилась, никаких сообщений в патилайне не добавилось. По прежнему - Tcl error [::egismeteo::egismeteo_pub]: can't read "place": no such variable.

Re: egismeteo.tcl - Погода с gismeteo.ru

СообщениеДобавлено: 24 дек 2014 19:00
Vertigo
Pitstopper писал(а):Vertigo, после добавления твоего кода - ситуация не изменилась, никаких сообщений в патилайне не добавилось. По прежнему - Tcl error [::egismeteo::egismeteo_pub]: can't read "place": no such variable.

После добавления моего кода, ошибка будет выводиться в канал, если она есть (ответ сервера отличен от 'HTTP/1.1 200 OK'. Ты бота рехашил после добавления кода?
Если это все равно не помогло, добавь строчку
set place [list]
перед строчкой
foreach {null aa} [regexp -all -inline -start 1 -- {<a class="js-crumb link b" .*?>(.*?)</a>} $d] {

Re: egismeteo.tcl - Погода с gismeteo.ru

СообщениеДобавлено: 27 дек 2014 14:08
tvrsh
Учел все замечания и добавил показ остальных городов через -2, -3, -4 и т.д.

Re: egismeteo.tcl - Погода с gismeteo.ru

СообщениеДобавлено: 27 дек 2014 17:36
Pitstopper
Теперь в патилайне такое:
Tcl error [::egismeteo::egismeteo_pub]: can't read "e": no such variable

Re: egismeteo.tcl - Погода с gismeteo.ru

СообщениеДобавлено: 27 дек 2014 17:47
Vertigo
Pitstopper, подозреваю, что у тебя бот не умеет работать с гзипом. В переменной с данными получается нечитаемая ксунта, поэтому парсер и не работает. В патилане набери .status и покажи строку с "Tcl version:". А в качестве панацеи попробуй заменить в скрипте
catch {set egismeteo_tok [::http::geturl "http://beta.gismeteo.ru/search/[::http::formatQuery $text]" -timeout "15000"]} error
на
catch {set egismeteo_tok [::http::geturl "http://beta.gismeteo.ru/search/[::http::formatQuery $text]" -timeout "15000" -headers [list "Accept-Encoding" None]]} error
и
catch {set egismeteo_tok [::http::geturl "http://beta.gismeteo.ru[lindex $f $r]" -timeout "15000"]} error
на
catch {set egismeteo_tok [::http::geturl "http://beta.gismeteo.ru[lindex $f $r]" -timeout "15000" -headers [list "Accept-Encoding" None]]} error

Если это все равно не поможет, могу посоветовать установить более новый тикль (8.6+) или пакет critctl.

Re: egismeteo.tcl - Погода с gismeteo.ru

СообщениеДобавлено: 27 дек 2014 17:58
Pitstopper
OS: Linux 3.12.28+
Библиотека Tcl: /usr/local/lib/tcl8.6
Версия Tcl: 8.6.0 (версия заголовка 8.6.0)
Tcl is threaded.

И да, ошибка все равно остается.

Re: egismeteo.tcl - Погода с gismeteo.ru

СообщениеДобавлено: 27 дек 2014 18:03
Vertigo
Чтоб поставить точку в этом вопросе, добавь следующий код (сохранив полученные данные в файл), чтоб не гадать что и как.
set f [open egismeteo.txt w+]; puts $f $d; flush $f; close $f

Добавь эту строчку после строчки
set d [::http::data $egismeteo_tok]

И выложи сюда или проанализируй сам содержимое файла egismeteo.txt в корневой директории бота.

Re: egismeteo.tcl - Погода с gismeteo.ru

СообщениеДобавлено: 27 дек 2014 18:09
Pitstopper
Ок, прикрепляю.

Re: egismeteo.tcl - Погода с gismeteo.ru

СообщениеДобавлено: 27 дек 2014 18:17
Vertigo
Pitstopper, у тебя в полученных данных в исходном коде страницы <div class="frame-current-weather">, а в скрипте парсится <div class="current-weather">. Могу посоветовать заменить строчку
regexp {<div class="current-weather">(.*?)<!-- frame forecast -->} $d "" e
на
regexp {<div.*?current-weather">(.*?)<!-- frame location -->} $d "" e
. Наверно гисметео отдаёт разные варианты страницы в зависимости от геолокации клиента. Не факт, что это поможет, ибо дальше тоже, вероятно будет ошибка в парсере. Мне, если честно, править лень чужой код ).

Re: egismeteo.tcl - Погода с gismeteo.ru

СообщениеДобавлено: 27 дек 2014 18:23
Pitstopper
В патилайне ошибок нет, а в канал выдает такое: /: /A=>, . Что ж, будем ждать, когда автор поправит. Спасибо за помощь!

Re: egismeteo.tcl - Погода с gismeteo.ru

СообщениеДобавлено: 15 апр 2015 23:10
Bart
Pitstopper писал(а):Tcl error [::egismeteo::egismeteo_pub]: can't read "e": no such variable

Тоже бывает такая ошибка, но не постоянно. Например, после рестарта некоторое время работает, потом отваливается.