Ниже приведены методы HTTP API для работы с данными Point.im.
Для повышения читаемости все ответы были отформатированы и прокомментированы. Реальный ответ сервера будет в минифицированном виде
- Аутентификация
- Посты
- Обычные посты
- Личные сообщения
- Счётчики непрочитанных постов и комментариев
- Просмотр поста
- Создание поста
- Редактирование поста
- Удаление поста
- Создание комментария
- Редактирование комментария
- Удаление комментария
- Рекомендация поста
- Удаление рекомендации поста
- Рекомендация комментария
- Удаление рекомендации комментария
- Закрепление и открепление поста
- Подписка на пост
- Отписка от поста
- Добавление поста в закладки
- Удаление поста из закладок
- Добавление комментария в закладки
- Удаление комментария из закладок
- Теги
- Пользователи
- Информация о пользователе
- Информация о себе
- Аватар пользователя
- Получение аватара по имени пользователя
- Подписки пользователя
- Подписчики пользователя
- Подписка на пользователя
- Отписка от пользователя
- Подписка на рекомендации пользователя
- Отписка от рекомендаций пользователя
- Белый список пользователей
- Добавление пользователя в белый список
- Удаление пользователя из белого списка
- Чёрный список пользователей
- Добавление пользователя в чёрный список
- Удаление пользователя из чёрного списка
- Список пользователей, добавивших вас в чёрный список
- WebSocket
Аутентификация
Вход
Запрос
POST /api/login
Параметры
login
— имя пользователя. Обязательный параметр.
password
— пароль. Обязательный параметр.
Далее полученный token нужно передавать в заголовках запросов:
Authorization: <token>
Как альтернативу этому заголовку можно использовать cookie "user", которая должна содержать этот же token.
Ответ
Пример запроса:
http://point.im/api/login
login=xxx&password=yyy
Пример ответа:
{
/* Авторизационный токен */
"token": "b444ac06613fc8d63795be9ad0beaf55011936ac",
/* CSRF-токен */
"csrf_token": "109f4b3c50d7b0df729d299bc6f8e9ef9066971f"
}
Выход
Запрос
POST /api/logout
Параметры
csrf_token
— Обязательный параметр. Получается в /api/login
.
Ответ
Пример запроса:
http://point.im/api/logout
csrf_token=109f4b3c50d7b0df729d299bc6f8e9ef9066971f
Пример ответа:
{ "ok": true }
Посты
Обычные посты
Примеры запросов, требующих авторизации сделаны, от имени skobkin-ru
Список последних записей в ленте
Запрос
GET /api/recent
Параметры
before
— идентификатор записи, от которой нужно начать выборку. Не включает запись.
Необходима аутентификация.
Ответ
Пример запроса:
http://point.im/api/recent
Пример ответа:
{
/* Наличие кнопки "Предыдущие */
"has_next": true,
/* Массив постов */
"posts": [
/* Объект метапоста для обычного поста */
{
/* Добавлен ли пост в закладки */
"bookmarked": false,
/* Уникальный числовой идентификатор в выборке, используется для пагинации (параметр before) */
"uid": 1291267,
/* Статус подписки на пост (комментарии) */
"subscribed": true,
/* Разрешено ли редактирование */
"editable": false,
/* Рекомендован ли пост */
"recommended": true,
/* Объект поста */
"post": {
/* Массив тегов */
"tags": [
"lh",
"q"
],
/* Количество комментариев */
"comments_count": 1,
/* Объект юзера, который написал пост */
"author": {
/* Логин автора поста */
"login": "Daemon",
/* ID автора поста */
"id": 195,
/* Аватарка автора */
"avatar": "daemon.jpg?r=4717",
/* Имя автора поста */
"name": "Daemon"
},
/* Текст поста */
"text": "1) \u0424\u043e\u0442\u043a\u0430\u0435\u0448\u044c \u0444\u0438\u0433\u0443\u0440\u0443 2) \u0414\u0438\u0447\u0430\u0439\u0448\u0435 \u0436\u0440\u0435\u0448\u044c \u043f\u043e\u043b\u0433\u043e\u0434\u0430 3) \u0424\u043e\u0442\u043a\u0430\u0435\u0448\u044c \u0435\u0449\u0435 \u0440\u0430\u0437 4) \u041c\u0435\u043d\u044f\u0435\u0448\u044c \u0434\u043e \u0438 \u043f\u043e\u0441\u043b\u0435 \u043c\u0435\u0441\u0442\u0430\u043c\u0438 5) \u041f\u043e\u0441\u0442\u0438\u0448\u044c 6) \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u0448\u044c \u043b\u0430\u0439\u043a\u0438 7) \u0414\u0430\u0451\u0448\u044c \u0441\u043e\u0432\u0435\u0442\u044b",
/* Дата написания */
"created": "2014-03-29T15:29:41.561889",
/* Тип поста */
"type": "post",
/* Символьный идентификатор (используется в URL) */
"id": "lby",
/* Является ли пост приватным */
"private": false
}
},
/* Объект метапоста для рекомендованного поста */
{
"bookmarked": false,
"uid": 1309953,
"subscribed": true,
"editable": false,
"recommended": false,
/* Данные о рекомендации */
"rec": {
/* Текст рекомендации */
"text": null,
/* Идентификатор комментария */
"comment_id": null,
/* Пользователь, который рекомендовал пост или комментарий */
"author": {
"login": "arts",
"id": 1,
"avatar": "arts.jpg?r=4778",
"name": "\u0410\u0440\u0442\u0451\u043c \u0421\u0430\u0436\u0438\u043d"
}
},
/* Объект поста */
"post": {
"tags": [
"api",
"point",
"android"
],
"comments_count": 23,
"author": {
"login": "Tishka17",
"id": 434,
"avatar": "tishka17.png?r=6953",
"name": "Tishka17"
},
"text": "\u041a\u0430\u043a-\u0442\u043e \u0442\u0430\u043a http://imgur.com/dUNiHeq",
"created": "2014-03-31T11:30:28.277053",
"type": "post",
"id": "acih",
"private": false
}
}
{
/* Следующий пост */
}
]
}
Список последних записей в /all
Запрос
GET /api/all
Параметры
before
— уникальный числовой идентификатор записи uid
, от которой нужно начать выборку. Не включает запись
Ответ
Структура ответа аналогична /api/recent
Список последних записей в блоге пользователя
Запрос
GET /api/blog/<login>
Параметры
before
— уникальный числовой идентификатор записи uid
, от которой нужно начать выборку. Не включает запись.
Ответ
Пример запроса:
http://point.im/api/blog/skobkin-ru
Структура ответа аналогична /api/recent
Список комментируемых постов
Запрос
GET /api/comments
Параметры
before
— уникальный числовой идентификатор записи uid
, от которой нужно начать выборку. Не включает запись.
Необходима аутентификация.
Ответ
Пример запроса:
http://point.im/api/comments
Личные сообщения
Список входящих сообщений
Запрос
GET /api/messages
или
GET /api/messages/incoming
Параметры
before
— уникальный числовой идентификатор записи uid
, от которой нужно начать выборку. Не включает запись.
Необходима аутентификация.
Ответ
Пример запроса:
http://point.im/api/messages/incoming
Структура ответа аналогична /api/recent
Список исходящих сообщений
Запрос
GET /api/messages/outgoing
Параметры
before
— уникальный числовой идентификатор записи uid
, от которой нужно начать выборку. Не включает запись.
Необходима аутентификация.
Ответ
Пример запроса:
http://point.im/api/messages/outgoing
Структура ответа аналогична /api/recent
Счётчики непрочитанных постов и комментариев
Запрос
GET /api/unread-counters
Ответ
Пример запроса:
http://point.im/api/unread-counters
Пример ответа:
{
"posts": 10,
"comments": 314,
"private_posts": 1,
"private_comments": 3
}
Просмотр поста
Запрос
GET /api/post/<post>
Ответ
Пример запроса:
http://point.im/api/post/iatso
Пример ответа:
{
/* Объект поста */
"post": {
/* Флаг прикреплённости (отображение в начале списка) поста в блоге */
"pinned": false,
/* Массив файлов, приложенных к посту */
"files": [
"http://i.point.im/m/s/skobkin-ru/2b/20/9073/2015_11_06__001_Selection.png"
],
/* Массив тегов */
"tags": [
"pic",
"log",
"\u0420\u043e\u0441\u0441\u0438\u044f",
"\u0434\u0435\u043d\u044c\u0433\u0438",
"\u0418\u041f"
],
/* Количество комментариев */
"comments_count": 4,
/* Объект пользователя, написавшего пост */
"author": {
/* Логин пользователя - может быть изменён пользователем */
"login": "skobkin-ru",
/* Уникальный идентификатор пользователя - не меняется */
"id": 230,
/* Аватар */
"avatar": "skobkin-ru.jpg?r=9939",
/* Имя в профиле пользователя */
"name": "\u0410\u043b\u0435\u043a\u0441\u0435\u0439 Skobk.in"
},
/* Текст поста */
"text": "\u0413 - \u0433\u0438\u0431\u043a\u0438\u0439 \u0433\u0440\u0430\u0444\u0438\u043a.\r\n\u0424\u041d\u0421 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0440\u0430\u0437 \u0440\u0430\u0434\u0443\u0435\u0442 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e\u043c.",
/* Дата написания поста */
"created": "2015-11-06T15:48:14.565031",
/* Тип поста (post, feed) */
"type": "post",
/* Уникальный идентификатор поста */
"id": "iatso",
/* Флаг приватного поста */
"private": false
},
/* Массив комментариев */
"comments": [
/* Объект комментария первого уровня с текстом */
{
/* Дата написания комментария */
"created": "2016-03-24T16:44:32.182837",
/* Текст комментария */
"text": "test comment",
/* Объект пользователя автора комментария (см. описание в секции post) */
"author": {
"login": "skobkin-ru",
"id": 230,
"avatar": "skobkin-ru.jpg?r=9939",
"name": "\u0410\u043b\u0435\u043a\u0441\u0435\u0439 Skobk.in"
},
/* Уникальный идентификатор поста, к которому был написан комментарий */
/* Первая половина уникального идентификатора комментария */
"post_id": "iatso",
/* Номер комментария, у которому был оставлен в качестве ответа данный комментарий */
"to_comment_id": null,
/* Флаг отображающий, является ли комментарий рекомендацией */
"is_rec": false,
/* Номер комментария в посте */
/* Вторая половина уникального и дентификатора комментария */
"id": 1
},
/* Объект комментария первого уровня, который является рекомендацией */
{
"created": "2016-03-24T16:46:31.880004",
"text": "Optional text",
"author": {
"login": "dav",
"id": 2216,
"avatar": null,
"name": ""
},
"post_id": "iatso",
"to_comment_id": null,
"is_rec": true,
"id": 2
},
/* Объект комментария, к которому приложен файл (картинка) */
/* TODO: исправить баг в API, из-за которого отсутствует массив files */
{
"created": "2016-03-24T16:49:10.881752",
"text": "test comment with image.",
"author": {
"login": "skobkin-ru",
"id": 230,
"avatar": "skobkin-ru.jpg?r=9939",
"name": "\u0410\u043b\u0435\u043a\u0441\u0435\u0439 Skobk.in"
},
"post_id": "iatso",
"to_comment_id": null,
"is_rec": false,
"id": 3
},
/* Объект комментария, который является ответом на первый комментарий поста */
{
"created": "2016-03-24T16:49:46.196950",
"text": "test answer.",
"author": {
"login": "skobkin-ru",
"id": 230,
"avatar": "skobkin-ru.jpg?r=9939",
"name": "\u0410\u043b\u0435\u043a\u0441\u0435\u0439 Skobk.in"
},
"post_id": "iatso",
"to_comment_id": 1,
"is_rec": false,
"id": 4
}
]
}
Создание поста
Запрос
POST /api/post
Параметры
text
— обязательный
tag
private
Примечание
В этом и других запросах, связанных с изменением контента, необходимо передавать HTTP-зоголовок:
X-CSRF: <csrf_token>
где csrf_token
— токен, получаемый при аутентификации.
Редактирование поста
Запрос
PUT /api/post/<id>
Параметры
text
— обязательный
tag
Удаление поста
Запрос
DELETE /api/post/<id>
Создание комментария
Запрос
POST /api/post/<id>
Параметры
text
— обязательный
comment_id
Редактирование комментария
Запрос
PATCH /api/post/<id>/<comment_id>
Параметры
text
— обязательный
Ответ
{
'id': '<post_id>',
'comment_id': '<comment_id>'
}
Удаление комментария
Запрос
DELETE /api/post/<id>/<comment_id>
Рекомендация поста
Запрос
POST /api/post/<id>/r
Параметры
text
Удаление рекомендации поста
DELETE /api/post/<id>/r
Рекомендация комментария
Запрос
POST /api/post/<id>/<comment_id>/r
Параметры
text
Удаление рекомендации комментария
DELETE /api/post/<id>/<comment_id>/r
Закрепление и открепление поста
Закрепить пост
POST /api/post/<id>/pin
Открепить пост
DELETE /api/post/<id>/unpin
Возбуждаемые исключения:
При попытке открепить незакреплённый пост возбуждается исключение PostNotPinnedError
и сервер вернёт ответ:
{
"code": "405",
"message": "Post not pinned."
}
Аналогично, При попытке прикрепить уже закреплённый пост возбуждается исключение PostAlreadyPinnedError
и сервер вернёт ответ:
{
"code": "405",
"message": "Post already pinned."
}
Подписка на пост
POST /api/post/<id>/s
Отписка от поста
DELETE /api/post/<id>/s
Добавление поста в закладки
POST /api/post/<id>/b
text
— пометка к закладке
Удаление поста из закладок
DELETE /api/post/<id>/b
Добавление комментария в закладки
POST /api/post/<id>/<comment_id>/b
text
— пометка к закладке
Удаление комментария из закладок
DELETE /api/post/<id>/<comment_id>/b
Теги
Список тегов пользователя
Запрос
GET /api/tags/<login>
Ответ
Примеры запроса:
http://point.im/api/tags/skobkin-ru
Пример ответа:
[
/* Объект тега */
{
/* Количество постов с этим тегом у пользователя */
"count": 9,
/* Текст тега */
"tag": "?"
},
{
/* Следующий тег */
}
]
Просмотр закладок
Запрос
GET /api/bookmarks
Параметры
before
— уникальный числовой uid
(см. /api/recent
)
Ответ
Структура ответа аналогична /api/recent
Выборка постов по тегам
Запрос
GET /api/tags
Параметры
tag
— тег. Обязательный параметр.
before
— уникальный числовой uid
(см. /api/recent
)
Можно указывать несколько тегов.
Ответ
Пример запроса:
http://point.im/api/tags?tag=guitar
или
http://point.im/api/tags/skobkin-ru?tag=guitar&tag=test
Структура ответа аналогична /api/recent
Выборка постов по тегам пользователя
Запрос
GET /api/tags/<login>
Параметры
tag
— тег. Обязательный параметр.
before
— уникальный числовой uid
(см. /api/recent)
Можно указывать несколько тегов.
Ответ
Примеры запросов:
http://point.im/api/tags/skobkin-ru?tag=guitar
или
http://point.im/api/tags/skobkin-ru?tag=guitar&tag=test
Структура ответа аналогична /api/recent
Пользователи
Информация о пользователе
Запрос
Существует два вида запросов к API для получения информации о пользователе:
-
по имени пользователя:
GET
/api/user/login/<login>
Параметры
login
— имя пользователя. Обязательный параметр.Пример запроса:
http://point.im/api/user/login/skobkin-ru
-
по
id
пользователя:GET
/api/user/id/<user_id>
Параметры
user_id
—id
пользователя. Обязательный параметр.Пример запроса:
http://point.im/api/user/id/230
Ответ
Ответ на оба типа запроса одинаков. Пример ответа:
{
/* Заметка пользователя о себе */
"about": "PHP, guitar, World of Tanks",
/* Jabber ID */
"xmpp": "x@skobkin.ru",
/* Имя (не логин) */
"name": "\u0410\u043b\u0435\u043a\u0441\u0435\u0439 Skobkin.ru",
/* Открыт ли блог пользователя для неаутентифицированных посетителей:
true - закрыт
false - открыт */
"deny_anonymous": true,
/* Является ли блог пользователя открытым только пользователям из белого
списка этого пользователя:
true - только для белого списка
false - для всех пользователей */
"private": false,
/* Статус подписки на пользователя */
"subscribed": false,
/* Дата и время регистрации пользователя */
"created": "2014-02-03T08:47:45.109228+00:00",
/* Находится ли пользователь в BL */
"bl": false,
/* Пол пользователя (мужской - true; женский - false; робот/Угнич - null) */
"gender": true,
/* Находится ли пользователь в WL */
"wl": false,
/* Дата рождения */
"birthdate": "1991-08-09T00:00:00",
/* ID пользователя */
"id": 230,
/* Статус подписки на рекомендации пользователя */
"rec_sub": false,
/* Имя файла аватара пользователя */
"avatar": "skobkin-ru.jpg?r=5527",
/* Skype пользователя */
"skype": "skobkin-ru",
/* Логин пользователя */
"login": "skobkin-ru",
/* ICQ пользователя */
"icq": "",
/* Сайт пользователя */
"homepage": "http://skobkin.ru/",
/* E-mail пользователя */
"email": "x@skobkin.ru",
/* Город пользователя */
"location": "\u0410\u0440\u0445\u0430\u043d\u0433\u0435\u043b\u044c\u0441\u043a"
}
Информация о себе
Частным случаем информации о пользователе является получение информации
авторизованным пользователем о себе самом.
Запрос
/api/me
Ответ
{
/* Заметка пользователя о себе */
"about": "PHP, guitar, World of Tanks",
/* Jabber ID */
"xmpp": "x@skobkin.ru",
/* Имя (не логин) */
"name": "\u0410\u043b\u0435\u043a\u0441\u0435\u0439 Skobkin.ru",
/* Дата и время регистрации пользователя */
"created": "2014-02-03T08:47:45.109228+00:00",
/* Пол пользователя (мужской - true; женский - false; робот/Угнич - null) */
"gender": true,
/* Дата рождения */
"birthdate": "1991-08-09T00:00:00",
/* Имя файла аватара пользователя */
"avatar": "skobkin-ru.jpg?r=5527",
/* Skype пользователя */
"skype": "skobkin-ru",
/* ICQ пользователя */
"icq": "",
/* Сайт пользователя */
"homepage": "http://skobkin.ru/",
/* E-mail пользователя */
"email": "x@skobkin.ru",
/* Город пользователя */
"location": "\u0410\u0440\u0445\u0430\u043d\u0433\u0435\u043b\u044c\u0441\u043a"
Если пользователь не авторизован, ответ сервера имеет вид:
{
"error": "NotAuthorized"
}
Аватар пользователя
Запрос
http(s)://i.point.im/a/<size>/<avatar_name.ext>
Параметры
size
— размер аватара: 24, 40, 80, 280
avatar_name.ext
— имя файла аватара (параметр avatar
), получаемое в объектах пользователей.
Ответ
Примеры запросов:
http://i.point.im/a/24/skobkin-ru.jpg
Ответ:
http://i.point.im/a/40/skobkin-ru.jpg
Ответ:
http://i.point.im/a/80/skobkin-ru.jpg
Ответ:
Получение аватара по имени пользователя
Запрос
GET /avatar/<login>/<size>
Параметры
login - имя пользователя
size - размер аватара: 24, 40, 80
Ответ
Сервер произведет перенаправление по адресу, соответствующему аватару пользователя. Например, запрос http://point.im/avatar/skobkin-ru/80
будет перенаправлен на http://i.point.im/a/80/skobkin-ru.jpg?r=5527
Подписки пользователя
Запрос
GET /api/user/<login>/subscriptions
Ответ
Пример запроса:
http://point.im/api/user/skobkin-ru/subscriptions
Пример ответа:
[
/* Объект пользователя */
{
/* Логин пользователя */
"login": "al1k",
/* ID пользователя */
"id": 171,
/* Имя файла аватара пользователя */
"avatar": "al1k.jpg?r=8993",
/* Имя (не логин) */
"name": "al1k"
},
{
/* Следующий пользователь */
}
]
Подписчики пользователя
Запрос
GET /api/user/<login>/subscribers
Необходима аутентификация.
Ответ
Пример запроса:
http://point.im/api/user/skobkin-ru/subscribers
Структура ответа аналогична /api/user/<login>/subscriptions
Подписка на пользователя
Запрос
POST /api/user/s/<login>
Отписка от пользователя
Запрос
DELETE /api/user/s/<login>
Подписка на рекомендации пользователя
Запрос
POST /api/user/sr/<login>
Отписка от рекомендаций пользователя
Запрос
DELETE /api/user/sr/<login>
Белый список пользователей
Запрос
GET /api/user/wl
Необходима аутентификация.
Ответ
Пример запроса:
http://point.im/api/user/wl
Структура ответа аналогична /api/user/<login>/subscriptions
Добавление пользователя в белый список
Запрос
POST /api/user/wl/<login>
Удаление пользователя из белого списка
Запрос
DELETE /api/user/wl/<login>
Чёрный список пользователей
Запрос
GET /api/user/bl
Необходима аутентификация.
Ответ
Пример запроса:
http://point.im/api/user/bl
Структура ответа аналогична /api/user/<login>/subscriptions
Добавление пользователя в чёрный список
Запрос
POST /api/user/bl/<login>
Удаление пользователя из чёрного списка
Запрос
DELETE /api/user/bl/<login>
Список пользователей, добавивших вас в чёрный список
Запрос
GET /api/user/blers
Необходима аутентификация.
Ответ
Пример запроса:
https://point.im/api/user/blers
Структура ответа аналогична /api/user/<login>/subscriptions
WebSocket
Для получения уведомлений о событиях можно использовать WebSocket-сервер, расположенный по адресу
ws://point.im/ws
или wss://point.im/ws
Для аутентификации нужно передать WS-серверу сообщение вида:
Authorization: <token>
,
где token — ключ, полученный при входе через API.