Известные методы приватного API boosty.to
Автор: S0ER
Описание известных методов приватного API boosty.to
Чтобы сделать примеры более универсальными будут использованы две переменные:
- blogName - название блога на
boosty.to
- 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
, что совершенно не подходит, при количестве подписчиков большем, чем пальцев на руках.
Решение
- В лоб: установить большое значение лимита, например: 100000
- Более элегантное: Есть метод в 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