Skip to content

Latest commit

 

History

History
887 lines (846 loc) · 26.6 KB

File metadata and controls

887 lines (846 loc) · 26.6 KB

openapi: 3.0.3 info: title: Два.ч description: Открытое апи Два.ч version: 1.0.31 contact: email: admin@2ch.hk servers:

paths: /api/mobile/v2/boards: get: summary: Получение списка досок и их настроек. responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/Boards'

/api/mobile/v2/after/{board}/{thread}/{num}: get: summary: Получение постов в треде >= указанного. Не рекомендуется использовать для получения треда целиком, только для проверки новых постов. parameters: - in: path name: board schema: type: string required: true description: ID доски, например, b. - in: path name: thread schema: type: integer minimum: 1 required: true description: Номер треда. - in: path name: num schema: type: integer minimum: 1 required: true description: Номер поста. responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/MobileThreadPostsAfter'

/api/mobile/v2/info/{board}/{thread}: get: summary: Получение информации о треде. parameters: - in: path name: board schema: type: string required: true description: ID доски, например, b. - in: path name: thread schema: type: integer minimum: 1 required: true description: Номер треда. responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/MobileThreadLastInfo'

/api/mobile/v2/post/{board}/{num}: get: summary: Получение информации о посте. parameters: - in: path name: board schema: type: string required: true description: ID доски, например, b. - in: path name: num schema: type: integer minimum: 1 required: true description: Номер поста. responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/MobilePost'

/api/captcha/emoji/id: get: summary: Получение ид для последующего решения emoji капчи. parameters: - in: query name: board schema: type: string description: ID доски, например, b. - in: query name: thread schema: type: integer minimum: 1 description: Номер треда. responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/Captcha'

/api/captcha/emoji/show: get: summary: Получение первичного состояния emoji капчи. parameters: - in: query name: id schema: type: string description: ID капчи из метода /id. responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/EmojiCaptchaShow'

/api/captcha/emoji/click: post: summary: Клик на emoji клавиатуре для выбора "корректного" emoji. requestBody: required: true content: application/json: schema: type: object properties: captchaTokenID: type: string description: ID капчи из метода /id. emojiNumber: type: number description: Номер эмодзи из клавитуры. Нумерация начинается с 0. required: - captchaTokenID - emojiNumber responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/EmojiCaptchaShow'

/api/captcha/app/id/{public_key}: get: summary: Получение app_response_id для отправки поста. description: | Полученный id вам нужно отправить вместе с постом как app_response_id. При этом нужно отправить app_response = sha256(app_response_id + '|' + private key). Срок жизни id: 180 секунд. parameters: - in: path name: public_key schema: type: string required: true description: Публичный ключ, для получения напишите admin@2ch.hk с темой письма "Получение ключа для приложения" и ссылкой на ваш клиент. - in: query name: board schema: type: string description: ID доски, например, b. - in: query name: thread schema: type: integer minimum: 1 description: Номер треда. responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/Captcha'

/user/posting: post: summary: Создание нового поста или треда. requestBody: content: multipart/form-data: schema: type: object properties: captcha_type: $ref: '#/components/schemas/CaptchaType' board: type: string thread: type: integer description: Если не указано, будет создан тред. name: type: string description: Если не включено в настройках доски - поле будет проигнорировано. email: type: string description: Если не включено в настройках доски - поле будет проигнорировано. tags: type: string description: Если не включено в настройках доски - поле будет проигнорировано. subject: type: string description: Если не включено в настройках доски - поле будет проигнорировано. comment: type: string icon: type: integer op_mark: type: integer description: Если не включено в настройках доски - поле будет проигнорировано. file[]: type: array items: type: string format: binary

          required:
            - captcha_type
            - board
  responses:
    '200':
      description: OK
      content:
        application/json:
          schema:
            oneOf:
              - $ref: '#/components/schemas/PostingNewThread'
              - $ref: '#/components/schemas/PostingNewPost'

/user/report: post: summary: Отправка жалобы. requestBody: content: multipart/form-data: schema: type: object properties: board: type: string thread: type: integer post: type: array items: type: integer comment: type: string

          required:
            - board
            - thread
            - comment
  responses:
    '200':
      description: OK
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Report'

/user/passlogin: post: summary: Авторизация пасскода. parameters: - in: query name: json description: Параметр, указывающий что запрос выполняется не пользователем и ответ нужен в формате json. schema: type: integer default: 1 required: true requestBody: content: multipart/form-data: schema: type: object properties: passcode: type: string

          required:
            - passcode
  responses:
    '200':
      description: OK
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Passcode'

/api/like: get: summary: Добавление лайка на пост. parameters: - in: query name: board schema: type: string required: true description: ID доски, например, b. - in: query name: num schema: type: integer minimum: 1 required: true description: Номер поста. responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/Like'

/api/dislike: get: summary: Добавление дизлайка на пост. parameters: - in: query name: board schema: type: string required: true description: ID доски, например, b. - in: query name: num schema: type: integer minimum: 1 required: true description: Номер поста. responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/Like'

components: schemas: ErrorCode: type: integer description: | * 0 NoError, ошибки нет. * 403 ErrorForbidden, ошибка доступа. * 666 ErrorInternal, внутренняя ошибка. * 667 ErrorNotFound, используется для совместимости, если запрос не существует.

    * -2 ErrorNoBoard, доска не существует.
    * -3 ErrorNoParent, тред не существует.
    * -31 ErrorNoPost, пост не существует.
    * -4 ErrorNoAccess, контент существует, но у вас нет доступа.
    * -41 ErrorBoardClosed, доска закрыта.
    * -42 ErrorBoardOnlyVIP, доступ к доске возможен только с пасскодом.
    * -5 ErrorCaptchaNotValid, капча не валидна.
    * -6 ErrorBanned, вы были забанены. Сообщение содержит причину и номер бана.
    * -7 ErrorThreadClosed, тред закрыт.
    * -8 ErrorPostingToFast, вы постите слишком быстро ИЛИ установлен лимит на создание тредов на доске.
    * -9 ErrorFieldTooBig, поле слишком большое. Например, комментарий превысил лимит.
    * -10 ErrorFileSimilar, похожий файл уже был загружен.
    * -11 ErrorFileNotSupported, файл не поддерживается.
    * -12 ErrorFileTooBig, слишком большой файл.
    * -13 ErrorFilesTooMuch, вы загрузили больше файлов, чем разрешено на доске.
    * -14 ErrorTripBanned, трипкод был забанен.
    * -15 ErrorWordBanned, в комментарии недопустимое выражение.
    * -16 ErrorSpamList, в комментарии выражение из спамлиста.
    * -19 ErrorEmptyOp, при создании треда необходимо загрузить файл.
    * -20 ErrorEmptyPost, пост не может быть пустым, необходим комментарий/файл/etc.
    * -21 ErrorPasscodeNotExist, пасскод не существует.
    * -22 ErrorLimitReached, достигнут лимит запросов, попробуйте позже.
    * -23 ErrorFieldTooSmall, слишком короткое сообщение. (используется в поиске).

    * -50 ErrorReportTooManyPostsm, слишком много постов для жалобы.
    * -51 ErrorReportEmpty, вы ничего не написали в жалобе.
    * -52 ErrorReportExist, вы уже отправляли жалобу.

    * -300 ErrorAppNotExist, приложение не существует или было отключено.
    * -301 ErrorAppIDWrong, некорректный идентификатор приложения.
    * -302 ErrorAppIDExpired, идентификатор приложения истёк.
    * -303 ErrorAppIDSignature, неверная подпись поста с помощью идентификатора.
    * -304 ErrorAppIDUsed, указанный идентификатор уже был использован.

    * -24 ErrorWrongStickerID, некорректный идентификатор стикера.
    * -25 ErrorStickerNotFound, стикер не найден.
  enum:
    - 0
    - 403
    - 666
    - 667

    - -2
    - -3
    - -31
    - -4
    - -41
    - -42
    - -5
    - -6
    - -7
    - -8
    - -9
    - -10
    - -11
    - -12
    - -13
    - -14
    - -15
    - -16
    - -19
    - -20
    - -21
    - -22
    - -23

    - -300
    - -301
    - -302
    - -303
    - -304

    - -24
    - -25

Error:
  type: object
  description: Ошибка запроса.
  properties:
    code:
      $ref: '#/components/schemas/ErrorCode'
    message:
      type: string
      description: Описание ошибки на русском языке.

FileType:
  type: integer
  description: |
    * 0 FileTypeNone
    * 1 FileTypeJpg
    * 2 FileTypePng
    * 3 FileTypeAPng
    * 4 FileTypeGif
    * 5 FileTypeBmp
    * 6 FileTypeWebm
    * 7 FileTypeMp3, не используется в данный момент.
    * 8 FileTypeOgg, не используется в данный момент.
    * 10 FileTypeMp4
    * 100 FileTypeSticker
  enum:
    - 0
    - 1
    - 2
    - 3
    - 4
    - 5
    - 6
    - 7
    - 8
    - 10
    - 100

CaptchaType:
  type: string
  description: |
    Каждый тип капчи так же требует дополнительные параметры для её валидации:
    * emoji_captcha: Два.ч emoji капча
    emoji_captcha_id - строка, полученная после решения капчи.
    * appid: app_response_id и app_response
    app_response_id - результат запроса к этому методу с публичным ключём приложения: /api/captcha/app/id/{public_key}
    app_response - sha256(app_response_id + '|' + private_key)
    * passcode: cookie passcode_auth
    * nocaptcha: капча не требуется, никакие дополнительные параметры тоже.
  enum:
    - emoji_captcha
    - appid
    - passcode
    - nocaptcha

File:
  type: object
  description: Модель файла.
  properties:
    name:
      type: string
    fullname:
      type: string
    displayname:
      type: string
    path:
      type: string
    thumbnail:
      type: string
    md5:
      type: string
    type:
      $ref: '#/components/schemas/FileType'
    size:
      type: integer
      description: Размер файла, в КБ.
    width:
      type: integer
    height:
      type: integer
    tn_width:
      type: integer
    tn_height:
      type: integer
    nsfw:
      type: integer
      description: Если >= 0, файл содержит NSFW контент, в данный момент реализовано не на всех досках.
    duration:
      type: string
      description: В случае видео/аудио файла, содержит продолжительность в формате XX:XX:XX.
    duration_secs:
      type: integer
      description: В случае видео/аудио файла, содержит продолжительность в секундах.
    pack:
      type: string
      description: В случае стикера, содержит ID стикер пака.
    sticker:
      type: string
      description: В случае стикера, содержит ID стикера.
    install:
      type: string
      description: В случае стикера, содержит ссылку на установку.
  required:
    - name
    - fullname
    - displayname
    - path
    - thumbnail
    - type
    - size
    - width
    - height
    - tn_width
    - tn_height

Board:
  type: object
  description: Модель доски.
  properties:
    id:
      type: string
    name:
      type: string
    category:
      type: string
    info:
      type: string
      description: Информация о доске.
    info_outer:
      type: string
      description: Информация о доске для главной.
    threads_per_page:
      type: integer
    bump_limit:
      type: integer
    max_pages:
      type: integer
    default_name:
      type: string
    enable_names:
      type: boolean
    enable_trips:
      type: boolean
    enable_subject:
      type: boolean
    enable_sage:
      type: boolean
    enable_icons:
      type: boolean
    enable_flags:
      type: boolean
    enable_dices:
      type: boolean
    enable_shield:
      type: boolean
    enable_thread_tags:
      type: boolean
    enable_posting:
      type: boolean
    enable_likes:
      type: boolean
    enable_oekaki:
      type: boolean
    file_types:
      type: array
      items:
        type: string
        description: Например, webm/jpeg/png/etc.
    max_comment:
      type: integer
    max_files_size:
      type: integer
    tags:
      type: array
      description: Массив тегов, которые доступны на этой доске, если они включены.
      items:
        type: string
    icons:
      type: array
      description: Массив иконок, которые доступны на этой доске, если они включены.
      items:
        type: object
        properties:
          num:
            type: integer
          name:
            type: string
          url:
            type: string
  required:
    - id
    - name
    - category
    - info
    - info_outer
    - threads_per_page
    - bump_limit
    - max_pages
    - default_name
    - enable_names
    - enable_trips
    - enable_subject
    - enable_sage
    - enable_icons
    - enable_flags
    - enable_dices
    - enable_shield
    - enable_thread_tags
    - enable_posting
    - enable_likes
    - enable_oekaki
    - file_types
    - max_comment
    - max_files_size

Boards:
  type: array
  items:
    $ref: '#/components/schemas/Board'

Post:
  type: object
  description: Модель поста.
  properties:
    num:
      type: integer
    parent:
      type: integer
    board:
      type: string
    timestamp:
      type: integer
    lasthit:
      type: integer
    date:
      type: string
    email:
      type: string
    subject:
      type: string
    comment:
      type: string
    files:
      type: array
      items:
        $ref: '#/components/schemas/File'
    views:
      type: integer
    sticky:
      type: integer
    endless:
      type: integer
    closed:
      type: integer
    banned:
      type: integer
    op:
      type: integer
    name:
      type: string
    icon:
      type: string
    trip:
      type: string
    trip_style:
      type: string
    tags:
      type: string
    likes:
      type: integer
    dislikes:
      type: integer
  required:
    - num
    - parent
    - board
    - timestamp
    - lasthit
    - date
    - comment
    - views
    - sticky
    - endless
    - closed
    - banned
    - op

MobileThreadPostsAfter:
  type: object
  properties:
    result:
      type: integer
    error:
      $ref: '#/components/schemas/Error'
    unique_posters:
      type: integer
    posts:
      type: array
      items:
        $ref: '#/components/schemas/Post'

MobileThreadLastInfo:
  type: object
  properties:
    result:
      type: integer
    error:
      $ref: '#/components/schemas/Error'
    thread:
      type: object
      properties:
        num:
          type: integer
        timestamp:
          type: integer
        posts:
          type: integer

MobilePost:
  type: object
  properties:
    result:
      type: integer
    error:
      $ref: '#/components/schemas/Error'
    post:
      $ref: '#/components/schemas/Post'

Captcha:
  type: object
  properties:
    result:
      type: integer
    error:
      $ref: '#/components/schemas/Error'
    type:
      $ref: '#/components/schemas/CaptchaType'
    id:
      type: string
    expires:
      type: integer
      description: Время в секундах после которого id перестанет действовать.
    input:
      type: string
      description: |
        Тип текста, изображённого на картинке капчи. Возможные варианты:
        * numeric - только цифры. (0123456789)
        * english - цифры и английские буквы. (0123456789abcdefghijklmnopqrstuvwxyz)
        * russian - цифры и русские буквы. (0123456789абвгдеёжзийклмнопрстуфхцчшщъыьэюя)
        * all - цифры, русские и английские буквы. (0123456789abcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщъыьэюя)
        * emoji - отдельный тип для emoji капчи
  required:
    - result
    - type
    - id

EmojiCaptchaShow:
  oneOf:
    - type: object
      properties:
        image:
          type: string
          description: PNG изображение содержащие "корректные" emoji, закодированное в base64
        keyboard:
          type: array
          items:
            type: string
          description: Массив PNG изображений, составляющий "клавиатуру" для выбора "корректного" emoji. Каждое изображение закодировано base64.
      required:
        - image
        - keyboard
    - type: object
      properties:
        success:
          type: string
          description: ID для использования в /posting как "emoji_captcha_id".
      required:
        - success

PostingNewThread:
  type: object
  properties:
    result:
      type: integer
    error:
      $ref: '#/components/schemas/Error'
    thread:
      type: integer
      description: Номер нового треда.

PostingNewPost:
  type: object
  properties:
    result:
      type: integer
    error:
      $ref: '#/components/schemas/Error'
    num:
      type: integer
      description: Номер нового поста.

Report:
  type: object
  properties:
    result:
      type: integer
    error:
      $ref: '#/components/schemas/Error'

Passcode:
  type: object
  properties:
    result:
      type: integer
    error:
      $ref: '#/components/schemas/Error'
    passcode:
      type: object
      properties:
        type:
          type: string
        expires:
          type: integer

Like:
  type: object
  properties:
    result:
      type: integer
    error:
      $ref: '#/components/schemas/Error'