ΠΠΎΡ - ΡΡΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠΈΠΏ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ. ΠΠΎΠ΄ Π½ΠΈΠΌ Π½Π΅Π»ΡΠ·Ρ Π·Π°Π»ΠΎΠ³ΠΈΠ½ΠΈΡΡΡΡ, Π° ΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ·Π΄Π°ΡΠ΅Π»Ρ ΡΠ΅ΡΠ΅Π· InfoBot-Π°. ΠΠΎΡ ΠΏΠΎΠ΄ΡΠΈΠ½ΡΠ΅ΡΡΡ ΠΎΠ±ΡΠΈΠΌ ΠΏΡΠ°Π²Π°ΠΌ ΡΠΈΡΡΠ΅ΠΌΡ, Ρ.Π΅. Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π² ΡΠ°Ρ Π² ΠΊΠΎΡΠΎΡΡΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΈΡΠ°ΡΡ/ΡΠΈΡΠ°ΡΡ. ΠΠΎΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ ΡΠ΅ΠΊΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΎΠ±ΡΠ°ΡΠ΅Π½Π½ΡΡ ΠΊ Π½Π΅ΠΌΡ, Π΅ΡΠ»ΠΈ Π·Π°Π΄Π°Π½ ΠΎΠ±ΡΠ°ΡΠ½ΡΠΉ url. Π§ΠΈΡΠ°ΡΡ Π²ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΡΠ°ΡΠ° Π±ΠΎΡ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ.
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π±ΠΎΡΠΎΠΌ
CΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΈ ΠΌΠ΅Π½ΡΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π±ΠΎΡΠ° ΠΌΠΎΠΆΠ½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π±ΠΎΡΠ° InfoBot Π² ΡΠ²ΠΎΠ΅ΠΌ Info Chat-Π΅.
ΠΠ»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π±ΠΎΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π° @infobot new_bot helpbot ChatHelpBot, Π³Π΄Π΅:
- ΠΏΠ΅ΡΠ²ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ, ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΠ΅ ΠΈΠΌΡ, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΠΊΠ°Π½ΡΠΈΠ²Π°ΡΡΡΡ Π½Π°
bot, - Π²ΡΠΎΡΠΎΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ, ΡΠΈΡΠ°Π΅ΠΌΠΎΠ΅ ΠΈΠΌΡ.
Π ΠΎΡΠ²Π΅Ρ ΠΏΡΠΈΠ΄Π΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Ρ ΠΊΠ»ΡΡΠΎΠΌ ΠΠΠ, Π³Π΄Π΅:
URL_KEY, ΠΏΠ΅ΡΠ²ΡΠ΅ 8 ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ url Π±ΠΎΡΠ°API_KEY, ΠΎΡΠ±ΡΠΎΡΠΈΠΌ ΠΏΠ΅ΡΠ²ΡΠ΅ 20 ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠΌ ΠΈ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΠΊΠ»ΡΡ ΠΠΠ, Π΄Π»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΠΏΠΎΡΡΠΎΠ² ΠΈ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ Π΄ΡΡΠ³ΠΈΠΌ ΠΠΠ (ΡΠ΅ΡΠ΅Π· Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊX-APIToken).
ΠΠΎΠΌΠ°Π½Π΄Π° Π±ΠΎΡΡ
@infobot new_bot uniquenamebot VisibleNameBot
ΠΡΠ²Π΅Ρ Π±ΠΎΡΠ°
New bot @uniquenamebot created
Secret key: as3afgmkkmmepfbosv6o6hpph8s3fj2b9kpd0jutpts3i9ct67u
To start using bot you need setup callback url with command set_bot uniquenamebot url http://example.com/as3afgmk
Url must contain as3afgmk
API - as3afgmkkmmepfbosv6o6hpph8s3fj2b9kpd0jutpts3i9ct67u, Π³Π΄Π΅
URL_KEY = as3afgmkAPI_KEY = 6hpph8s3fj2b9kpd0jutpts3i9ct67u
as3afgmk kmmepfbosv6o 6hpph8s3fj2b9kpd0jutpts3i9ct67u
|--------| | |
URL_KEY(8) | |
|---------(20)--------|------------API_KEY------------|
{
`X-APIToken`: '6hpph8s3fj2b9kpd0jutpts3i9ct67u'
}
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° url, Π½Π° ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄ΡΡ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΊ Π±ΠΎΡΡ
ΠΠΎΠΌΠ°Π½Π΄Π° @infobot set_bot helpbot url http://example.com/as3afgmk, Π³Π΄Π΅
helpbot- ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΠ΅ ΠΈΠΌΡ Π±ΠΎΡΠ°,url- ΡΠ΅Π΄Π°ΠΊΡΠΈΡΡΠ΅ΠΌΠ°Ρ ΠΎΠΏΡΠΈΡ,http://example.com/as3afgmk- Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΎΠΏΡΠΈΠΈ, Π°Π΄ΡΠ΅Ρ, ΠΊΡΠ΄Π° Π±ΡΠ΄ΡΡ ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ.
ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΏΠΎ Π±ΠΎΡΡ
ΠΠΎΠΌΠ°Π½Π΄Π° bot_info <unique_name> ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΡΠ·Π½Π°ΡΡ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΡΡ ΠΈΠ½ΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ Π±ΠΎΡΠ΅ , Π³Π΄Π΅
<unique_name>- ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΠ΅ ΠΈΠΌΡ ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π±ΠΎΡΠ°
ΠΠΎΠΌΠ°Π½Π΄Π° Π±ΠΎΡΡ
bot_info uniquenamebot
ΠΡΠ²Π΅Ρ Π±ΠΎΡΠ°
@uniquenamebot
---
NAME: VisibleNameBot
RECEIVER URL:
http://example.com/as3afgmk
on this url you will receive messages from users
SENDING URL:
POST https://api.verbosity.io/bot/message
BODY {"key": "6hpph8s3fj2b9kpd0jutpts3i9ct67u", "text": "example text", "chat_id": <chat_id:int>}
with this url you will be able to send messages to chats where your bot has access
KEY: as3afgmkkmmepfbosv6o6hpph8s3fj2b9kpd0jutpts3i9ct67u
ΠΡΠΎΡΠΌΠΎΡΡ Π΄ΠΎΡΡΡΠΏΠ½ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄
ΠΠΎΠΌΠ°Π½Π΄Ρ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ, ΠΎΡΠΏΡΠ°Π²ΠΈΠ² @infobot help
ΠΠΎΠΌΠ°Π½Π΄Π° Π±ΠΎΡΡ
@infobot help
ΠΡΠ²Π΅Ρ Π±ΠΎΡΠ°
bots - list your bots
new_bot <unique_name> <friendly name> - create new bot
set_bot <unique_name> <option> <value> - set option to bot
bot_new_key <unique_name> - generate new key
bot_info <unique_name> - bot details
ΠΡΠΏΡΠ°Π²ΠΊΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ
ΠΡΠΏΡΠ°Π²ΠΊΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Π² Π½Π΅ΠΏΡΠΈΠ²Π°ΡΠ½ΡΠΉ ΡΠ°Ρ
POST /bot/message
Parameters
No parameters
Request body
{
"key": "6hpph8s3fj2b9kpd0jutpts3i9ct67u"
"chat_id": 37, // int
"reply_no": null, // int or null
"text": "@all test" // text, 10k symbols limit
}
Responses
200 OK
{
"post_no": 123
}
ΠΡΠΈΠΌΠ΅Ρ Π·Π°ΠΏΡΠΎΡΠ°
response = httpx.post("https://api.verbosity.io/bot/message", json={
"key": "6hpph8s3fj2b9kpd0jutpts3i9ct67u",
"text": "example text",
"chat_id": 37,
# "reply_no": 8 #ΠΎΡΠ²Π΅Ρ Π½Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅
}
)
ΠΡΠΏΡΠ°Π²ΠΊΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Π² ΠΏΡΠΈΠ²Π°ΡΠ½ΡΠΉ ΡΠ°Ρ
ΠΠΎ user_id
POST /msg/post/private
Parameters
No parameters
Request body
{
"text": "some text",
"user_id": 12
}
Responses
200 OK
{
"chat_id": 23,
"post_no": 123
}
ΠΡΠΈΠΌΠ΅Ρ Π·Π°ΠΏΡΠΎΡΠ°
headers = {
"X-APIToken": "6hpph8s3fj2b9kpd0jutpts3i9ct67u"
}
response = httpx.post("https://api.verbosity.io/msg/post/private", headers = headers, json={
"text": "example text",
"user_id": 12
# "reply_no": 8 #ΠΎΡΠ²Π΅Ρ Π½Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅
}
)
ΠΠΎ email
POST /msg/post/private
Parameters
No parameters
Request body
{
"text": "some text",
"user_email": "user@example.com"
}
Responses
200 OK
{
"chat_id": 23,
"post_no": 123
}
ΠΡΠΈΠΌΠ΅Ρ Π·Π°ΠΏΡΠΎΡΠ°
headers = {
"X-APIToken": "6hpph8s3fj2b9kpd0jutpts3i9ct67u"
}
response = httpx.post("https://api.verbosity.io/msg/post/private", headers = headers, json={
"key": "6hpph8s3fj2b9kpd0jutpts3i9ct67u",
"text": "example text",
"user_email": "user@example.com"
# "reply_no": 8 #ΠΎΡΠ²Π΅Ρ Π½Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅
}
)
ΠΠΎ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΠΌΡ ΠΈΠΌΠ΅Π½ΠΈ
POST /msg/post/private
Parameters
No parameters
Request body
{
"text": "hello world!",
"user_unique_name": "unique_name"
}
Responses
200 OK
{
"chat_id": 23,
"post_no": 123
}
ΠΡΠΈΠΌΠ΅Ρ Π·Π°ΠΏΡΠΎΡΠ°
headers = {
"X-APIToken": "6hpph8s3fj2b9kpd0jutpts3i9ct67u"
}
response = httpx.post("https://api.verbosity.io/msg/post/private", headers = headers, json={
"key": "6hpph8s3fj2b9kpd0jutpts3i9ct67u",
"text": "example text",
"user_unique_name": "unique_name"
# "reply_no": 8 #ΠΎΡΠ²Π΅Ρ Π½Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅
}
)
ΠΡΠΏΡΠ°Π²ΠΊΠ° ΡΠ°ΠΉΠ»ΠΎΠ² Π² ΡΠ°Ρ
ΠΠΎΡ ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡ ΡΠ°ΠΉΠ»Ρ Π² ΡΠ°Ρ ΡΠΎΡΡΠ°Π²Π½ΡΠΌ Π·Π°ΠΏΡΠΎΡΠΎΠΌ Ρ ΠΏΠΎΠΌΠΎΡΡΡ multipart/form-data, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠΉΡΡ Π΄Π»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ HTML-ΡΠΎΡΠΌ
POST https://file.verbosity.io/new/upload
Parameters
No parameters
Request multipart/form-data
chat_id = 37 &
size = {file_size}
data = {file_data}
Responses
200 OK
{
"guid": "2031c0eb0ff045c69dbbd9f9624f307b"
}
ΠΡΠΈΠΌΠ΅Ρ Π·Π°ΠΏΡΠΎΡΠ°
headers = {"X-APIToken": "6hpph8s3fj2b9kpd0jutpts3i9ct67u"}
payload = {"chat_id": 70737, "size": len((open("example.txt", "rb")).read())}
data = {"data": open("example.txt", "rb")}
response = httpx.post("https://file.verbosity.io/new/upload", headers=headers, data=payload, files=data)
ΠΡΠΈΠΌΠ΅Ρ Π·Π°ΠΏΡΠΎΡΠ° curl
-H "X-APIToken: ..."
-X POST
-F "size=`wc -c < ./ansible.log`"
-F "chat_id=37"
-F "data=@./ansible.log"
https://file.verbosity.io/new/upload;
ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΎΡΠΈΠ±ΠΎΠΊ
ΠΡΠΈΠ±ΠΊΠΈ Π΄ΠΎΡΡΡΠΏΠ°
{
"code": "access_deny"
"message": "...some text..."
}
ΠΡΠΈΠ±ΠΊΠΈ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ
ΠΠΎΠΆΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΏΠΎ ΡΠ»Π°Π³Ρ "tamtam_response_api": true
{
"tamtam_response_api": true,
"codes": {"<field_name>|non_field": "str_code"},
"field_errors": {"<field_name>|non_field": "str_message"}
"extra": {}, // optioanl
"error": "str_message"
}
ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ
ΠΠ° Π°Π΄ΡΠ΅Ρ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ @infobot set_bot helpbot url http://example.com/as3afgmk
POST-ΠΎΠΌ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π² ΡΠΎΡΠΌΠ°ΡΠ΅ json
{
// ΠΊΡΠΎ ΠΎΠ±ΡΠ°ΡΠΈΠ»ΡΡ ΠΊ Π±ΠΎΡΡ
"user_id": 12, // int
"user_unique_name": "real_user", // str or null, unique_name ΠΏΠΎ user_id
// Π³Π΄Π΅ Π±ΡΠ»ΠΎ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ (ΠΏΠΎΡΡ, ΡΠ°Ρ, ΠΊΠΎΠΌΠ°Π½Π΄Π°)
"post_no": 11, // int
"chat_id": 21, // int
"organization_id": null, // null or int
// ΡΡΠΎ Π±ΡΠ»ΠΎ Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ Π±ΠΎΡΡ
"text": "some text", // str
"text_parsed": [{"type": "text", "value": "some text"}], // list[dict], ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π½Π½ΡΠ΅ Π±Π»ΠΎΠΊΠΈ ΡΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ΅ΠΊΡΡΠ°
// Π΅ΡΠ»ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΎΡΠ²Π΅Ρ Π½Π° Π΄ΡΡΠ³ΠΎΠΉ ΠΏΠΎΡΡ, ΡΡΡ Π±ΡΠ΄Π΅Ρ Π½ΠΎΠΌΠ΅Ρ ΠΈ ΡΠ΅ΠΊΡΡ ΡΡΠΎΠ³ΠΎ ΠΏΠΎΡΡΠ°
"reply_no": 7, // optional, int
"reply_text": "some text", // optional, str
// Π΅ΡΠ»ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠ°ΠΉΠ», ΡΡΡ Π±ΡΠ΄Π΅Ρ guid ΠΈ ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π°
"file_guid": "5d9d966e0dcc4cb28a86acd79323cf2b", // optional, str (hex)
"file_name": "example.txt", // optional, str
// ΡΠΏΠΈΡΠΎΠΊ ΠΏΡΠΈΠΊΡΠ΅ΠΏΠ»Π΅Π½Π½ΡΡ
ΡΠ°ΠΉΠ»ΠΎΠ² (ΡΠ°ΠΉΠ»Ρ Π±ΡΠ΄ΡΡ Π·Π°Π³ΡΡΠΆΠ΅Π½Ρ Π΄ΠΎ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΠΏΠΎΡΡΠ°, ΠΊΡΠ΄Π° ΠΎΠ½ΠΈ ΠΏΡΠΈΠΊΡΠ΅ΠΏΠ»Π΅Π½Π½Ρ, Π½ΠΎ ΠΏΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΡΠΈΡΡΠ²Π°ΡΡ, ΡΡΠΎ ΡΠ°ΠΉΠ» Ρ ΡΠΊΠ°Π·Π°Π½Π½ΡΠΌ guid ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΡΡΡΡΡΠ²ΠΎΠ²Π°ΡΡ ΠΈΠ»ΠΈ Π±ΡΡΡ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ΅Π½)
"attachments": null, // optional, list[str] - ΡΠΏΠΈΡΠΎΠΊ guid ΡΠ°ΠΉΠ»ΠΎΠ²
}
ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ X-Signature - ΠΏΠΎΠ΄ΠΏΠΈΡΡ ΠΏΠ°ΠΊΠ΅ΡΠ°, Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΠ°ΠΊ:
BKEY = to_bytes(int("<key>", 32))
def _make_signature(body: str):
return str(base64.b64encode(
hmac.new(BKEY, bytes(body, "utf8"), digestmod=hashlib.sha256).digest()
), "utf8")
if request.headers["x-signature"] != _make_signature(await request.text()):
print("Check failed")
ΠΠΎΠΌΠ°Π½Π΄Ρ Π±ΠΎΡΠ° (bot actions)
Π ΡΠ»ΡΡΠ°ΡΡ ΠΊΠΎΠ³Π΄Π° Π±ΠΎΡ ΠΈΠΌΠ΅Π΅Ρ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠ΅ ΡΠΈΡΠ»ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈΠ»ΠΈ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π²ΡΠ±ΠΎΡ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ² - Π²Π²ΠΎΠ΄ ΠΊΠΎΠΌΠ°Π½Π΄ Π² Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΡΠ»ΠΎΠΆΠ½ΡΠΌ ΠΈ Π½Π΅ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΡΠΌ Π΄Π»Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ. ΠΠΎΡ, ΠΏΠΎΠΌΠΈΠΌΠΎ Π²Ρ ΠΎΠ΄ΡΡΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ (actions), ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΠΎΡ ΡΠ°ΠΌ ΡΠΎΡΠΌΠΈΡΡΠ΅Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ Π² ΡΠ²ΠΎΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΡ Π² Π²ΠΈΠ΄Π΅ ΡΡΡΠ»ΠΎΠΊ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠΎΡΠΌΠ°ΡΠ° (Π²Π°Π»ΠΈΠ΄Π½ΡΡ url):
bot://{action}?title={title}[&{key}={value}]
- action: <str:
a-z_> - ΠΈΠΌΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ - title:
- ΡΠ΅ΠΊΡΡ, ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌΡΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π² ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΈ - key, value:
- Π»ΡΠ±ΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ - ΠΎΠ±ΡΠ°Ρ Π΄Π»ΠΈΠ½Π½Π° ΡΡΡΠΎΠΊΠΈ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 1024 ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ², ΡΡΡΠΎΠΊΠΈ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΡΠΎΠ³Π½Π°ΡΡ ΡΠ΅ΡΠ΅Π· url-quoting
Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΡΠ²ΠΈΠ΄ΠΈΡ ΡΡΡΠ»ΠΊΡ (ΠΏΠΎΠ·ΠΆΠ΅ Π±ΡΠ΄ΡΡ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ Π²Π°ΡΠΈΠ°Π½ΡΡ ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ), Π½Π°ΠΆΠ°Π² Π½Π° ΠΊΠΎΡΠΎΡΡΡ Π±ΠΎΡΡ Π±ΡΠ΄Π΅Ρ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ Π·Π°ΠΏΡΠΎΡ Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Π½Π½ΡΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ:
POST https://{bot-server-url}/act
{
"user_id": <int>, // ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°ΠΆΠ°Π» Π½Π° action-ΡΡΡΠ»ΠΊΡ
"chat_id": <int>, // ΡΠ°Ρ Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π²ΡΠ·Π²Π°Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°
"post_no": <int>, // ΠΏΠΎΡΡ Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π±ΠΎΡΠΎΠΌ Π±ΡΠ»Π° ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°
"organization_id": <int> | null // ΠΊΠΎΠΌΠ°Π½Π΄Π° Π² ΠΊΠΎΡΠΎΡΠΎΠΉ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡΡ ΡΠ°Ρ
"action": <str> // ΠΈΠΌΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
"params": {<str>: <str>} // Π²ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΏΠΎΡΠ»Π΅ ?
}
Π‘Π»Π΅Π΄ΡΠ΅Ρ ΡΡΠΈΡΡΠ²Π°ΡΡ:
- action-ΡΡΡΠ»ΠΊΠΈ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΡ Π±ΠΎΡΠΎΠ² (ΠΎΠ±ΡΡΠ½ΡΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°ΡΡ)
- Π½Π°ΠΆΠ°ΡΠΈΠ΅ Π½Π° action-ΡΡΡΠ»ΠΊΡ Π½Π΅ ΡΠΎΠΏΡΠΎΠ²ΠΎΠΆΠ΄Π°Π΅ΡΡΡ ΠΏΠΎΡΡΠΎΠΌ ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ Π΄ΡΡΠ³ΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Π΄Π»Ρ Π²ΡΠ΅Ρ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΎΠ² ΡΠ°ΡΠ°
- action-ΡΡΡΠ»ΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΆΠΈΠΌΠ°ΡΡ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π·, Π² Π³ΡΡΠΏΠΏΠΎΠ²ΡΡ ΡΠ°ΡΠ°Ρ ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠΆΠ°ΡΡ Π»ΡΠ±ΠΎΠΉ ΡΡΠ°ΡΡΠ½ΠΈΠΊ
titleΠΈuiΠ·Π°ΡΠ΅Π·Π΅ΡΠ²ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΠ»ΡΠΆΠ΅Π±Π½ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ
ΠΡΠΈΠΌΠ΅Ρ:
Π’Π΅ΠΊΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΡ Π±ΠΎΡΠ°
ΠΡΠ±Π΅ΡΠΈΡΠ΅ Π΄ΠΎΡΠΊΡ Π΄Π»Ρ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΠΊΠ°ΡΡΠΎΡΠ΅ΠΊ ΠΏΠΎ-ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ:
bot://set_default_board?title=Team%20board&board_id=54623
bot://set_default_board?title=My%20board&board_id=324512
bot://set_default_board?title=Main%20board&board_id=83924
ΠΠ°ΠΏΡΠΎΡ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ Π±ΠΎΡΠ° ΠΏΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ Π½Π° ΡΡΡΠ»ΠΊΡ My board ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ (user#132)
POST https://example.com/as3afgmk/act
{
"user_id": 132,
"chat_id": 11768,
"post_no": 45876,
"organization_id": null,
"action": "set_default_board",
"params": {
"title": "My%20board",
"board_id": "324512"
}
}
ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΠΠ
ΠΡΠΎΠ±Π½Π°Ρ OpenApi3 ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ (ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΎΡΡΡΡΠΏΠ»Π΅Π½ΠΈΡ Π² ΠΎΡΠ²Π΅ΡΠ°Ρ , ValidationError ΠΌΠ°Π»ΠΎ ΠΎΠΏΠΈΡΠ°Π½). ΠΠΎΠΆΠ½ΠΎ ΠΎΡΠΊΡΡΡΡ Π² https://editor.swagger.io/ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ.
ΠΠΈΠΆΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π½Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ· API
ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ
ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ ΠΏΠΎ id
ΠΠ½Π°Ρ id ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡΠΎΡΠΈΡΡ ΠΎΠ±ΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ Π½Π΅ΠΌ
GET /core/user?ids=11,12,15.
Parameters
ids - id ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ
Request body
No body
Responses
200 OK
{
"users": [
{
"id": 0,
"name": "string",
"unique_name": "string",
"info": "string",
"info_parsed": [
{}
],
"deleted": true,
"active": true,
"time_updated": "string",
"time_created": "string",
"is_bot": true,
"organizations": [
0
]
}
]
}
ΠΡΠΈΠΌΠ΅Ρ Π·Π°ΠΏΡΠΎΡΠ°
ids = ","join([11, 12, 15])
url = "https://api.verbosity.io/core/user?ids={ids}"
headers = {
"X-APIToken": "6hpph8s3fj2b9kpd0jutpts3i9ct67u",
}
response = httpx.get(url, headers = headers)
ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ ΠΏΠΎ unique name
ΠΠ½Π°Ρ unique name ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡΠΎΡΠΈΡΡ ΠΎΠ±ΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ Π½Π΅ΠΌ
GET /core/user?unames=user0,user1,user2.
Parameters
unique name - ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΠ΅ ΠΈΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ
Request body
No body
Responses
200 OK
{
"users": [
{
"id": 0,
"name": "string",
"unique_name": "string",
"info": "string",
"info_parsed": [
{}
],
"deleted": true,
"active": true,
"time_updated": "string",
"time_created": "string",
"is_bot": true,
"organizations": [
0
]
}
]
}
ΠΡΠΈΠΌΠ΅Ρ Π·Π°ΠΏΡΠΎΡΠ°
unames = ","join(['user0','user1','user2'])
'
url = "https://api.verbosity.io/core/user?unames={unames}"
headers = {
"X-APIToken": "6hpph8s3fj2b9kpd0jutpts3i9ct67u",
}
response = httpx.get(url, headers = headers)
Π§Π°ΡΡ
ΠΠΎΠ»ΡΡΠΈΡΡ Π΄Π°Π½Π½ΡΠ΅ Π²ΡΠ΅Ρ Π΄ΠΎΡΡΡΠΏΠ½ΡΡ ΡΠ°ΡΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ Π² 2 ΠΏΡΠΈΠ΅ΠΌΠ°
ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ id ΡΠ°ΡΠΎΠ² (Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΡΠ°ΡΡΡΠ° Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ)
GET /core/chat/sync
Parameters
No parameters
Request body
No body
Responses
200 OK
{
"chats": [
0
]
}
ΠΡΠΈΠΌΠ΅Ρ Π·Π°ΠΏΡΠΎΡΠ°
url = "https://api.verbosity.io/core/chat/sync"
headers = {
"X-APIToken": "6hpph8s3fj2b9kpd0jutpts3i9ct67u"
}
response = httpx.get(url, headers = headers)
ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ ΡΠ°ΡΠΎΠ² ΠΏΠΎ id
GET /core/chat?ids=11,12,15.
Parameters
ids - id ΡΠ°ΡΠΎΠ²
Request body
No body
Responses
200 OK
{
"chats": [
{
"id": 0,
"title": "string",
"description": "string",
"organization_id": 0,
"posts_live_time": 0,
"two_step_required": true,
"history_mode": "string",
"org_visible": true,
"allow_api": true,
"read_only": true,
"posts_count": 0,
"pm": true,
"e2e": true,
"time_created": "string",
"time_updated": "string",
"time_edited": "string",
"author_id": 0,
"tnew": true,
"adm_flag": true,
"custom_title": "string",
"is_favorite": true,
"inviter_id": 0,
"tshow": true,
"user_time_edited": "string",
"history_start": 0,
"pinned": [
0
],
"member_ids": [
0
],
"admin_ids": [
0
],
"group_ids": [
0
],
"guests": [
0
],
"thread_users": [
0
],
"thread_admins": [
0
],
"thread_groups": [
0
],
"last_msg": "string",
"last_read_post_no": 0,
"last_msg_author_id": 0,
"last_msg_author": "string",
"last_msg_bot_name": "string",
"last_msg_text": "string"
}
]
}
ΠΡΠΈΠΌΠ΅Ρ Π·Π°ΠΏΡΠΎΡΠ°
ids = ","join([11, 12, 15])
url = "https://api.verbosity.io/core/chat?ids={ids}"
headers = {
"X-APIToken": "6hpph8s3fj2b9kpd0jutpts3i9ct67u"
}
response = httpx.get(url, headers = headers)
ΠΠΎΡ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ/ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ/ΡΠ΄Π°Π»ΡΡΡ ΡΠ°ΡΡ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ ΡΠΎ ΡΠ²ΠΎΠΈΠΌΠΈ ΠΏΡΠ°Π²Π°ΠΌΠΈ. Π Π΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΎΡΡΠ°Π²Π° ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΎΠ² ΡΠ°ΡΠ° Π±ΠΎΡΠ°ΠΌ Π½Π΅ Π΄ΠΎΡΡΡΠΏΠ½ΠΎ.
ΠΠ»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΏΡΠΈΠ²Π°ΡΠ½ΡΠΌΠΈ ΡΠ°ΡΠ°ΠΌΠΈ, Π΅ΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠ΅ ΠΠΠ POST /core/chat/pm/{user_id}, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ id ΠΏΡΠΈΠ²Π°ΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΡΠ°, ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΠΈΠ»ΠΈ Π²Π½ΠΎΠ²Ρ ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠ³ΠΎ.
ΠΠΎΡ ΠΌΠΎΠΆΠ΅Ρ Π²Ρ ΠΎΠ΄ΠΈΡΡ/Π²ΡΡ ΠΎΠ΄ΠΈΡΡ Π²/ΠΈΠ· ΡΠ°ΡΠΎΠ², ΡΠΊΡΡΠ²Π°ΡΡ Π½Π΅Π½ΡΠΆΠ½ΡΠ΅, Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ/ΡΠ±ΠΈΡΠ°ΡΡ ΠΈΠ· ΠΈΠ·Π±ΡΠ°Π½Π½ΡΡ , ΡΠΎΡΠΊΠ°ΡΡ.
ΠΠΎΠΌΠ°Π½Π΄Ρ
ΠΠΎΠ»ΡΡΠΈΡΡ Π΄Π°Π½Π½ΡΠ΅ Π²ΡΠ΅Ρ Π΄ΠΎΡΡΡΠΏΠ½ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄, ΠΌΠΎΠΆΠ½ΠΎ Π² 2 ΠΏΡΠΈΠ΅ΠΌΠ°
ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ id ΠΊΠΎΠΌΠ°Π½Π΄
GET /core/org/sync
Parameters
No parameters
Request body
No body
Responses
200 OK
{
"ids": [
0
]
}
ΠΡΠΈΠΌΠ΅Ρ Π·Π°ΠΏΡΠΎΡΠ°
url = "https://api.verbosity.io/core/org/sync"
headers = {
"X-APIToken": "6hpph8s3fj2b9kpd0jutpts3i9ct67u"
}
response = httpx.get(url, headers = headers)
ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ ΠΏΠΎ id
GET /core/org?ids=11,12,15.
Parameters
ids - id ΠΊΠΎΠΌΠ°Π½Π΄
Request body
No body
Responses
200 OK
{
"orgs": [
{
"id": 0,
"slug": "string",
"title": "string",
"description": "string",
"description_parsed": [
{}
],
"email_domain": "string",
"time_created": "string",
"time_updated": "string",
"two_step_required": true,
"default_chat_id": 0,
"is_member": true,
"is_admin": true,
"state": "string",
"inviter_id": 0,
"guests": [
0
],
"users": [
0
],
"admins": [
0
],
"groups": [
0
]
}
]
}
ΠΡΠΈΠΌΠ΅Ρ Π·Π°ΠΏΡΠΎΡΠ°
ids = ","join([11, 12, 15])
url = "https://api.verbosity.io/core/org?ids={ids}"
headers = {
"X-APIToken": "6hpph8s3fj2b9kpd0jutpts3i9ct67u"
}
response = httpx.get(url, headers = headers)
Π’Π°ΠΊ ΠΆΠ΅ Π±ΠΎΡ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ/ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ/ΡΠ΄Π°Π»ΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ ΡΠΎ ΡΠ²ΠΎΠΈΠΌΠΈ ΠΏΡΠ°Π²Π°ΠΌΠΈ. ΠΡ ΠΎΠ΄ΠΈΡΡ ΠΏΠΎ ΠΏΡΠΈΠ³Π»Π°ΡΠ΅Π½ΠΈΡ ΠΈ ΠΏΠΎΠΊΠΈΠ΄Π°ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ.
Π Π΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΎΡΡΠ°Π²Π° ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΎΠ² ΡΠ°ΡΠ° Π±ΠΎΡΠ°ΠΌ Π½Π΅ Π΄ΠΎΡΡΡΠΏΠ½ΠΎ.