Ниже приведены методы 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.
