пятница, 5 августа 2011 г.

Как заказать такси из консоли?

Мои друзья недавно запустили сайт http://open-taxi.com. При помощи него можно заказать такси онлайн, при этом на размещённый заказ поступают предложения от различных служб такси и от частных водителей. В Харькове подключены несколько городских служб такси и я несколько раз заказывал такси именно через этот сайт.

Через некоторое время, я узнал про API, при помощи которого можно размещать заказы. Я подумал, а можно ли сделать заказ из консоли, не запуская браузер?

Сказано - сделано. Потратив немного времени на то чтобы разобраться в API, я написал скрипт, при помощи которого можно заказать такси из обычной командной строки. Так как их API принимает данные о заказе в виде широты и долготы, мне пришлось в этом же скрипте написать код для интеграцией со службой геокодинга Google, к счастью, это не потребовало много времени. Ссылка для скачивания скрипта находится в конце страницы. Поскольку скрипт я писал "на скорую руку" для фана, то я в нём захардкодил логин и пароль от сайта, Вам потребуется их заменить своими.

    USER_LOGIN='test.account@gmail.com'
    USER_PASSWORD='***'
    
Эти строки в самом начале скрипта вам и потребуется изменить. Если вы захотите использовать скрипт передавая логин и пароль через командную строку, я думаю, это будет несложно сделать даже не имея большого опыта программирования.

Итак, давайте посмотрим как же осуществить нашу затею при помощи этого скрипта? Вначале Вам надо зарегистрироваться на их сайте, после этого создаём заказ командой

    $ ./taxi.py --create --start 'Харьков, ул. Блюхера, 27' --porch 1 --end 'Харьков, просп. Ленина, 14'
    Created order ID: 954
    
В результате выполнения последней команды мы получаем номер заказа, по которому можно отслеживать появление предложений от водителей. Делаем это командой
    $ ./taxi.py --offers 954
    799: Price 42 UAH, driver Боровой , car с ВАЗ-2115, arrives in 15 min
    800: Price 44 UAH, driver Вячеслав , car Mazda 323, arrives in 15 min
    801: Price 44 UAH, driver Андрей , car ВАЗ 2199, arrives in 15 min
    802: Price 44 UAH, driver Вячеслав , car ВАЗ 2109, arrives in 15 min
    803: Price 42 UAH, driver Валерий , car Дэу Ланос, arrives in 15 min
    804: Price 42 UAH, driver Анна , car Volvo 340, arrives in 15 min
    805: Price 42 UAH, driver Ольга , car ВАЗ 2109, arrives in 15 min
    806: Price 42 UAH, driver Виктор , car ВАЗ 2107, arrives in 15 min
    807: Price 42 UAH, driver Евгений , car Дэу Ланос, arrives in 15 min
    808: Price 42 UAH, driver Олег , car ВАЗ 2110, arrives in 15 min
    Total 10 offers
    
Мы получили несколько предложений, и можем выбрать то, которое больше всего нам нравится (например, дешевле или с более комфортной машиной).

Выбрав определённое предложение, мы подтверждаем его командой

    $ ./taxi.py --accept 805
    Successfully accepted offer
    
здесь мы передаём ID того предложения, которое мы выбрали.

Теперь надо удостовериться, что водитель не передумал, и что он действительно едет к нам. При помощи команды

    $ ./taxi.py --status 954
    Order status WAIT_FOR_DRIVER_APPROVE
    
мы получаем статус выбранного нами заказа. Когда он поменяется с WAIT_FOR_DRIVER_APPROVE на ACCEPTED, мы можем считать что водитель уже едет к нам. После подтверждения заказа водителем мы можем получить его телефон на тот случай, если он долго не будет появляться или если возникнут другие проблемы. Узнать телефон водителя до того, как мы подтвердили заказ, их API не позволяет - не знаю зачем такие сложности. Для этого выполняем команду
    $ ./taxi.py --phone 954
    Driver phone 30-40, 093-62-05-007 
    
Это всё, написав всего 5 строчек в консоли, мы смогли заказать себе такси, при этом мы могли выбирать среди различных предложений от разных служб такси.

Скрипт, использовавшийся в статье, написан на питоне и занимает чуть более ста строк, так что не думаю, что в нём будет трудно разобраться. Большая часть скрипта состоит в отправке HTTP запросов и парсинге данных из полученного в ответ XML.

Скачать скрипт taxi.py

Комментариев нет:

Отправить комментарий