Буквально ночью того же дня, когда выпустил релиз погодного транспорта для Jabber, набросал функцию для получения погодных данных и с https://meteonova.ru. По аналогии с RSS-транспортом, задействован python-feedparser – хотя, при желании, можно было бы использовать что-то попроще: из RSS-ленты берется только title и description и на этом работа feedparser’а заканчивается.
Так или иначе, код вышел ощутимо компактнее варианта для работы с gismeteo; большей частью идет split() полученных данных на составляющие, после чего идет форматирование вывода. Главное, чтобы Meteonova не меняла структуру данных.
Выбор источника данных сделан опцией в конфиге; в коде при этом просто объявляется одна и та же функция, но с разным телом. По коду почти полностью убрано упоминание gismeteo.ru и описание сделано более нейтральным. Кроме того, теперь у ботов в качестве ресурса (а у транспорта в service discovery) пишется источник данных, чтобы было понятно, откуда берутся данные (привет, gismeteo.ua!*).
Пока писал это – подумалось, что можно было бы действительно менять только тело функции, а не переключаться между двумя объявленными функциями. С другой стороны, так проще дописывать новые источники данных – можно целиком отладить новую функцию в отдельном файле, а потом просто влить ее в основной скрипт (или сделать include). Еще сейчас чуть-чуть смущает отдельное кэширование для сообщений о погоде и для статуса – хотя источник данных один и тот же. Фактически, делается 2 запроса, хотя можно обойтись одним. Но это нечастая ситуация, так что пусть пока живет – может потом поправлю.
* – насчет gismeteo.ua. На этапе сбора базы общался с их представителями, спрашивал насчет аналога XML’ки, как на gismeteo.ru – хотелось иметь какой-то локальный вариант, ибо gismeteo.ru напрямую недоступен (собственно, ради того и добавил функции прокси – хотя все равно потом транспорт будет крутиться на сервере, где все работает и без того), плюс есть несколько населенных пунктов, отсутствующих на RU-версии. В общем, фиг там. В противовес API для gismeteo.ru, которое просто работает больше десятка лет и просто используется в самых разных проектах без каких-либо требований, на gismeteo.ua ничего так и не предложили, зато активно проталкивали тему того, куда б в выводе пользователю побольше натыкать копирайтов. В итоге разговор так и закончился ничем, на очередное мое сообщение я просто не получил ответ.
Да, собственно, и черт с ними теперь. Есть несколько datasource; у Meteonova в том числе есть тот населенный пункт, который меня интересовал на gismeteo.ua. При желании теперь вполне можно легко добавить дополнительные источники данных.
UPDATE (v 1.2): еще одно внушительное обновление вышло – переделал упомянутое выше двойное кэширование. Фактически, сейчас у функции get_gism() минимальные функции, там просто идет трансляция JID’а в код и его проверка. Код кэша перенесен непосредственно в функцию получения погоды. Кэшируется теперь не отформатированный вывод, а непосредственно выдача с сайта, поэтому нет разделения на “полный” и “сокращенный” кэши. При изменениях статуса теперь, как и раньше, идет запрос данных, а вот потом в ответ на сообщение боту их можно получить уже без задержки.
Код кэша чуть поправил, ибо раньше старые значения никогда не удалялись, что на больших аптаймах приводило бы к повышенному расходу памяти. Идей о том, как сделать отдельную функцию, занимающуюся кэшированием данных, так и не придумал – одинаковых строк буквально 3 штуки и их сложно вынести отдельно в том виде, в котором оно сейчас есть, поэтому в каждом блоке кода (для gismeteo и meteonova) кэш описан отдельно.
И да, в процессе причесывания кода перед прошлым релизом закралась ошибка – код подключения к прокси был вынесен за пределы функции и это привело к тому, что и сам транспорт пытался подключиться через прокси. Так что пришлось вернуть объявление прокси и import urllib2 обратно в функцию, оставив снаружи только импорт самого прокси.
Ну и сделал мелкие изменения касательно ресурса в JID’e – теперь при уходе клиента оффлайн “отключаются” боты на всех ресурсах. Раньше, если сменить источник данных у транспорта (притянутая ситуация, но все же), то долгое время могли висеть “мертвые” ресурсы.
Update, v 1.3: сделал разделение баз для каждого из ресурсов. Ну реально, зачем собирать самую-самую большую базу всего на свете, если ресурс не будет отдавать данные по найденному городу? В итоге имеем 36к городов для Meteonova и чуть меньше 13к для gismeteo.ru. При этом уникальных для gismeteo.ru – только 153 штуки. Попутно добавлены опции командной строки для указания конфига и базы.