Известные методы приватного API boosty.to

Автор: S0ER

Описание известных методов приватного API boosty.to

Чтобы сделать примеры более универсальными будут использованы две переменные:

  1. blogName - название блога на boosty.to
  2. token - Bearer-токен владельца данного блога

Важный метод, который может пригодиться - это получение списка подписок.

GET https://api.boosty.to/v1/blog/{{blogName}}/subscription_level/?show_free_level=true
Authorization: Bearer {{token}}

На выходе отдается JSON с подробным описанием всех существующих подписок:

 {
    "subscriptions": [],
    "currentId": null,
    "nextId": null,
    "data": [{...
    }, {
        "name": "STREAM",
        "promos": [],
        "externalApps": {...
        },
        "deleted": false,
        "isArchived": false,
        "ownerId": 17326198,
        "price": 200,
        "id": 2527971,
        "currencyPrices": {...
        },
        "data": [],
        "badges": [],
        "hasActivePromo": false,
        "createdAt": 1709746048
    }, {
        "externalApps": {...
        },
        "deleted": false,
        "isArchived": false,
        "ownerId": 17326198,
        "price": 300,
        "name": "WORKSHOP",
        "promos": [],
        "hasActivePromo": false,
        "createdAt": 1709746062,
        "id": 2527973,
        "currencyPrices": {...
        },
        "data": [],
        "badges": []
    }]
}

Как видно на примере - в поле data[i].name хранится наименование уровня подписки boosty.to. Эти данные можно будет использовать в дальнейшем для сопоставления уровней подписок Администратором.

Ну и конечно же метод для получения всех подписчиков с их уровнем подписки:

GET https://api.boosty.to/v1/blog/{{blogName}}/subscribers?sort_by=on_time&offset=0&limit=10&order=gt
Authorization: Bearer {{token}}

Проблема

Указанные в запросе GET-параметры используются по умолчанию, в том числе и limit=10, что совершенно не подходит, при количестве подписчиков большем, чем пальцев на руках.

Решение

  1. В лоб: установить большое значение лимита, например: 100000
  2. Более элегантное: Есть метод в API, который может помочь:
GET https://api.boosty.to/v1/blog/stat/{{blogName}}/current
Authorization: Bearer {{token}}

Данный метод возвращает JSON следующего вида:

{
    "paidCount": 2,
    "hold": 0,
    "income": 0,
    "payoutSum": 0,
    "balance": 0,
    "followersCount": 0
}

Здесь стоит обратить внимание на значение поля paidCount - это количество платных подписчиков. Данное значение и можно передавать в limit

Таким образом запрос подписчиков вернет следующий JSON:

  
 {
   "offset": 0,
   "limit": 2,
   "total": 2,
   "data": [
     {
       "email": "test1@test.ru",
       "level": {
         // ...
        "name": "STREAM"
      },
      // ...
      "name": "Тестовый Тестировщик",
      "id": 23464233,
      "isBlackListed": false,
      "subscribed": true
    },
    {
      "email": "lysiy@blesk.ru",
      "level": {
        // ...
        "name": "WORKSHOP",
      },
      "name": "Гоша Куценко",
      "isBlackListed": false,
      "id": 123456789,
      "subscribed": true,
    }
  ]
}

Останется преобразовать полученные JSON в объекты и прокинуть их на фронт

Процесс отправки личного сообщения:

GET https://api.boosty.to/v1/dialog?user_id={{user_id}}
Authorization: Bearer {{token}}

Ответ: (когда нет диалога/сообщений; при активном диалоге ответ аналогичен POST методу) 201


{
    "relation": {
        "type": "subscriber",
        "isChatmateBlackListed": false,
        "canWrite": true,
        "startAt": 1720339878,
        "needDonation": false,
        "canWriteMe": true, "isBlackListed": false
    },
    "chatmate": {
        "id": {{id}},
        "avatarUrl": "https://images2.boosty.to/user/{{id}}/avatar?change_time=1720286807",
        "hasAvatar": true,
        "name": "{{name}}",
        "url": "{{id}}",
        "isBlogger": false
    }
}

Метод для получения dialog_id:

POST https://api.boosty.to/v1/dialog/
Authorization: Bearer {{token}}
Data: user_id={{user_id}}

Ответ: 201

{
    "unreadMsgCount": 0,
    "createdAt": 1720340960,
    "wsChannel": "$dialog:{{dialog_id}}",
    "id": {{dialog_id}},
    "chatmate": {
    "isBlogger": false,
    "id": {{chatmate_id}},
    "url": "{{chatmate_id}}",
    "hasAvatar": true,
    "name": "{{chatmate_name}}",
    "avatarUrl": "https://images2.boosty.to/user/{{chatmate_id}}/avatar?change_time=1720286807"},
    "signedQuery": "?user_id={{chatmate_id}}&content_id={{dialog_id}}&expire_time=1720427360&sign={{somet_token}}",
    "relation":{
        "isBlackListed": false,
        "type": "subscriber",
        "needDonation": false,
        "canWriteMe": true,
        "isChatmateBlackListed": false,
        "canWrite": true,
        "startAt": 1720339878
    }
}

Метод для отправки личного сообщения:

POST https://api.boosty.to/v1/dialog/{{dialog_id}}/message

Authorization: Bearer {{token}}

Data: data=[
{"type":"link","content":"[\"some text\",\"unstyled\",[]]","modificator":"", "url":"{{url}}",
{"type":"text","content":"","modificator":"BLOCK_END"}
]&
teaser_data=[]

Ответ:

{
    "isPaid": false,
    "id": 14694520,
    "currencyPrices": {
        "RUB": 100,
        "USD": 1.18
    },
    "previewType": "text",
    "dialogId": {{dialog_id}},
    "attachments": {
        "files": {
            "count": 0
         },
         "videos": {
            "previewUrl": "",
            "count": 0
         },
         "audios": {
            "count": 0
         },
         "text": {
            "count":1
         },
         "images": {
            "previewUrl": "",
            "count":0
          }
    },
    "teaser": [],
    "isRead": false,
    "isDeleted": false,
    "authorId": {{user_id}},
    "data":
        [
        {
            "content": "[\"tut\",\"unstyled\",[]]",
            "explicit": false,
            "type": "link",
            "url": "https://soer.pro"
         },
         {
              "content": "",
              "modificator": "BLOCK_END",
              "type": "text"
          }
        ],
    "payWall": false,
    "createdAt": 1720347244
}

Типы сообщений:

  • text
  • smile
  • image
  • ok_video
  • file
  • audio_file
  • link