Содержание
- Дневник разработки #1. Постановка задачи
- Дневник разработки #2. Выбор инструментария
- Дневник разработки #3. Проектирование БД
- Дневник разработки #4. Уход в сторону
- Дневник разработки #5. Неожиданный финал
Введение
Когда начинаешь изучать что-то новое, часто случается, уходишь немного в сторону от основного направления проекта.
Вообще, тут и парадигма поменялась: решил попробовать всё-таки на Питоне под Джангой написать основную часть приложения. Но сначала захотел понять, как же всё-таки работает так называемая customapi у PhantomBot’a.
Погода
Для теста я задумал реализовать простую и удобную команду получения прогноза погоды для заданного города. Достаточно написать в чат сообщение с названием города и бот буквально через секунду ответит:
JackyFox: !погода Москва
jackyfoxbot: по последним данным Moscow радует нас температурой воздуха 14 °С, влажность 58 %, атмосферное давление 1011 гПа, ветер 8 м/с. Спасибо за пользование услугами метеоцентра жекифокса
Используются данные сайта openweathermap.org. После регистрации получаешь API-ключ с бесплатным доступом к прогнозам до 60 запросов в час. Умеет распознавать названия городов на русском, что немаловажно, но почему-то в ответе всё равно присылает англоязычное название.
Запрос формируется параметрами:
- q, строка с названием города;
- lang, язык ответа, ru;
- units, единицы измерения, metric;
- APPID, ключ API.
В ответ получаем JSON:
{“coord”:{“lon”:37.62,“lat”:55.75},“weather”:[{“id”:800,“main”:“Clear”,“description”:“ясно”,“icon”:“01d”}],“base”:“cmc stations”,“main”:{“temp”:8.25,“pressure”:1003,“humidity”:52,“temp_min”:8,“temp_max”:9},“wind”:{“speed”:5,“deg”:300},“clouds”:{“all”:0},“dt”:1461247200,“sys”:{“type”:1,“id”:7323,“message”:0.0036,“country”:“RU”,“sunrise”:1461204470,“sunset”:1461257375},“id”:524901,“name”:“Moscow”,“cod”:200}
Для обработки этого джейсона я написал такую комманду боту:
!addcom weather (customapijson http://api.openweathermap.org/data/2.5/weather?q=$1&lang=ru&units=metric&APPID=SEKRET {по последним данным } name { радует нас температурой воздуха } main.temp { °С, влажность } main.humidity {%, атмосферное давление } main.pressure { гПа, ветер } wind.speed { м/с. В целом } weather.descriprion {. Спасибо за пользование услугами метеоцентра жекифокса })
Я перепроверил его несколько раз, отправил боту, но никакой инфы о погоде в чате получить не удалось. В логах обнаружилась запись о том, что полученный ответ не является JSON-объектом, поэтому и парсить его бот отказался.
После общения на форуме с разработчкиком бота, который сначала морозился и говорил, что помощи по работе со сторонными API не оказывает, потом заметил, что в джейсоне имеется массив, а поддержку раскрытия массивов они боту не написали.
Обратите внимание на поле weather.description, которое содержит словесное описание текущего погодного состояния на русском языке («ясно? ясно!»). Вот из-за него и не срабатывал скрипт обработчика. Стоило его убрать, и всё сразу заработало.
Разочарование
К сожалению, в результате изучения механизма кастомых команд и обработчиков API выяснилось, что бот не передает имя пользователя ни в одном из девяти параметров. Сегодня правда появилась тестовая версия модуля после моего убедительного обоснования необходимости такого функционала, но я пока не осилил, как этот обработчик следует использовать.
Нужен ли велосипед?
Поработав с API погодного сервиса, я вдруг подумал, а стоит ли изобретать велосипед и писать свое собственное TODO-приложение, если таких приложений полным-полно. Возможно, я смогу использовать их API?
На регулярной основе я использую Google Keep, но оказалось, что Google совершенно не хочет давать к нему доступ через API. Пришлось вбивать в поисковике фразу «todo api». Одна из ссылок привела меня к статье с обзором различных сервисов списков с открытым API. Статья старая, но я там сразу узнал Remember the Milk, которым пользоваться непродолжительное время.
После целого дня гугления я так и не понял, смогу ли я использовать этот API вместе с ботом. Тебе выдают API-ключ, но просто так получить доступ к заметкам нельзя, ты должен аутентифицироваться перед работой с заметками. Как это сделать одним запросом, я пока не понял…