Вступительное слово. Немного букв, все полезные.
Промышленный сервер autochmo.ru
Интерфейс API на промышленном сервере xml.autochmo.ru
Тестовый сервер avtochmo.greensight.ru
Интерфейс API тестового сервера xml-avtochmo.greensight.ru
Интерфейс API тестового сервера xml_avtochmo.greensight.ru
Валидный ответ сервера выглядит следующим образом:
<?xml version="1.0" encoding="UTF-8"?> <autochmoreply> <requesttime> тут время запроса (таймстамп) </requesttime> <requestmethod> тут метод запроса (обычно GET или POST) </requestmethod> <replytime> тут время ответа сервера (таймстамп) </replytime> Тело ответа. </autochmoreply>
Сервер принимает запросы и выдаёт ответы в кодировке UTF-8. Использование иной кодировки в запросе не запрещается, но и не гарантирует адекватные ответы.
В случае каких-либо проблем или ошибок, которые сервер может обработать, он отвечает XML с описанием ошибки. XML ошибки содержит внутри ответа элемент <error/>, у которого есть свойство code, а в себе он содержит текст ошибки. Например:
<?xml version="1.0" encoding="UTF-8"?> <autochmoreply> <requesttime>1307535706</requesttime> <requestmethod>GET</requestmethod> <replytime>1307535707</replytime> <error code="NOT_IMPLEMENTED">Метод не реализован</error> </autochmoreply>
Ниже представлен перечень кодов ошибок, которые сервер может возвращать:
NOT_IMPLEMENTED | Метод не реализован |
NOT_FOUND | Запрашиваемый ресурс не найден |
WRONG_CREDENTIALS | Неправильные логин и пароль |
AUTHORIZATION_REQUIRED | Требуется авторизация |
CANNOT_ADD_FACT | невозможно добавить факт |
CANNOT_EDIT_FACT | Невозможно отредактировать факт |
Помимо ошибок, сервер может возвращать предупреждения. Тэг предупреждения имеет следующий формат:
<warning code="WARNING">Это предупреждение</warning>
Предупреждений может быть несколько, и они могут соседствовать с прочими элементами в ответе сервера. Предупреждения могут быть возвращены в ответах не на все запросы, а только на некоторые, и все возможные случаи описаны отдельно. Обрабатывать предупреждения или нет — дело разработчика приложения.
Возможные предупреждения, который может возвращать сервер: T B A
Авторизация осуществляется отправкой методом POST полей login и password по адресу authorize:
POST /authorize/ Поля POST: { login: <логин пользователя> password: <пароль пользователя> }
В случае, если логин и/или пароль неправильные, возвращается ошибка с кодом WRONG_CREDENTIALS. Если авторизация прошла успешно, будет возвращён набор данных порльзователя — его ID, ФИО и, самое главное, авторизационный хэш, который привязан к пользователю и который потом надо будет передавать серверу для подтверждения авторизованности пользователя при совершении действий, эту авторизованность требующих.
Пример ответа об успешной авторизации:
<?xml version="1.0" encoding="UTF-8"?> <autochmoreply> <requesttime>1308213745</requesttime> <requestmethod>POST</requestmethod> <replytime>1308213746</replytime> <user id="1"> <username full="1 3 2"> <name>1</name> <secondname>2</secondname> <lastname>3</lastname> </username> <passwordhash>&6thg^dsflo8<f6ewt3h4f384bdrtg5g3efev43</passwordhash> </user> </autochmoreply>
Авторизация через OpenID/OAuth не реализована в данный момент. Кроме того, необходимо иметь в виду, что сессия ведётся средствами Битрикса, на котором работает весь сайт Авточмо, и поэтому обладает всеми сопутствующими достоинствами и недостатками. Кроме того, необходимо помнить о том, что символы < и >, которые могут попасться в хэше, заменены HTML-последовательностями < и > соответственно. Сессия хранится долго, то есть не слетает через некоторое время бездействия, однако, нельзя гарантировать то, что она будет храниться вечно. Если приложение не хранит у себя пароль пользователя, а хранит только возвращаемый при авторизации хэш, то, для заблаговременного сообщения пользователю о том, что его сессия истекла и ему необходимо ввести пароль снова, можно воспользоваться запросом CheckAuth. Он ничего не делает, только проверяет, может ли пользователь авторизоваться по указанному логину и хэшу пароля. Ну и продлевает сессию, наверное, тоже.
Осуществляется отправкой запроса методом POST по адресу /checkauth/:
POST /checkauth/ Поля POST: { login: <логин пользователя> passwordhash: <хэш пароля> }
Ответ сервера стандарный, в теле ответа присутствует всего один элемент <checkauthresult>, который содержит строку либо «ok», либо «fail», и имеет свойство result, равное 1 или 0 соответственно.
На всякий случай, мало ли, вдруг понадобится, сделана и возможность разлогинится. Запрос exit посылается методом POST или GET по адресу exit:
POST /exit/ GET /exit/
Никаких параметров более передавать не нужно. Тело ответа всегда будет сообщать об успешном завершении процедуры. Выглядит это так:
<?xml version="1.0" encoding="UTF-8"?> <autochmoreply> <requesttime>1308220587</requesttime> <requestmethod>GET</requestmethod> <replytime>1308220588</replytime> <callresult result="1">ok</callresult> </autochmoreply>
Факт — это описание случая авточмошничества. Содержит ссылки на фотографии, комментарий запостившего факт пользователя, государственный регистрационный номер или пометку «без номера» автомобиля, дату и координаты точки, и так далее.
Запрос факта осуществляется методом GET на адрес /<fact-id>:
GET /<fact-id>
Сервер либо возвращает ошибку NOT_FOUND, либо описание факта.
Описание факта:
<fact id="номер факта"> <name> название случая. Поле не имеет никакого практического применения </name> <comment> комментарий случая </comment> <datecreated readable="дата создания в формате Y-m-d H:i:s"> таймстамп </datecreated> <gosnomer id="id госномера" type="тип номера" nomer="номер без региона" number="номер" series="серия" region="регион"> весь номер целиком </gosnomer> <latitude> широта </latitude> <longitude> долгота </longitude> <carmodel id="ид модели" manufacturer="марка"> модель </carmodel> <rating plus="рейтинг в поюс (оправдательный)" minus="рейтинг в минус (осудительный)"> суммарный рейтинг </rating> <commentsnum> количество комментариев </commentsnum> <video> количество приложенных к случаю видеофайлов </video> <videos> в том случае, если есть приложенные файлы, содержит информацию о них: <video> <url> абсолютная ссылка на видеоролик </url> <original> относительные ссылки на скриншоты разных размеров <original> <medium> ... <medium> <small> ... <small> <tiny> ... <tiny> </video> ... </videos> <counts> <gosnomer> количество фактов с таким же госномером </gosnomer> <carmodel> количество фактов с такой же моделью </carmodel> </counts> Далее — картинки четырёх разных размеров. <pictures> <original> <src> путь к картинке относительно корня сайта </src> <src>...</src> ... </original> <medium> <src>...</src> ... </medium> <small> <src>...</src> ... </small> <tiny> <src>...</src> ... </tiny> </pictures> </fact>
При добавлении факта пользователь может ввести любой регистрационный номер, мы не ограничиваем пользователей шаблонами. В зависимости от того, каким образом сайт распознал введённый номер, элемент <gosnomer> может иметь разные значения, равно как и его свойства. Если тип номера не распознан, свойства тэга <gosnomer> не заполняются.
Типы регистрационных номеров, которые распознаёт сайт Авточмо:
Тип номера | Код (gosnomer type=) | Примечания |
---|---|---|
Обычный РФ | RUS | |
МВД (синий) | MVD | |
Дипломатический (красный) | DIP | Не имеет серии |
Транзитный (жёлтый регион) | TRANS | |
Военный (чёрный) | MO | |
Вывозимое ТС (с буквой Т) | EXP | |
Общественный транспорт (жёлтый) | PUB |
Список фактов получатся запросо методом GET по адресу /:
GET /
Дополнительно в качестве GET-параметров могут быть заданы условия фильтрации и сортировки.
Дополнительные GET-параметры.
Формат ответа похож на формат ответа API РосЯмы со списком ям.
К каждому факту список комментариев можно получить отдельно запросом методом GET по адресу /<fact-id>/comments:
GET /<fact-id>/comments
В ответ вернётся список комментариев в XML. Формат тела ответа сервера:
<commentslist> <comment id="идентификатор комментария"> <text> текст комментария </text> <username> имя пользователя </username> <usersecondname> фамилия пользователя </usersecondname> <userlastname> отчество пользователя </userlastname> <userlogin> поле не используется </userlogin> <datecreated readable="28.09.2011 22:59:47">1317236387</datecreated> - дата оставления комментария <entity> идентификатор комментируемой сущности </entity> <entitytype> идентификатор типа комментируемой сущности </entitytype> </comment> <comment> … </comment> </commentslist>
Список комментариев сортируется по идентификатору (по времени оставления) по убыванию (более новые комментарии идут первыми). Ограничение на количество комментариев задать нельзя, все комментарии к факту выбираются сразу. Максимальное число комментариев, которое может быть возвращено, равно 10000. Элемент <entity> содержит в себе идентификатор сущности, к которой относится комментарий, элемент <entitytype> содержит в себе идентификатор типа комментируемой сущности.
Помимо факта, есть сущность «авточмо» или «госномер», представляющая из себя набор фактов, объединённых одним регистрационным государственным номером. Эта сущность также имеет рейтинг и комментарии, отдельные от рейтинга и комментариев фактов. Получить данные об авточме можно запросом GET по адресу /autochmo/<autochmo-id>:
GET /autochmo/<autochmo-id>
В возвращаемые данные об авточме входит список нефильтруемый и несортируемый список фактов и несортируемый и нефильтруемый список комментариев, относительно которого справедливы замечания, относящиеся к списку комментариев к факту. Формат ответа сервера:
<commentslist> <comment id="ид комментария"> <text> текст комментария </text> <username> имя пользователя </username> <usersecondname> фамилия пользователя </usersecondname> <userlastname> отчество пользователя </userlastname> <userlogin> поле не используется </userlogin> <datecreated readable="28.09.2011 22:59:47">1317236387</datecreated> - дата оставления комментария </comment> <comment> … </comment> </commentslist> <rating plus="положительная часть рейтинга (оправдано)" minus="отрицательная часть ерйтинга (осуждено)"> суммарный рейтинг </rating> <factslist> <sort> <item code="ID">desc</item> </sort> <filter> <item code="gosnomer_id">686</item> </filter> <navigation></navigation> <factslist> Список фактов одного авточма имеет стандартную структуру списка фактов. <fact> … </fact> <fact> … </fact> </factslist> </factslist>
Список авточмов (по сути — список государствнных номеров, попавших на сайт Авточмо) можно получить запросом методом GET на адрес /autochmo:
GET /autochmo
Формат ответа сервера:
<autochmo id="идентификатор авточма"> государственный номер </autochmo> <autochmo id="идентификатор авточма"> государственный номер </autochmo> ...
В том случае, если номер не определён, то текст государственного номера будет «no nomer». Список авточмов упорядочен по идентификатору по убыванию. Можно задать GET-параметры offset и limit для навигации по списку. Параметр limit означает количество элементов выборке, offset — отступ от начала списка до начала выборки. Пример:
GET /autochmo?limit=30&offset=90
Пользователь может посмотреть список своих собственных фактов. Фильтрация общего списка фактов по загрузившему их пользоватею отсутствует по соображениям приватности, а для того, чтоб посмотреть список своих фактов, надо быть авторизованным. Список фактов, загруженных пользователем, может быть получен запросом методом POST по адресу /my/:
POST /my/ Поля POST { login: <логин пользователя> passwordhash: <хэш пароля> }
Поле passwordhash может быть заменено полем password, в котором передаётся не хэш пароля, а сам пароль пользователя. Список фактов, загруженных пользователем, сортируется и фильтруется аналогично общему списку фактов, и имеет точно такой же формат и структуру.
Пользователь имеет возможность просмотреть список оставленных им комментариев к фактам. Функционал просмотра комментарии пользователя к иным видам сущностей (парковки, авточмы) пока не реализован. Для того, что получить список комментариев пользователя, надо отправить запрос методом POST на адрес /my/comments:
POST /my/comments Поля POST { login: <логин пользователя> passwordhash: <хэш пароля> }
Поле passwordhash может быть заменено полем password, в котором передаётся не хэш пароля, а сам пароль пользователя. Список комментариев, оставленных пользователем, точно так же не фильтруется и не сортируется, как и список комментариев к факту, и все замечания относительно списка комментариев к факту относятся и к списку комментариев пользователя.
Элемент <entity> содержит в себе идентификатор сущности, к которой относится комментарий, элемент <entitytype> содержит в себе идентификатор типа комментируемой сущности. Более подробно — см. Добавление комментария.
POST /my/<fact-id> Поля POST { login: <логин пользователя> passwordhash: <хэш пароля> }
Из-за сильного влияния внутренней терминологии разработчиков под «авточмом» может пониматься выложенный на сайт факт и одновоременно несколько фактов, объединённых одним регистрационным номером (все факты с участием данной машины). Во избежание путаницы авторы описания API всегда стараются уточнять, о факте или о группе фактов идёт речь, однако, если уточнения нет, то под «авточмом» следует понимать именно одиночный факт, если нет оснований полагать, что имеется в виду обратное.
Добавление авточма производится отправлением запроса методом POST на адрес /addfact/
POST /addfact/ Поля POST { T B A login password longitude latitude carmodel_id desc gosnomer nonomer }
Описание полей POST.
login | Логин пользователя, под которым добавляется авточмо. |
passwordhash | Хэш пароля пользователя, полученный при авторизации. Вместо поля passwordhash можно передавать пароль в поле password. |
latitude, longitude | Соответственно широта и долгота случая в градусах (десятичная часть отделена от целой через точку). Вместо этих двух полей может быть передано одно поле coordinates, в котором широта и долгота передаются через запятую, либо поле coordinatesr, в котором они тоже передаются через запятую, но первой идёт долгота. |
carmodel_id | Идентификатор модели (см. вызов соответствующего справочника). |
carmodel | Строковое название модели. В том случае, если по какой-либо причине не передан параметр carmodel_id, то, ориентируясь по этой строке, сайт Авточмо сам попробует подобрать подходящую модель, или создаст новую. В том случае, если carmodel_id задан (и он не равен 0), параметр carmodel игнорируется. |
desc | Описание авточма (комментарий). |
gosnomer | Государственный номер в виде строки. Желательно передавать латинскими буквами и цифрами (например, o000oo00), однако, не обязательно — кириллические буквы тоже допустимы, однако, если в номере встретятся символы, не являющиеся цифрами и буквами латинского алфавита или кириллического алфавита, сходными по начертанию с латинскими, они будут удалены. Дописывать «RUS» после цифр региона не рекомендуется, так как тогда номер не будет распознан как валидный. Он будет добавлен, но тип его будет неопределён. |
nogosnomer | Если этот параметр задан и не равен false, то будет добавлено авточмо без номера (с пометкой «номер не определён»). Возвращаемый результат представляет из себя либо ошибку, либо, в случае успешного добавления, тэг <callresult>, у которого имеется дополнительное свойство insertedfactid, значение которого равно идентификатору только что добавленного авточма. |
Пример ответа при успешном добавлении авточма:
<autochmoreply> <requesttime>1316974835</requesttime> <requestmethod>POST</requestmethod> <replytime>1316974835</replytime> <callresult result="1" insertedfactid="686">ok</callresult> </autochmoreply>T B A
Запрос справояника требует авторизации, POST /getcarmodels
T B AЗапрос справочиника требует авторизации, POST /getcarmarks
T B APOST /my/<fact-id>/update Поля POST { login: <��������������������������������������������������������������������������������������������������������������������������������������������������
POST /my/<fact-id>/delete Поля POST { login: <������������������������������
Добавление комментария происходит с помощью отпраления вызова методом POST по адресу /addcomment:
POST /addcomment Поля POST: { login: < логин пользователя > passwordhash: < хэш пароля пользователя > entity_type_id: < идентификатор типа комментируемой сущности > entity_id: < идентификатор сущности > fact_id: < идентификатор факта > autochmo_id: < идентификатор авточма > parking_id: < идентификатор парковки > text: < текст комментария > }
Для оставления комментария необходима авторизация. Вместо поля passwordhash можно передавать пароль пользователя.
Так как комментировать можно несколько разных типов сущностей, то, помимо идентификатора самой сущности (её id), необходимо указать и тип комментируемой сущности, так как, по понятной причине, у двух разных сущностей разных типов могут быть одинаковые идентификаторы. Указание типа комментируемой сущности может производиться двумя способами. Во-первых, можно указать явно entity_type_id.
Список идентификаторов типов комментируемых сущностей:
1 | факты |
2 | парковки |
3 | авточмы |
В случае, если указан идентификатор несуществующего типа, будет возвращена ошибка UNKNOWN_ENTITY_TYPE. Второй способ задания типа комментируемой сущности — с помощью иных параметров, передаваемых в POST, для удобства пользования. Вместо двух параметров entity_type_id и entity_id можно указать параметр fact_id (идентификатор комментируемого факта) или parking_id (идентификатор комментируемой парковки) или autochmo_id (идентификатор комментируемого авточма). Рекомендуем этот способ. Если не указан ни один из параметров, специфицирующих тип и идентификатор, будет возвращена ошибка ENTITY_TYPE_NOT_SPECIFIED, если будет укзаан тип, но указан идентификатор комментируемой сущности, будет возвращена ошибка ENTUTY_NOT_SPECIFIED. При попытке прокомментировать несуществующую сущность будет выдана ошибка NO_ENTITY.
Если текст комментярия пуст или состоит только из пробелов, будет возвращена ошибка NO_TEXT. Во избежание злоупотреблений текст обрезается по длине 10000 символов.
В результат выполнения запроса возвращается XML, содержащий элемент <callresult>, свойство insertedcommentid которого равно идентификатору добавленного комментария. Пример ответа о благополучном оставлении комментария:
<callresult result="1" insertedcommentid="247">ok</callresult>
Если что-то пошло не так и комментарий не добавился по какой-то причине, результат будет выглядеть так:
<callresult result="0">fail</callresult>
Голосование происходит отправкой запроса методом POST по адресу /vote:
POST /vote Поля POST: { login: < логин пользователя > passwordhash: < хэш пароля пользователя > entity_type_id: < идентификатор типа комментируемой сущности > entity_id: < идентификатор сущности > fact_id: < идентификатор факта > autochmo_id: < идентификатор авточма > parking_id: < идентификатор парковки > comment_id: < идентификатор комментария > vote: 1|-1 }
Для голосвания необходима авторизация. Вместо поля passwordhash можно передавать пароль пользователя.
Так как голосовать можно за несколько разных типов сущностей, то, помимо идентификатора самой сущности (её id), необходимо указать и тип сущности, за которую идёт голосование, так как у двух разных сущностей разных типов могут быть одинаковые идентификаторы. Указание типа сущности может производиться двумя способами. Во-первых, можно указать явно entity_type_id.
Список идентификаторов типов сущностей, за которые можно голосовать.
1 | avtochmo | факт |
2 | comments | комментарий |
3 | parking | парковка |
4 | gosnomer | госномер (авточмо) |
Кроме того, можно (это рекомендуемый способ, так что даже лучше) передавать вместо entity_type_id и entity_id поля fact_id (идентификатор факта) или parking_id (идентификатор парковки) или autochmo_id (идентификатор авточма) или comment_id (идентификатор комментария).
Если не указан ни один из параметров, специфицирующих тип и идентификатор, будет возвращена ошибка ENTITY_TYPE_NOT_SPECIFIED, если будет укзаан тип, но указан идентификатор комментируемой сущности, будет возвращена ошибка ENTUTY_NOT_SPECIFIED. При попытке прокомментировать несуществующую сущность будет выдана ошибка NO_ENTITY.
Если не указано поле vote или оно равно нулю, то будет выведена ошибка NO_VOTE. Голосовать за свои комментарии нельзя, при попытке проголосовать за свой комментарий будет выведена ошабка UNAPPROPRIATE_METHOD. Голосовать за свои факты и парковки можно (пока ещё). Если за данную сущность голос уже отдан, будет возвращена ошибка NO_MORE_VOTES.
В случае успешного голосования будет возвращён в теле ответа сервера элемент <callresult> со значением ok и свойством result, равным 1, а если голос не был добавлен, то элемент <callresult> будет иметь значение fail, а его свойство result будет равно 0.
Прямое геокодирование — определение координат по топониму. Обратное — наоборот. Для уменьшения злоупотребления геокодированием авторизация пользователя является обязательной. Фактически, геокодер Авточма является прокси-сервером для геокодера Яндекса, так что можно обращаться напрямую в Яндекс, и ответ сервера практически совпадает с ответом Яндекса:
http://api.yandex.ru/maps/geocoder/doc/desc/concepts/About.xmlГеокодирование получается обращением методом POST по адресу /geocode/:
POST /geocode/ Поля POST: { login: <логин пользователя> passwordhash: <хэш пароля> geocode: <любая строка или координаты через запятую> }
Вместо passwordhash может быть передан password. Обратите внимание, что в поле geocode передаётся сначала долгота, потом широта.
Ответ сервера содержит в себе элемент <geocode>, в котором целиком содержится (за исключением тэга <?xml>) ответ Яндекса в формате XML (пробелы, которыми сделан отступ строк слева, заменены на символы табуляции). В случае ошибки элемент <geocode> отсутствует, а вместо него выводится ошибка. Если не указан адрес или координаты, то выводится ошибка GEOCODE_EMPTY_REQUEST (пустой запрос к геокодеру), в случае каких-либо иных ошибок выводится GEOCODE_ERROR.