通知,随服务抵达
HTTP 调用即可发送。只发通知,无需搭建回调服务。
部署完成、订单更新、待办确认。用一个机器人,把消息送到身边,也把回复带回你的服务。
/api/openapi/v1/bot/messages请求体示例{
"requestId": "release-42",
"type": "card",
"title": "Deployment complete",
"content": "**v1.2.0** is live.",
"buttons": [{ "text": "Confirm", "action": "release.confirm" }]
}{
"requestId": "release-43",
"type": "markdown",
"content": "## Deployment complete\n**v1.2.0** is live."
}{
"requestId": "release-44",
"type": "text",
"content": "Deployment complete. v1.2.0 is live."
}HTTP 调用即可发送。只发通知,无需搭建回调服务。
文字、Markdown 与交互卡片,让提醒连上下一步行动。
通过 WebSocket 或 Webhook 接收文字回复和按钮事件。
接入文档
从创建、发送到接收回复,一份手册完成接入。
export BOT_BASE_URL='https://api.surprising.top:8443'
export BOT_TOKEN='替换为创建时显示的 Token'
curl "$BOT_BASE_URL/api/openapi/v1/bot/messages" \
-H "Authorization: Bearer $BOT_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"requestId":"hello-001","type":"text","content":"你好,第一条机器人消息已送达。"}'打开机器人详情的「打开会话」即可查看消息。你也可以先在「接入与测试」中使用「发送到我的会话」,确认消息样式和接收效果。
官方服务的根地址是 https://api.surprising.top:8443,接口前缀是 /api/openapi/v1/bot。自行部署时将 BOT_BASE_URL 换成自己的后端 HTTPS 根地址,不含 /api。机器人 Token 使用 Authorization: Bearer …,不能替代用户登录凭证调用管理接口。
export BOT_BASE_URL='https://api.surprising.top:8443'
export BOT_TOKEN='YOUR_BOT_TOKEN'
curl "$BOT_BASE_URL/api/openapi/v1/bot/messages" \
-H "Authorization: Bearer $BOT_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"requestId":"hello-001","type":"text","content":"Hello from my first bot."}'Choose “Open conversation” on the bot details page to see the message. You can also use “Send to my conversation” in “Connect & test” to preview and send a test message.
The official backend origin is https://api.surprising.top:8443. All endpoints start with /api/openapi/v1/bot. For a self-hosted service, replace BOT_BASE_URL with your backend HTTPS origin, without /api. Authenticate using Authorization: Bearer …. Bot Tokens cannot replace user credentials on management endpoints.
export BOT_BASE_URL='https://api.surprising.top:8443'
export BOT_TOKEN='YOUR_BOT_TOKEN'
curl "$BOT_BASE_URL/api/openapi/v1/bot/messages" \
-H "Authorization: Bearer $BOT_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"requestId":"hello-001","type":"text","content":"Hello from my first bot."}'ボット詳細の「会話を開く」でメッセージを確認できます。「接続とテスト」の「自分の会話に送信」でも、表示を確認してテストメッセージを送れます。
公式バックエンドのルート URL は https://api.surprising.top:8443、API の共通プレフィックスは /api/openapi/v1/bot です。自分で運用する場合は BOT_BASE_URL を自分のバックエンドの HTTPS ルート URL に変更し、末尾に /api を含めないでください。認証には Authorization: Bearer … を使用します。ボットの Token でユーザー用の管理 API を呼び出すことはできません。
export BOT_BASE_URL='https://api.surprising.top:8443'
export BOT_TOKEN='YOUR_BOT_TOKEN'
curl "$BOT_BASE_URL/api/openapi/v1/bot/messages" \
-H "Authorization: Bearer $BOT_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"requestId":"hello-001","type":"text","content":"Hello from my first bot."}'봇 상세 화면에서 ‘대화 열기’를 선택하면 메시지를 확인할 수 있습니다. ‘연동 및 테스트’의 ‘내 대화로 보내기’로 메시지 모양을 확인하고 테스트 메시지를 보낼 수도 있습니다.
공식 백엔드의 기본 주소는 https://api.surprising.top:8443이고 API 경로는 /api/openapi/v1/bot으로 시작합니다. 직접 호스팅할 경우 BOT_BASE_URL을 자신의 백엔드 HTTPS 기본 주소로 바꾸되 /api는 포함하지 마세요. 인증에는 Authorization: Bearer …를 사용합니다. 봇 Token으로 사용자 로그인 인증을 대신해 관리 API를 호출할 수는 없습니다.
export BOT_BASE_URL='https://api.surprising.top:8443'
export BOT_TOKEN='YOUR_BOT_TOKEN'
curl "$BOT_BASE_URL/api/openapi/v1/bot/messages" \
-H "Authorization: Bearer $BOT_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"requestId":"hello-001","type":"text","content":"Hello from my first bot."}'Выберите «Открыть диалог» в карточке бота, чтобы увидеть сообщение. В разделе подключения и тестирования также можно отправить тестовое сообщение в свой диалог и проверить его оформление.
Адрес официального сервера — https://api.surprising.top:8443. Все методы начинаются с /api/openapi/v1/bot. При самостоятельном размещении замените BOT_BASE_URL на HTTPS-адрес своего сервера без /api. Для аутентификации передавайте Authorization: Bearer …. Token бота не заменяет учётные данные пользователя в методах управления.
export BOT_BASE_URL='https://api.surprising.top:8443'
export BOT_TOKEN='YOUR_BOT_TOKEN'
curl "$BOT_BASE_URL/api/openapi/v1/bot/messages" \
-H "Authorization: Bearer $BOT_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"requestId":"hello-001","type":"text","content":"Hello from my first bot."}'Ouvrez la conversation depuis la fiche du bot pour voir le message. La rubrique de connexion et de test permet aussi d’envoyer un message de test dans votre conversation et de vérifier sa présentation.
L’origine du serveur officiel est https://api.surprising.top:8443. Tous les endpoints commencent par /api/openapi/v1/bot. Pour un service auto-hébergé, remplacez BOT_BASE_URL par l’origine HTTPS de votre serveur, sans /api. Authentifiez-vous avec Authorization: Bearer …. Le Token d’un bot ne remplace pas les identifiants utilisateur pour les endpoints de gestion.
export BOT_BASE_URL='https://api.surprising.top:8443'
export BOT_TOKEN='YOUR_BOT_TOKEN'
curl "$BOT_BASE_URL/api/openapi/v1/bot/messages" \
-H "Authorization: Bearer $BOT_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"requestId":"hello-001","type":"text","content":"Hello from my first bot."}'افتح المحادثة من صفحة تفاصيل الروبوت لرؤية الرسالة. يمكنك أيضًا إرسال رسالة تجريبية إلى محادثتك من قسم الاتصال والاختبار للتأكد من تنسيقها واستقبالها.
عنوان الخادم الرسمي هو https://api.surprising.top:8443، وتبدأ جميع المسارات بالبادئة /api/openapi/v1/bot. عند الاستضافة الذاتية، استبدل BOT_BASE_URL بعنوان خادمك الأساسي عبر HTTPS دون /api. استخدم Authorization: Bearer … للمصادقة. لا يحل Token الخاص بالروبوت محل بيانات تسجيل دخول المستخدم في واجهات الإدارة.
每个账户最多保留 3 个机器人,停用仍占名额,删除后释放。创建者默认订阅自己的机器人;发送时不传 chatId,就发送给创建者。
其他用户在应用中心通过机器人 ID 打开详情,点击「开始使用」后,你的服务才能向其会话发消息。使用该用户回复事件中的 chatId;不要自行拼接会话 ID。用户可以随时「停止接收」。
机器人消息在独立会话中展示,并有机器人标识。当前支持机器人与已订阅用户的一对一会话,不支持向好友私聊、群聊直接发送,也不提供定时发送接口。用户回复支持文字和引用文字;机器人会话不支持附件发送、音视频通话和阅后即焚。
Each account can retain up to 3 bots. Disabled bots count towards this limit; deleting a bot frees its slot. Creators are subscribed automatically. Omit chatId to send to the creator.
Other users can find a bot by ID in the App Center and choose “Start using” to authorize their own conversation. Use the chatId from that user's reply event; do not construct conversation IDs yourself. Users can stop receiving at any time.
Bot messages appear in a separate conversation with a bot label. Currently, bots support one-to-one conversations with subscribed users. Sending directly to friend chats or groups and scheduled sending are not supported. Users can reply with text or quoted text; attachments, calls and disappearing messages are unavailable in bot conversations.
各アカウントで保持できるボットは最大 3 個です。停止中のボットも上限に含まれ、削除すると枠が空きます。作成者は自動的に購読されます。chatId を省略すると作成者へ送信します。
他のユーザーはアプリセンターで ID を検索し、ボット詳細の「利用開始」で自分の会話を許可します。そのユーザーからの返信イベントに含まれる chatId を使い、会話 ID を自分で組み立てないでください。ユーザーはいつでも受信を停止できます。
ボットのメッセージは、ボットの表示が付いた独立した会話に届きます。現在は購読済みユーザーとの一対一の会話に対応しています。友達の個別チャットやグループへの直接送信、送信予約には対応していません。ユーザーはテキストと引用テキストで返信できます。ボットとの会話では添付ファイル、通話、消えるメッセージは利用できません。
계정마다 최대 3개의 봇을 유지할 수 있습니다. 비활성화한 봇도 한도에 포함되며 삭제하면 자리가 비워집니다. 생성자는 자동으로 구독합니다. chatId를 생략하면 생성자에게 전송합니다.
다른 사용자는 앱 센터에서 봇 ID로 검색하고 상세 화면의 ‘사용 시작’을 선택해 자신의 대화를 허용할 수 있습니다. 해당 사용자의 답장 이벤트에 포함된 chatId를 사용하고 대화 ID를 직접 조합하지 마세요. 사용자는 언제든 수신을 중지할 수 있습니다.
봇 메시지는 봇 표시가 있는 별도의 대화에 도착합니다. 현재는 구독한 사용자와의 일대일 대화만 지원합니다. 친구의 개인 채팅이나 그룹으로 직접 보내기, 예약 전송은 지원하지 않습니다. 사용자는 텍스트와 인용 텍스트로 답장할 수 있으며, 봇 대화에서는 첨부 파일, 통화, 사라지는 메시지를 사용할 수 없습니다.
На аккаунте можно хранить до 3 ботов. Отключённые боты учитываются в лимите; удаление освобождает место. Создатель подписывается автоматически. Если не передать chatId, сообщение получит создатель.
Другие пользователи могут найти бота по ID в Центре приложений и разрешить свой диалог, выбрав начало использования. Берите chatId из события с ответом пользователя, не составляйте идентификаторы диалогов самостоятельно. Пользователь может прекратить получение сообщений в любой момент.
Сообщения приходят в отдельный диалог с отметкой бота. Сейчас поддерживаются личные диалоги с подписавшимися пользователями. Прямая отправка в личные чаты друзей и группы, а также отложенная отправка не поддерживаются. Пользователь может ответить текстом или цитатой. В диалогах с ботом недоступны вложения, звонки и исчезающие сообщения.
Chaque compte peut conserver jusqu’à 3 bots. Les bots désactivés occupent une place ; leur suppression la libère. Le créateur est abonné automatiquement. Sans chatId, le message est envoyé au créateur.
Les autres utilisateurs peuvent rechercher le bot par ID dans le centre d’applications et commencer à l’utiliser pour autoriser leur conversation. Utilisez le chatId reçu dans l’événement de réponse de l’utilisateur ; ne construisez pas vous-même les identifiants de conversation. L’utilisateur peut arrêter la réception à tout moment.
Les messages apparaissent dans une conversation distincte identifiée comme bot. Seuls les échanges individuels avec des utilisateurs abonnés sont actuellement pris en charge. L’envoi direct aux conversations d’amis ou aux groupes et l’envoi programmé ne sont pas disponibles. L’utilisateur peut répondre par texte ou citation. Les pièces jointes, appels et messages éphémères ne sont pas proposés dans les conversations avec un bot.
يمكن لكل حساب الاحتفاظ بما يصل إلى 3 روبوتات. تظل الروبوتات المعطلة محسوبة ضمن الحد، ويؤدي حذفها إلى تحرير مكان. يشترك المنشئ تلقائيًا. إذا لم ترسل chatId، تُرسل الرسالة إلى المنشئ.
يمكن للمستخدمين الآخرين البحث عن الروبوت بمعرّفه في مركز التطبيقات والبدء باستخدامه للسماح بمحادثتهم. استخدم chatId الوارد في حدث رد ذلك المستخدم، ولا تركّب معرّفات المحادثات بنفسك. يستطيع المستخدم إيقاف استقبال الرسائل في أي وقت.
تظهر الرسائل في محادثة مستقلة تحمل علامة الروبوت. يدعم الإصدار الحالي المحادثات الفردية مع المستخدمين المشتركين. لا يدعم الإرسال مباشرة إلى محادثات الأصدقاء أو المجموعات، ولا يوفّر واجهة للإرسال المجدول. يستطيع المستخدم الرد بنص أو نص مقتبس. المرفقات والمكالمات والرسائل ذاتية الاختفاء غير متاحة في محادثات الروبوت.
| 方法 | 路径 | 用途 |
|---|---|---|
| GET | /api/openapi/v1/bot/me | 查看当前机器人的基本信息 |
| POST | /api/openapi/v1/bot/messages | 发送消息 |
| GET | /api/openapi/v1/bot/messages/{requestId} | 按发送请求 ID 查询投递状态 |
以上接口都需要 Bearer Token。发送和状态查询合计每个机器人每秒最多 10 次。
| 字段 | 必填 | 说明 |
|---|---|---|
requestId | 是 | 1–128 字符,同一机器人内唯一;重试时保持原值 |
chatId | 否 | 已授权会话,不传则发送给创建者 |
type | 是 | text、markdown、card,不区分大小写 |
content | 是 | 非空正文,最多 16000 字符 |
title | 否 | 卡片标题,最多 200 字符 |
image | 否 | 卡片图片的 HTTPS 地址,最多 2048 字符 |
fields | 否 | 卡片信息字段,最多 20 个 |
buttons | 否 | 卡片按钮,最多 5 个 |
同一个 requestId 和相同消息内容重复请求,会返回同一条投递记录,不会重复发送。将同一个 ID 用于不同内容或不同会话会返回 409。网络超时后重试应保留原 ID;新消息使用新 ID。
所有接口响应使用 { "code": 200, "resp": ... }。发送接口返回 HTTP 200 表示已写入聊天服务,202 表示已受理等待投递。以下是已发送时的响应示例,ID 和时间仅用于说明:
{
"code": 200,
"resp": {
"id": "投递记录 UUID",
"requestId": "hello-001",
"chatId": "bot_机器人UUID:用户ID",
"status": "SENT",
"messageId": "消息ID",
"seq": 12,
"error": null,
"createdAt": "2026-10-28T00:00:00Z"
}
}resp.status 为 PENDING、SENDING、SENT 或 FAILED。只有 SENT 后才有 messageId 和 seq;它表示消息已保存,不代表用户已读。HTTP 202 时响应体的 code 仍为 200,应检查 resp.status。
curl "$BOT_BASE_URL/api/openapi/v1/bot/messages/hello-001" \
-H "Authorization: Bearer $BOT_TOKEN"| Method | Path | Purpose |
|---|---|---|
| GET | /api/openapi/v1/bot/me | Read the current bot profile |
| POST | /api/openapi/v1/bot/messages | Send a message |
| GET | /api/openapi/v1/bot/messages/{requestId} | Query delivery by request ID |
All endpoints require a Bearer Token. Sending and status queries share a limit of 10 requests per second per bot.
| Field | Required | Description |
|---|---|---|
requestId | Yes | 1–128 characters; unique within the bot; reuse for retries |
chatId | No | An authorized conversation; defaults to the creator |
type | Yes | text, markdown or card, case-insensitive |
content | Yes | Nonblank body, up to 16000 characters |
title | No | Card title, up to 200 characters |
image | No | HTTPS card image URL, up to 2048 characters |
fields | No | Up to 20 card fields |
buttons | No | Up to 5 card buttons |
Repeating an identical message with the same requestId returns the same delivery without sending a duplicate. Reusing an ID with different content or a different conversation returns 409. Preserve the ID after a network timeout; use a new ID for a new message.
Responses use { "code": 200, "resp": ... }. HTTP 200 from sending means the message was stored by the chat service. HTTP 202 means delivery is pending. This example illustrates a sent response; IDs and timestamps are placeholders:
{
"code": 200,
"resp": {
"id": "delivery UUID",
"requestId": "hello-001",
"chatId": "bot_BOT_UUID:USER_ID",
"status": "SENT",
"messageId": "message ID",
"seq": 12,
"error": null,
"createdAt": "2026-10-28T00:00:00Z"
}
}resp.status is PENDING, SENDING, SENT or FAILED. Only SENT has messageId and seq; this does not mean the user has read it. With HTTP 202, the response body's code is still 200. Check resp.status.
curl "$BOT_BASE_URL/api/openapi/v1/bot/messages/hello-001" \
-H "Authorization: Bearer $BOT_TOKEN"| メソッド | パス | 用途 |
|---|---|---|
| GET | /api/openapi/v1/bot/me | 現在のボットの基本情報を取得 |
| POST | /api/openapi/v1/bot/messages | メッセージを送信 |
| GET | /api/openapi/v1/bot/messages/{requestId} | リクエスト ID で配信状態を確認 |
すべての API で Bearer Token が必要です。送信と状態確認の合計は、ボットごとに毎秒 10 リクエストまでです。
| フィールド | 必須 | 説明 |
|---|---|---|
requestId | はい | 1~128 文字。ボット内で一意にし、再試行時は同じ値を使用 |
chatId | いいえ | 許可済みの会話。省略時は作成者の会話 |
type | はい | text、markdown、card。大文字と小文字は区別しない |
content | はい | 空白のみではない本文。最大 16000 文字 |
title | いいえ | カードのタイトル。最大 200 文字 |
image | いいえ | カード画像の HTTPS URL。最大 2048 文字 |
fields | いいえ | カードの情報項目。最大 20 個 |
buttons | いいえ | カードのボタン。最大 5 個 |
同じ requestId で同じ内容を再送すると、同じ配信記録が返され、メッセージは重複送信されません。同じ ID を異なる本文や会話に使うと 409 が返ります。ネットワークのタイムアウト後は元の ID を維持し、新しいメッセージには新しい ID を使ってください。
レスポンスは { "code": 200, "resp": ... } 形式です。送信時の HTTP 200 はチャットサービスへの保存完了、HTTP 202 は受け付け済みで配信待ちであることを示します。次は送信済みレスポンスの例です。ID と時刻は説明用です。
{
"code": 200,
"resp": {
"id": "delivery UUID",
"requestId": "hello-001",
"chatId": "bot_BOT_UUID:USER_ID",
"status": "SENT",
"messageId": "message ID",
"seq": 12,
"error": null,
"createdAt": "2026-10-28T00:00:00Z"
}
}resp.status は PENDING、SENDING、SENT、FAILED のいずれかです。messageId と seq が入るのは SENT のときだけで、既読を意味しません。HTTP 202 でも本文の code は 200 のままなので、resp.status を確認してください。
curl "$BOT_BASE_URL/api/openapi/v1/bot/messages/hello-001" \
-H "Authorization: Bearer $BOT_TOKEN"| 메서드 | 경로 | 용도 |
|---|---|---|
| GET | /api/openapi/v1/bot/me | 현재 봇의 기본 정보 조회 |
| POST | /api/openapi/v1/bot/messages | 메시지 전송 |
| GET | /api/openapi/v1/bot/messages/{requestId} | 요청 ID로 전달 상태 조회 |
모든 API에 Bearer Token이 필요합니다. 전송과 상태 조회를 합쳐 봇마다 초당 최대 10회까지 요청할 수 있습니다.
| 필드 | 필수 | 설명 |
|---|---|---|
requestId | 예 | 1–128자. 봇 안에서 고유해야 하며 재시도 시 같은 값 사용 |
chatId | 아니요 | 허용된 대화. 생략하면 생성자의 대화로 전송 |
type | 예 | text, markdown, card. 대소문자 구분 없음 |
content | 예 | 공백만으로 구성되지 않은 본문. 최대 16000자 |
title | 아니요 | 카드 제목. 최대 200자 |
image | 아니요 | 카드 이미지의 HTTPS URL. 최대 2048자 |
fields | 아니요 | 카드 정보 필드. 최대 20개 |
buttons | 아니요 | 카드 버튼. 최대 5개 |
같은 requestId로 같은 메시지를 반복 요청하면 동일한 전달 기록을 반환하며 중복 전송하지 않습니다. 같은 ID에 다른 내용이나 다른 대화를 지정하면 409를 반환합니다. 네트워크 시간 초과 후에는 원래 ID를 유지하고 새 메시지에는 새 ID를 사용하세요.
응답 형식은 { "code": 200, "resp": ... }입니다. 전송 API의 HTTP 200은 채팅 서비스에 저장되었음을, HTTP 202는 접수되어 전달을 기다리고 있음을 뜻합니다. 다음은 전송 완료 응답의 예이며 ID와 시간은 설명용입니다.
{
"code": 200,
"resp": {
"id": "delivery UUID",
"requestId": "hello-001",
"chatId": "bot_BOT_UUID:USER_ID",
"status": "SENT",
"messageId": "message ID",
"seq": 12,
"error": null,
"createdAt": "2026-10-28T00:00:00Z"
}
}resp.status는 PENDING, SENDING, SENT, FAILED 중 하나입니다. SENT일 때만 messageId와 seq가 있으며, 사용자가 읽었다는 뜻은 아닙니다. HTTP 202에서도 응답 본문의 code는 200이므로 resp.status를 확인하세요.
curl "$BOT_BASE_URL/api/openapi/v1/bot/messages/hello-001" \
-H "Authorization: Bearer $BOT_TOKEN"| Метод | Путь | Назначение |
|---|---|---|
| GET | /api/openapi/v1/bot/me | Получить основные сведения о текущем боте |
| POST | /api/openapi/v1/bot/messages | Отправить сообщение |
| GET | /api/openapi/v1/bot/messages/{requestId} | Проверить доставку по ID запроса |
Для всех методов нужен Bearer Token. Общий лимит отправки и проверки статуса — 10 запросов в секунду на бота.
| Поле | Обязательно | Описание |
|---|---|---|
requestId | Да | 1–128 символов, уникален внутри бота; сохраняйте при повторе |
chatId | Нет | Разрешённый диалог; по умолчанию — диалог создателя |
type | Да | text, markdown или card, без учёта регистра |
content | Да | Непустой текст, до 16000 символов |
title | Нет | Заголовок карточки, до 200 символов |
image | Нет | HTTPS-адрес изображения карточки, до 2048 символов |
fields | Нет | До 20 информационных полей карточки |
buttons | Нет | До 5 кнопок карточки |
Повтор идентичного сообщения с тем же requestId возвращает ту же запись доставки без повторной отправки. Использование ID с другим текстом или диалогом возвращает 409. После сетевого тайм-аута сохраняйте исходный ID; для нового сообщения используйте новый.
Ответы имеют вид { "code": 200, "resp": ... }. HTTP 200 при отправке означает сохранение сообщения в сервисе чатов, HTTP 202 — приём в ожидании доставки. Ниже показан пример успешной отправки; ID и время приведены для иллюстрации.
{
"code": 200,
"resp": {
"id": "delivery UUID",
"requestId": "hello-001",
"chatId": "bot_BOT_UUID:USER_ID",
"status": "SENT",
"messageId": "message ID",
"seq": 12,
"error": null,
"createdAt": "2026-10-28T00:00:00Z"
}
}resp.status принимает значения PENDING, SENDING, SENT или FAILED. Только при SENT появляются messageId и seq; это не означает прочтение пользователем. При HTTP 202 поле code в теле остаётся равным 200. Проверяйте resp.status.
curl "$BOT_BASE_URL/api/openapi/v1/bot/messages/hello-001" \
-H "Authorization: Bearer $BOT_TOKEN"| Méthode | Chemin | Fonction |
|---|---|---|
| GET | /api/openapi/v1/bot/me | Lire les informations du bot actuel |
| POST | /api/openapi/v1/bot/messages | Envoyer un message |
| GET | /api/openapi/v1/bot/messages/{requestId} | Consulter la livraison par ID de requête |
Tous les endpoints nécessitent un Bearer Token. Les envois et les consultations de statut partagent une limite de 10 requêtes par seconde et par bot.
| Champ | Obligatoire | Description |
|---|---|---|
requestId | Oui | 1 à 128 caractères, unique pour le bot ; conserver lors des nouvelles tentatives |
chatId | Non | Conversation autorisée ; celle du créateur par défaut |
type | Oui | text, markdown ou card, sans distinction de casse |
content | Oui | Corps non vide, jusqu’à 16000 caractères |
title | Non | Titre de carte, jusqu’à 200 caractères |
image | Non | URL HTTPS de l’image de carte, jusqu’à 2048 caractères |
fields | Non | Jusqu’à 20 champs d’information de carte |
buttons | Non | Jusqu’à 5 boutons de carte |
Répéter le même message avec le même requestId renvoie la même livraison, sans créer de doublon. Réutiliser un ID pour un contenu ou une conversation différents renvoie 409. Conservez l’ID après un délai réseau dépassé ; utilisez-en un nouveau pour un nouveau message.
Les réponses ont la forme { "code": 200, "resp": ... }. Pour l’envoi, HTTP 200 signifie que le message est enregistré dans le service de chat ; HTTP 202 indique qu’il est accepté et en attente de livraison. Voici un exemple de réponse après envoi ; les identifiants et l’heure sont illustratifs.
{
"code": 200,
"resp": {
"id": "delivery UUID",
"requestId": "hello-001",
"chatId": "bot_BOT_UUID:USER_ID",
"status": "SENT",
"messageId": "message ID",
"seq": 12,
"error": null,
"createdAt": "2026-10-28T00:00:00Z"
}
}resp.status vaut PENDING, SENDING, SENT ou FAILED. Seul SENT comporte messageId et seq ; cela ne signifie pas que l’utilisateur a lu le message. Avec HTTP 202, le champ code du corps reste égal à 200. Vérifiez resp.status.
curl "$BOT_BASE_URL/api/openapi/v1/bot/messages/hello-001" \
-H "Authorization: Bearer $BOT_TOKEN"| الطريقة | المسار | الغرض |
|---|---|---|
| GET | /api/openapi/v1/bot/me | قراءة معلومات الروبوت الحالي |
| POST | /api/openapi/v1/bot/messages | إرسال رسالة |
| GET | /api/openapi/v1/bot/messages/{requestId} | الاستعلام عن التسليم بمعرّف الطلب |
تتطلب جميع الواجهات Bearer Token. يشترك الإرسال والاستعلام عن الحالة في حد قدره 10 طلبات في الثانية لكل روبوت.
| الحقل | مطلوب | الوصف |
|---|---|---|
requestId | نعم | من 1 إلى 128 محرفًا، فريد داخل الروبوت؛ احتفظ به عند إعادة المحاولة |
chatId | لا | محادثة مصرح بها؛ محادثة المنشئ افتراضيًا |
type | نعم | text أو markdown أو card، دون تمييز حالة الأحرف |
content | نعم | محتوى غير فارغ، بحد أقصى 16000 محرف |
title | لا | عنوان البطاقة، بحد أقصى 200 محرف |
image | لا | عنوان صورة البطاقة عبر HTTPS، بحد أقصى 2048 محرفًا |
fields | لا | حتى 20 حقل معلومات في البطاقة |
buttons | لا | حتى 5 أزرار في البطاقة |
تكرار الرسالة نفسها باستخدام requestId نفسه يعيد سجل التسليم نفسه دون إرسال نسخة مكررة. استخدام المعرّف نفسه مع محتوى أو محادثة مختلفين يعيد 409. احتفظ بالمعرّف الأصلي بعد انتهاء مهلة الشبكة، واستخدم معرّفًا جديدًا لكل رسالة جديدة.
تأتي الاستجابات بالشكل { "code": 200, "resp": ... }. تعني HTTP 200 عند الإرسال أن خدمة المحادثة حفظت الرسالة، بينما تعني HTTP 202 أن الطلب قُبل وينتظر التسليم. المثال التالي يوضح استجابة بعد الإرسال؛ المعرّفات والتوقيت قيم توضيحية.
{
"code": 200,
"resp": {
"id": "delivery UUID",
"requestId": "hello-001",
"chatId": "bot_BOT_UUID:USER_ID",
"status": "SENT",
"messageId": "message ID",
"seq": 12,
"error": null,
"createdAt": "2026-10-28T00:00:00Z"
}
}تكون resp.status إحدى القيم PENDING أو SENDING أو SENT أو FAILED. لا تظهر messageId وseq إلا مع SENT، وهذا لا يعني أن المستخدم قرأ الرسالة. عند HTTP 202 تظل قيمة code داخل المحتوى 200، لذلك افحص resp.status.
curl "$BOT_BASE_URL/api/openapi/v1/bot/messages/hello-001" \
-H "Authorization: Bearer $BOT_TOKEN"text 展示纯文字。markdown 支持标题、列表、粗体、代码和 HTTPS 链接;原始 HTML 只展示文字。图片、字段和按钮仅适用于 card 消息。
{
"requestId": "release-42",
"type": "card",
"title": "发布完成",
"content": "**v1.2.0** 已发布。\n查看结果后确认。",
"image": "https://your-host/release.png",
"fields": [{ "label": "环境", "value": "生产" }],
"buttons": [
{ "text": "查看详情", "url": "https://your-host/releases/42" },
{ "text": "确认", "action": "release.confirm" }
]
}字段标题 label 最多 40 字符,value 最多 500 字符。按钮 text 最多 40 字符,每个按钮必须只包含 url 或 action 中的一个。链接仅支持 HTTPS,最多 2048 字符。action 使用 1–64 位字母、数字、下划线、点、冒号或连字符,同一张卡片内不能重复。
链接按钮打开外部地址;交互按钮向你的服务发送 card.action 事件。卡片按统一组件渲染,不允许任意 HTML 或脚本。转发机器人消息时会转成普通文字摘要,不会复制原卡片的操作权限。
Use text for plain text. markdown supports headings, lists, bold, code and HTTPS links; raw HTML is displayed as text. Images, fields and buttons are available only for card messages.
{
"requestId": "release-42",
"type": "card",
"title": "Deployment complete",
"content": "**v1.2.0** is live.\nReview and confirm.",
"image": "https://your-host/release.png",
"fields": [{ "label": "Environment", "value": "Production" }],
"buttons": [
{ "text": "View details", "url": "https://your-host/releases/42" },
{ "text": "Confirm", "action": "release.confirm" }
]
}Field label is limited to 40 characters and value to 500. Button text is limited to 40. Each button must specify exactly one of url or action. URLs must use HTTPS and be at most 2048 characters. An action is 1–64 letters, digits, underscores, dots, colons or hyphens and must be unique within a card.
Link buttons open a URL. Action buttons produce a card.action event. Cards use the shared app renderer and cannot contain arbitrary HTML or scripts. Forwarded bot messages become plain text summaries without the original card's action permissions.
text はプレーンテキストです。markdown は見出し、リスト、太字、コード、HTTPS リンクに対応し、HTML は文字として表示されます。画像、情報項目、ボタンは card のみで利用できます。
{
"requestId": "release-42",
"type": "card",
"title": "Deployment complete",
"content": "**v1.2.0** is live.\nReview and confirm.",
"image": "https://your-host/release.png",
"fields": [{ "label": "Environment", "value": "Production" }],
"buttons": [
{ "text": "View details", "url": "https://your-host/releases/42" },
{ "text": "Confirm", "action": "release.confirm" }
]
}項目名 label は最大 40 文字、value は最大 500 文字です。ボタンの text は最大 40 文字です。各ボタンには url または action のどちらか一方だけを指定します。URL は HTTPS で最大 2048 文字です。action は英数字、アンダースコア、ピリオド、コロン、ハイフンを使った 1~64 文字で、同じカード内で重複させないでください。
リンクボタンは外部 URL を開き、操作ボタンは card.action イベントを生成します。カードは共通の表示コンポーネントで描画され、任意の HTML やスクリプトは使用できません。ボットのメッセージを転送するとプレーンテキストの要約になり、元のカードの操作権限は引き継がれません。
text는 일반 텍스트입니다. markdown은 제목, 목록, 굵게, 코드, HTTPS 링크를 지원하며 HTML은 텍스트로 표시합니다. 이미지, 필드, 버튼은 card 메시지에서만 사용할 수 있습니다.
{
"requestId": "release-42",
"type": "card",
"title": "Deployment complete",
"content": "**v1.2.0** is live.\nReview and confirm.",
"image": "https://your-host/release.png",
"fields": [{ "label": "Environment", "value": "Production" }],
"buttons": [
{ "text": "View details", "url": "https://your-host/releases/42" },
{ "text": "Confirm", "action": "release.confirm" }
]
}필드의 label은 최대 40자, value는 최대 500자입니다. 버튼의 text는 최대 40자입니다. 각 버튼에는 url 또는 action 중 하나만 지정해야 합니다. URL은 HTTPS여야 하며 최대 2048자입니다. action은 영문자, 숫자, 밑줄, 마침표, 콜론, 하이픈으로 구성된 1–64자이며 같은 카드 안에서 중복될 수 없습니다.
링크 버튼은 외부 URL을 엽니다. 동작 버튼은 card.action 이벤트를 생성합니다. 카드는 공통 렌더러로 표시되며 임의의 HTML이나 스크립트를 포함할 수 없습니다. 봇 메시지를 전달하면 일반 텍스트 요약으로 바뀌고 원래 카드의 동작 권한은 복사되지 않습니다.
text отображает обычный текст. markdown поддерживает заголовки, списки, полужирный текст, код и HTTPS-ссылки; исходный HTML показывается как текст. Изображения, поля и кнопки доступны только для сообщений card.
{
"requestId": "release-42",
"type": "card",
"title": "Deployment complete",
"content": "**v1.2.0** is live.\nReview and confirm.",
"image": "https://your-host/release.png",
"fields": [{ "label": "Environment", "value": "Production" }],
"buttons": [
{ "text": "View details", "url": "https://your-host/releases/42" },
{ "text": "Confirm", "action": "release.confirm" }
]
}Название поля label ограничено 40 символами, value — 500. Текст кнопки text — до 40 символов. Каждая кнопка должна содержать ровно одно из полей url или action. URL обязан использовать HTTPS и быть не длиннее 2048 символов. action состоит из 1–64 латинских букв, цифр, подчёркиваний, точек, двоеточий или дефисов и не повторяется внутри одной карточки.
Кнопка со ссылкой открывает URL, кнопка действия создаёт событие card.action. Карточки отображаются общим компонентом приложения и не допускают произвольный HTML или скрипты. При пересылке сообщение бота превращается в текстовое резюме без прав на действия исходной карточки.
text affiche du texte brut. markdown prend en charge les titres, listes, caractères gras, blocs de code et liens HTTPS ; le HTML brut est affiché comme du texte. Les images, champs et boutons sont réservés aux messages card.
{
"requestId": "release-42",
"type": "card",
"title": "Deployment complete",
"content": "**v1.2.0** is live.\nReview and confirm.",
"image": "https://your-host/release.png",
"fields": [{ "label": "Environment", "value": "Production" }],
"buttons": [
{ "text": "View details", "url": "https://your-host/releases/42" },
{ "text": "Confirm", "action": "release.confirm" }
]
}Le champ label est limité à 40 caractères et value à 500. Le texte du bouton text est limité à 40 caractères. Chaque bouton doit définir exactement un seul champ parmi url et action. Les URL utilisent HTTPS et comportent au maximum 2048 caractères. Une action contient de 1 à 64 lettres latines, chiffres, tirets bas, points, deux-points ou tirets et doit être unique dans la carte.
Un bouton de lien ouvre une URL ; un bouton d’action crée un événement card.action. Les cartes utilisent le composant de rendu commun de l’application et n’acceptent ni HTML arbitraire ni script. Un message de bot transféré devient un résumé en texte brut sans les autorisations d’action de la carte d’origine.
استخدم text للنص العادي. يدعم markdown العناوين والقوائم والخط العريض والشفرة وروابط HTTPS، ويعرض HTML الخام كنص. لا تتاح الصور والحقول والأزرار إلا في رسائل card.
{
"requestId": "release-42",
"type": "card",
"title": "Deployment complete",
"content": "**v1.2.0** is live.\nReview and confirm.",
"image": "https://your-host/release.png",
"fields": [{ "label": "Environment", "value": "Production" }],
"buttons": [
{ "text": "View details", "url": "https://your-host/releases/42" },
{ "text": "Confirm", "action": "release.confirm" }
]
}الحد الأقصى لاسم الحقل label هو 40 محرفًا، ولـvalue هو 500. نص الزر text لا يتجاوز 40 محرفًا. يجب أن يحدد كل زر واحدًا فقط من url أو action. يجب أن يستخدم الرابط HTTPS وألا يتجاوز 2048 محرفًا. تتكون action من 1 إلى 64 حرفًا لاتينيًا أو رقمًا أو شرطة سفلية أو نقطة أو نقطتين رأسيتين أو شرطة، ولا يجوز تكرارها داخل البطاقة نفسها.
يفتح زر الرابط عنوان URL، بينما ينشئ زر الإجراء حدث card.action. تُعرض البطاقات بمكوّن التطبيق المشترك ولا تسمح بإدراج HTML أو سكربتات عشوائية. عند إعادة توجيه رسالة الروبوت تتحول إلى ملخص نصي عادي دون نسخ أذونات إجراءات البطاقة الأصلية.
适合不想部署公网回调地址的服务。创建机器人时保留默认 WebSocket 模式,你的后端连接下面的地址,在握手请求头中携带同一个 Bearer Token:
wss://api.surprising.top:8443/api/openapi/v1/bot/events/ws
Authorization: Bearer YOUR_BOT_TOKEN连接工具必须支持自定义请求头。浏览器原生 WebSocket 不适合保管机器人 Token。连接成功后收到:
{"op":"ready","botId":"机器人 UUID","ackTimeoutSeconds":30}事件帧示例:
{
"op": "event",
"event": {
"eventId": "事件 UUID",
"type": "message.received",
"chatId": "bot_机器人UUID:用户ID",
"userId": "123",
"data": {
"messageId": "消息ID",
"seq": 12,
"message": { "type": "text", "content": { "text": "你好" } }
},
"createdAt": "2026-10-28T00:00:00Z"
}
}按钮事件的 type 为 card.action,data 为 { "messageId": "…", "action": "release.confirm" }。所有用户 ID 按字符串处理。引用回复的 message.type 为 quote_text,message.content 为聊天协议定义的引用对象。
完成业务处理或可靠入队后发送确认;未确认的事件会再次投递,使用 eventId 做持久化去重。可每 25 秒发送心跳,服务返回 {"op":"pong"}。
{"op":"ack","eventId":"收到的事件 ID"}
{"op":"ping"}30 秒未确认或连接中断会重新投递。每个机器人只保留一个开发者连接,后建立的连接接管;重连时重新携带 Token,无需自行维护游标。下载 Node.js 示例可用于连接、重连、心跳和自动回复。
Use WebSocket when you do not want to host a public callback endpoint. Keep the default WebSocket mode and connect from your backend, passing the same Bearer Token in the handshake headers:
wss://api.surprising.top:8443/api/openapi/v1/bot/events/ws
Authorization: Bearer YOUR_BOT_TOKENUse a client that supports custom headers. Browser WebSocket clients are not suitable for storing bot Tokens. A successful connection receives:
{"op":"ready","botId":"bot UUID","ackTimeoutSeconds":30}Example event frame:
{
"op": "event",
"event": {
"eventId": "event UUID",
"type": "message.received",
"chatId": "bot_BOT_UUID:USER_ID",
"userId": "123",
"data": {
"messageId": "message ID",
"seq": 12,
"message": { "type": "text", "content": { "text": "Hello" } }
},
"createdAt": "2026-10-28T00:00:00Z"
}
}Button events have type card.action and data of { "messageId": "…", "action": "release.confirm" }. Treat user IDs as strings. Quoted replies have message.type = "quote_text"; their content uses the chat protocol's quote object.
Acknowledge after processing or reliably enqueuing the event. Deduplicate persistently by eventId, as unacknowledged events can be delivered again. You may ping every 25 seconds; the server responds with {"op":"pong"}.
{"op":"ack","eventId":"received event ID"}
{"op":"ping"}Events are retried after 30 seconds without acknowledgement or after disconnection. Each bot has one developer connection; a new connection replaces the previous one. Reconnect with the Token; you do not need to manage a cursor. Download the Node.js example for connection, reconnection, heartbeat and automatic replies.
公開コールバックサーバーを用意したくない場合に適しています。既定の WebSocket モードのまま、バックエンドから次のアドレスへ接続し、ハンドシェイクのヘッダーに同じ Bearer Token を渡します。
wss://api.surprising.top:8443/api/openapi/v1/bot/events/ws
Authorization: Bearer YOUR_BOT_TOKENカスタムヘッダーに対応するクライアントを使用してください。ブラウザーの WebSocket はボットの Token の保管には適していません。接続に成功すると次のフレームが届きます。
{"op":"ready","botId":"bot UUID","ackTimeoutSeconds":30}イベントフレームの例:
{
"op": "event",
"event": {
"eventId": "event UUID",
"type": "message.received",
"chatId": "bot_BOT_UUID:USER_ID",
"userId": "123",
"data": {
"messageId": "message ID",
"seq": 12,
"message": { "type": "text", "content": { "text": "Hello" } }
},
"createdAt": "2026-10-28T00:00:00Z"
}
}ボタンイベントの type は card.action、data は { "messageId": "…", "action": "release.confirm" } です。ユーザー ID はすべて文字列として扱ってください。引用返信の message.type は quote_text で、内容はチャットプロトコルの引用オブジェクトです。
業務処理の完了後、または確実にキューへ保存した後に確認を返します。未確認のイベントは再配信されるため、eventId を永続化して重複処理を防いでください。25 秒ごとに ping を送ることができ、サーバーは {"op":"pong"} を返します。
{"op":"ack","eventId":"received event ID"}
{"op":"ping"}30 秒以内に確認されなかったイベントや切断時の未確認イベントは再配信されます。ボットごとに開発者接続は 1 本のみで、後から接続したものが引き継ぎます。再接続時は Token を再送するだけで、カーソルを管理する必要はありません。Node.js サンプルをダウンロードして、接続、再接続、ハートビート、自動返信を試せます。
공개 콜백 서버를 운영하고 싶지 않을 때 적합합니다. 기본 WebSocket 모드를 유지하고 백엔드에서 다음 주소에 연결하세요. 핸드셰이크 요청 헤더에 같은 Bearer Token을 전달합니다.
wss://api.surprising.top:8443/api/openapi/v1/bot/events/ws
Authorization: Bearer YOUR_BOT_TOKEN사용자 정의 헤더를 지원하는 클라이언트를 사용하세요. 브라우저 WebSocket은 봇 Token을 보관하기에 적합하지 않습니다. 연결에 성공하면 다음 프레임을 받습니다.
{"op":"ready","botId":"bot UUID","ackTimeoutSeconds":30}이벤트 프레임 예제:
{
"op": "event",
"event": {
"eventId": "event UUID",
"type": "message.received",
"chatId": "bot_BOT_UUID:USER_ID",
"userId": "123",
"data": {
"messageId": "message ID",
"seq": 12,
"message": { "type": "text", "content": { "text": "Hello" } }
},
"createdAt": "2026-10-28T00:00:00Z"
}
}버튼 이벤트의 type은 card.action이며 data는 { "messageId": "…", "action": "release.confirm" }입니다. 모든 사용자 ID는 문자열로 처리하세요. 인용 답장의 message.type은 quote_text이며 내용은 채팅 프로토콜의 인용 객체입니다.
업무 처리를 완료하거나 신뢰할 수 있는 큐에 저장한 뒤 확인 응답을 보내세요. 확인되지 않은 이벤트는 다시 전달될 수 있으므로 eventId를 영구 저장해 중복 처리를 방지해야 합니다. 25초마다 ping을 보낼 수 있으며 서버는 {"op":"pong"}을 반환합니다.
{"op":"ack","eventId":"received event ID"}
{"op":"ping"}30초 안에 확인하지 않았거나 연결이 끊기면 미확인 이벤트를 다시 전달합니다. 봇마다 개발자 연결은 하나만 유지하며 새 연결이 기존 연결을 대체합니다. 재연결할 때 Token을 다시 보내면 되며 커서를 직접 관리할 필요는 없습니다. Node.js 예제 다운로드로 연결, 재연결, 하트비트, 자동 답장을 확인할 수 있습니다.
Этот вариант подходит, если вы не хотите размещать публичный сервер обратных вызовов. Оставьте режим WebSocket и подключитесь из своего сервиса, передав тот же Bearer Token в заголовках рукопожатия.
wss://api.surprising.top:8443/api/openapi/v1/bot/events/ws
Authorization: Bearer YOUR_BOT_TOKENИспользуйте клиент с поддержкой пользовательских заголовков. Браузерный WebSocket не подходит для хранения Token бота. После подключения приходит кадр:
{"op":"ready","botId":"bot UUID","ackTimeoutSeconds":30}Пример кадра события:
{
"op": "event",
"event": {
"eventId": "event UUID",
"type": "message.received",
"chatId": "bot_BOT_UUID:USER_ID",
"userId": "123",
"data": {
"messageId": "message ID",
"seq": 12,
"message": { "type": "text", "content": { "text": "Hello" } }
},
"createdAt": "2026-10-28T00:00:00Z"
}
}Событие кнопки имеет type = card.action и data вида { "messageId": "…", "action": "release.confirm" }. Обрабатывайте все ID пользователей как строки. У цитируемого ответа message.type равен quote_text, а содержимое соответствует объекту цитаты протокола чатов.
Подтверждайте событие после обработки или надёжного помещения в очередь. Неподтверждённые события могут приходить повторно: сохраняйте eventId и исключайте дубликаты. Можно отправлять ping каждые 25 секунд; сервер отвечает {"op":"pong"}.
{"op":"ack","eventId":"received event ID"}
{"op":"ping"}Если подтверждение не пришло за 30 секунд или соединение разорвалось, неподтверждённые события доставляются повторно. У бота может быть одно соединение разработчика; новое заменяет предыдущее. При повторном подключении передайте Token, собственный курсор не нужен. Скачайте пример Node.js для подключения, переподключения, проверки связи и автоматических ответов.
Choisissez ce mode si vous ne souhaitez pas héberger de point de rappel public. Conservez le mode WebSocket et connectez-vous depuis votre serveur en transmettant le même Bearer Token dans les en-têtes de négociation.
wss://api.surprising.top:8443/api/openapi/v1/bot/events/ws
Authorization: Bearer YOUR_BOT_TOKENUtilisez un client prenant en charge les en-têtes personnalisés. Le WebSocket du navigateur n’est pas adapté au stockage des Tokens de bot. Une connexion réussie reçoit la trame suivante :
{"op":"ready","botId":"bot UUID","ackTimeoutSeconds":30}Exemple de trame d’événement :
{
"op": "event",
"event": {
"eventId": "event UUID",
"type": "message.received",
"chatId": "bot_BOT_UUID:USER_ID",
"userId": "123",
"data": {
"messageId": "message ID",
"seq": 12,
"message": { "type": "text", "content": { "text": "Hello" } }
},
"createdAt": "2026-10-28T00:00:00Z"
}
}Un événement de bouton a pour type la valeur card.action et pour data l’objet { "messageId": "…", "action": "release.confirm" }. Traitez tous les ID utilisateur comme des chaînes. Une réponse citée a message.type = "quote_text" et utilise l’objet de citation du protocole de chat.
Accusez réception après le traitement ou la mise en file fiable de l’événement. Les événements non confirmés peuvent être renvoyés : dédupliquez-les de manière persistante par eventId. Vous pouvez envoyer un ping toutes les 25 secondes ; le serveur répond par {"op":"pong"}.
{"op":"ack","eventId":"received event ID"}
{"op":"ping"}Sans confirmation pendant 30 secondes ou en cas de déconnexion, les événements non confirmés sont renvoyés. Un bot dispose d’une seule connexion développeur ; une nouvelle connexion remplace la précédente. Reconnectez-vous avec le Token, sans gérer de curseur. Téléchargez l’exemple Node.js pour la connexion, la reconnexion, le maintien de connexion et les réponses automatiques.
يناسب هذا الوضع من لا يريد استضافة خادم رد نداء عام. أبقِ على وضع WebSocket الافتراضي واتصل من خادمك بالعنوان التالي، مع تمرير Bearer Token نفسه في ترويسات المصافحة.
wss://api.surprising.top:8443/api/openapi/v1/bot/events/ws
Authorization: Bearer YOUR_BOT_TOKENاستخدم عميلًا يدعم الترويسات المخصصة. WebSocket الخاص بالمتصفح غير مناسب لحفظ Token الروبوت. عند نجاح الاتصال تتلقى الإطار التالي:
{"op":"ready","botId":"bot UUID","ackTimeoutSeconds":30}مثال على إطار حدث:
{
"op": "event",
"event": {
"eventId": "event UUID",
"type": "message.received",
"chatId": "bot_BOT_UUID:USER_ID",
"userId": "123",
"data": {
"messageId": "message ID",
"seq": 12,
"message": { "type": "text", "content": { "text": "Hello" } }
},
"createdAt": "2026-10-28T00:00:00Z"
}
}يكون type لحدث الزر هو card.action، ويكون data بالشكل { "messageId": "…", "action": "release.confirm" }. تعامل مع كل معرّفات المستخدمين كسلاسل نصية. تكون message.type للرد المقتبس هي quote_text، ويستخدم المحتوى كائن الاقتباس المحدد في بروتوكول المحادثة.
أرسل تأكيد الاستلام بعد معالجة الحدث أو إدخاله في قائمة انتظار موثوقة. قد تصل الأحداث غير المؤكدة مجددًا؛ احفظ eventId بشكل دائم لمنع المعالجة المكررة. يمكنك إرسال ping كل 25 ثانية، ويرد الخادم بـ{"op":"pong"}.
{"op":"ack","eventId":"received event ID"}
{"op":"ping"}تُعاد الأحداث غير المؤكدة بعد 30 ثانية دون تأكيد أو عند انقطاع الاتصال. يحتفظ كل روبوت باتصال مطور واحد؛ يحل الاتصال الأحدث محل السابق. أعد الاتصال باستخدام Token دون إدارة مؤشر متابعة بنفسك. نزّل مثال Node.js لتجربة الاتصال وإعادته وفحص استمراريته والردود التلقائية.
适合已有公网 HTTPS 服务的开发者。在机器人编辑页面选择 Webhook,填写公网 HTTPS 回调地址。一个机器人同时选择一种事件接收方式;只发送通知时不需要配置回调。
平台 POST 上面的 event 对象,不包含 WebSocket 的 op/event 外层。请求头包含:
X-Surprising-Timestamp: Unix 秒
X-Surprising-Signature: sha256=十六进制 HMAC
Content-Type: application/json在机器人详情中查看「回调签名密钥」,它与 API Token 不同。签名计算为 HMAC-SHA256(webhookSecret, timestamp + "." + 原始请求正文)。先检查时间差不超过 5 分钟,再对原始字节验签,使用恒定时间比较;通过后才解析 JSON。不要把解析后重新序列化的 JSON 用于验签。
import { createHmac, timingSafeEqual } from 'node:crypto';
// rawBody 必须是原始请求正文 Buffer;secret 仅保存在服务端。
function verifyWebhook(rawBody, timestamp, signature, secret) {
if (typeof timestamp !== 'string' || !/^\d+$/.test(timestamp)) return false;
if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return false;
if (typeof signature !== 'string' || !/^sha256=[0-9a-f]{64}$/.test(signature)) return false;
const expected = createHmac('sha256', secret)
.update(timestamp + '.').update(rawBody).digest();
return timingSafeEqual(expected, Buffer.from(signature.slice(7), 'hex'));
}验签不能代替去重,业务仍需使用 eventId 的持久化唯一约束。完成处理或可靠入队后返回 2xx;失败或超时会重试。同一事件保持相同 eventId 和正文,每次重新签名。自动重试最多 12 次,失败后可在「事件记录」手动重试。
回调地址必须可通过公网访问并具有有效 TLS 证书。平台拒绝内网、回环及特殊用途地址,不跟随重定向。不要填写 localhost、自签名地址或需要跳转的 URL。
Choose Webhook if you already host a public HTTPS service. Edit your bot, select Webhook and enter its public HTTPS callback URL. A bot uses one event transport at a time. Sending notifications alone does not require a callback.
The platform POSTs the event object without the outer WebSocket op/event wrapper. Headers include:
X-Surprising-Timestamp: Unix seconds
X-Surprising-Signature: sha256=hexadecimal HMAC
Content-Type: application/jsonFind the callback signing secret in bot details. It differs from the API Token. Compute HMAC-SHA256(webhookSecret, timestamp + "." + raw request body). Reject timestamps more than 5 minutes away. Verify the raw bytes with a constant-time comparison before parsing JSON. Do not reserialize parsed JSON for verification.
import { createHmac, timingSafeEqual } from 'node:crypto';
// rawBody is the original request body Buffer. Keep secret on your server.
function verifyWebhook(rawBody, timestamp, signature, secret) {
if (typeof timestamp !== 'string' || !/^\d+$/.test(timestamp)) return false;
if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return false;
if (typeof signature !== 'string' || !/^sha256=[0-9a-f]{64}$/.test(signature)) return false;
const expected = createHmac('sha256', secret)
.update(timestamp + '.').update(rawBody).digest();
return timingSafeEqual(expected, Buffer.from(signature.slice(7), 'hex'));
}Verification does not replace deduplication: use a persistent unique constraint on eventId. Return 2xx after processing or reliable enqueueing. Failures and timeouts trigger retries. The same event keeps its ID and body, but each attempt gets a new signature. Up to 12 automatic attempts are made; failed events can be retried manually in “Event history”.
Callbacks must be publicly reachable and have a valid TLS certificate. Private, loopback and special-purpose addresses are rejected, and redirects are not followed. Do not enter localhost, self-signed endpoints or URLs requiring a redirect.
公開 HTTPS サービスがある場合に適しています。ボット編集で Webhook を選び、公開 HTTPS コールバック URL を入力してください。1 つのボットで同時に使えるイベント受信方式は 1 つです。通知だけならコールバックは不要です。
プラットフォームは event オブジェクトを POST します。WebSocket の外側の op/event は含みません。ヘッダーは次のとおりです。
X-Surprising-Timestamp: Unix seconds
X-Surprising-Signature: sha256=hexadecimal HMAC
Content-Type: application/jsonボット詳細でコールバック署名用のシークレットを確認します。API Token とは異なります。HMAC-SHA256(webhookSecret, timestamp + "." + 生のリクエスト本文) を計算します。時刻差が 5 分以内であることを確認し、JSON を解析する前に元のバイト列を定時間比較で検証してください。解析後に JSON を再シリアライズして署名を計算しないでください。
import { createHmac, timingSafeEqual } from 'node:crypto';
// rawBody is the original request body Buffer. Keep secret on your server.
function verifyWebhook(rawBody, timestamp, signature, secret) {
if (typeof timestamp !== 'string' || !/^\d+$/.test(timestamp)) return false;
if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return false;
if (typeof signature !== 'string' || !/^sha256=[0-9a-f]{64}$/.test(signature)) return false;
const expected = createHmac('sha256', secret)
.update(timestamp + '.').update(rawBody).digest();
return timingSafeEqual(expected, Buffer.from(signature.slice(7), 'hex'));
}署名検証と重複排除は別々に必要です。eventId に永続的な一意制約を設けてください。処理または確実なキュー保存が完了したら 2xx を返します。失敗やタイムアウトでは再試行されます。同じイベントは ID と本文が維持され、署名だけが毎回更新されます。自動試行は最大 12 回で、失敗後は「イベント履歴」から手動で再試行できます。
コールバックは公開ネットワークから到達でき、有効な TLS 証明書が必要です。プライベート、ループバック、特別用途のアドレスは拒否され、リダイレクトは追跡しません。localhost、自己署名証明書、リダイレクトが必要な URL は指定しないでください。
이미 공개 HTTPS 서비스를 운영하고 있을 때 적합합니다. 봇 편집 화면에서 Webhook을 선택하고 공개 HTTPS 콜백 URL을 입력하세요. 봇 하나는 한 번에 하나의 이벤트 수신 방식만 사용합니다. 알림만 보낼 때는 콜백이 필요 없습니다.
플랫폼은 event 객체를 POST하며 WebSocket의 바깥쪽 op/event는 포함하지 않습니다. 요청 헤더는 다음과 같습니다.
X-Surprising-Timestamp: Unix seconds
X-Surprising-Signature: sha256=hexadecimal HMAC
Content-Type: application/json봇 상세 화면에서 콜백 서명 비밀 키를 확인하세요. API Token과는 다른 값입니다. 서명은 HMAC-SHA256(webhookSecret, timestamp + "." + 원본 요청 본문)으로 계산합니다. 시간 차이가 5분 이내인지 먼저 확인한 뒤 JSON을 파싱하기 전에 원본 바이트를 상수 시간 비교로 검증하세요. 파싱한 JSON을 다시 직렬화해 서명을 계산하면 안 됩니다.
import { createHmac, timingSafeEqual } from 'node:crypto';
// rawBody is the original request body Buffer. Keep secret on your server.
function verifyWebhook(rawBody, timestamp, signature, secret) {
if (typeof timestamp !== 'string' || !/^\d+$/.test(timestamp)) return false;
if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return false;
if (typeof signature !== 'string' || !/^sha256=[0-9a-f]{64}$/.test(signature)) return false;
const expected = createHmac('sha256', secret)
.update(timestamp + '.').update(rawBody).digest();
return timingSafeEqual(expected, Buffer.from(signature.slice(7), 'hex'));
}서명 검증과 중복 방지는 별도로 필요합니다. eventId에 영구적인 고유 제약 조건을 적용하세요. 처리를 완료하거나 신뢰할 수 있는 큐에 저장한 뒤 2xx를 반환합니다. 실패와 시간 초과는 재시도를 유발합니다. 같은 이벤트는 ID와 본문을 유지하며 시도마다 서명만 새로 생성합니다. 자동 시도는 최대 12회이며 실패한 이벤트는 ‘이벤트 기록’에서 직접 재시도할 수 있습니다.
콜백은 공개 인터넷에서 접근할 수 있어야 하며 유효한 TLS 인증서가 필요합니다. 사설, 루프백, 특수 용도 주소는 거부하고 리디렉션은 따라가지 않습니다. localhost, 자체 서명 인증서 주소, 리디렉션이 필요한 URL을 입력하지 마세요.
Подходит, если у вас уже есть публичный HTTPS-сервис. Выберите Webhook при редактировании бота и укажите публичный HTTPS-адрес обратного вызова. Бот использует один способ получения событий одновременно. Для простой отправки уведомлений обратный вызов не требуется.
Платформа отправляет POST с объектом event, без внешней оболочки WebSocket op/event. Заголовки:
X-Surprising-Timestamp: Unix seconds
X-Surprising-Signature: sha256=hexadecimal HMAC
Content-Type: application/jsonСекрет подписи обратных вызовов находится в карточке бота и отличается от API Token. Подпись вычисляется как HMAC-SHA256(webhookSecret, timestamp + "." + исходное тело запроса). Сначала проверьте отклонение времени не более 5 минут, затем сверяйте исходные байты сравнением за постоянное время, до разбора JSON. Не вычисляйте подпись по повторно сериализованному JSON.
import { createHmac, timingSafeEqual } from 'node:crypto';
// rawBody is the original request body Buffer. Keep secret on your server.
function verifyWebhook(rawBody, timestamp, signature, secret) {
if (typeof timestamp !== 'string' || !/^\d+$/.test(timestamp)) return false;
if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return false;
if (typeof signature !== 'string' || !/^sha256=[0-9a-f]{64}$/.test(signature)) return false;
const expected = createHmac('sha256', secret)
.update(timestamp + '.').update(rawBody).digest();
return timingSafeEqual(expected, Buffer.from(signature.slice(7), 'hex'));
}Проверка подписи не заменяет исключение дубликатов: используйте постоянное ограничение уникальности для eventId. Возвращайте 2xx после обработки или надёжной записи в очередь. Ошибки и тайм-ауты вызывают повторы. ID и тело события остаются прежними, подпись обновляется при каждой попытке. Всего выполняется до 12 автоматических попыток; затем событие можно повторить вручную в истории событий.
Адрес должен быть доступен из интернета и иметь действующий TLS-сертификат. Частные, петлевые и специальные адреса отклоняются, перенаправления не выполняются. Не указывайте localhost, адрес с самоподписанным сертификатом или URL с перенаправлением.
Ce mode convient si vous disposez déjà d’un service HTTPS public. Modifiez le bot, choisissez Webhook et indiquez son URL de rappel HTTPS publique. Un bot utilise un seul mode de réception à la fois. L’envoi de notifications seul ne nécessite aucun rappel.
La plateforme envoie l’objet event par POST, sans l’enveloppe externe WebSocket op/event. Les en-têtes comprennent :
X-Surprising-Timestamp: Unix seconds
X-Surprising-Signature: sha256=hexadecimal HMAC
Content-Type: application/jsonLe secret de signature du rappel se trouve dans la fiche du bot. Il est différent du Token d’API. Calculez HMAC-SHA256(webhookSecret, timestamp + "." + corps brut de la requête). Vérifiez d’abord un écart d’horodatage inférieur ou égal à 5 minutes, puis les octets d’origine par une comparaison en temps constant, avant de décoder le JSON. Ne signez pas du JSON décodé puis sérialisé à nouveau.
import { createHmac, timingSafeEqual } from 'node:crypto';
// rawBody is the original request body Buffer. Keep secret on your server.
function verifyWebhook(rawBody, timestamp, signature, secret) {
if (typeof timestamp !== 'string' || !/^\d+$/.test(timestamp)) return false;
if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return false;
if (typeof signature !== 'string' || !/^sha256=[0-9a-f]{64}$/.test(signature)) return false;
const expected = createHmac('sha256', secret)
.update(timestamp + '.').update(rawBody).digest();
return timingSafeEqual(expected, Buffer.from(signature.slice(7), 'hex'));
}La vérification de signature ne remplace pas la déduplication : imposez une contrainte d’unicité persistante sur eventId. Répondez 2xx après le traitement ou la mise en file fiable. Les échecs et délais dépassés déclenchent des reprises. L’ID et le corps restent identiques, mais chaque tentative reçoit une nouvelle signature. Jusqu’à 12 tentatives automatiques sont effectuées ; un événement en échec peut ensuite être relancé dans l’historique des événements.
Le point de rappel doit être accessible depuis internet et présenter un certificat TLS valide. Les adresses privées, de bouclage et à usage spécial sont refusées ; les redirections ne sont pas suivies. Ne saisissez pas localhost, une adresse avec certificat autosigné ou une URL nécessitant une redirection.
يناسب هذا الوضع من لديه خدمة HTTPS عامة. اختر Webhook عند تعديل الروبوت وأدخل عنوان رد النداء العام عبر HTTPS. يستخدم الروبوت طريقة واحدة لاستقبال الأحداث في الوقت نفسه. لا تحتاج إلى رد نداء لإرسال الإشعارات فقط.
ترسل المنصة كائن event بطلب POST دون الغلاف الخارجي op/event الخاص بـWebSocket. تتضمن الترويسات ما يلي:
X-Surprising-Timestamp: Unix seconds
X-Surprising-Signature: sha256=hexadecimal HMAC
Content-Type: application/jsonستجد سر توقيع رد النداء في تفاصيل الروبوت، وهو يختلف عن Token الخاص بالواجهة. احسب التوقيع باستخدام HMAC-SHA256(webhookSecret, timestamp + "." + المحتوى الخام للطلب). تحقّق أولًا من أن فرق التوقيت لا يتجاوز 5 دقائق، ثم افحص البايتات الأصلية بمقارنة ذات زمن ثابت قبل تحليل JSON. لا تعِد تسلسل JSON بعد تحليله لاستخدامه في التحقق من التوقيع.
import { createHmac, timingSafeEqual } from 'node:crypto';
// rawBody is the original request body Buffer. Keep secret on your server.
function verifyWebhook(rawBody, timestamp, signature, secret) {
if (typeof timestamp !== 'string' || !/^\d+$/.test(timestamp)) return false;
if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return false;
if (typeof signature !== 'string' || !/^sha256=[0-9a-f]{64}$/.test(signature)) return false;
const expected = createHmac('sha256', secret)
.update(timestamp + '.').update(rawBody).digest();
return timingSafeEqual(expected, Buffer.from(signature.slice(7), 'hex'));
}لا يغني التحقق من التوقيع عن منع التكرار؛ استخدم قيد تفرد دائمًا على eventId. أعد 2xx بعد المعالجة أو الإدخال الموثوق في قائمة الانتظار. تؤدي الأخطاء وانتهاء المهلة إلى إعادة المحاولة. يحتفظ الحدث نفسه بمعرّفه ومحتواه، ويُنشأ توقيع جديد لكل محاولة. تُجرى حتى 12 محاولة تلقائية، ويمكن بعدها إعادة الحدث الفاشل يدويًا من سجل الأحداث.
يجب أن يكون عنوان رد النداء متاحًا من الإنترنت ويحمل شهادة TLS صالحة. تُرفض العناوين الخاصة وعناوين الاسترجاع والعناوين ذات الاستخدام الخاص، ولا تُتبع عمليات إعادة التوجيه. لا تستخدم localhost أو شهادة ذاتية التوقيع أو عنوانًا يتطلب إعادة توجيه.
下载 bot-example.mjs,保存到本地目录。需要 Node.js 22 或以上。WebSocket 模式额外安装 ws;脚本会用事件 ID 构造回复消息的幂等键。
npm install ws
export BOT_BASE_URL='https://api.surprising.top:8443'
export BOT_TOKEN='替换为创建时显示的 Token'
node bot-example.mjsWebhook 模式在 127.0.0.1:8088/events 监听,应由你自己的公网 HTTPS 反向代理转发到这个端口。将代理公网 URL 填入机器人编辑页:
export BOT_MODE='webhook'
export BOT_WEBHOOK_SECRET='替换为回调签名密钥'
node bot-example.mjs脚本演示验签、确认、重连和幂等回复。生产业务需持久化事件去重记录,并针对外部业务的副作用设计幂等处理。不要在收到事件但尚未保存或处理时提前确认成功。
Download bot-example.mjs and save it locally. Requires Node.js 22 or later. WebSocket mode additionally requires ws. Replies use an idempotency key derived from the event ID.
npm install ws
export BOT_BASE_URL='https://api.surprising.top:8443'
export BOT_TOKEN='YOUR_BOT_TOKEN'
node bot-example.mjsWebhook mode listens on 127.0.0.1:8088/events. Forward your own public HTTPS callback to that port and enter its public URL in the bot editor:
export BOT_MODE='webhook'
export BOT_WEBHOOK_SECRET='YOUR_WEBHOOK_SIGNING_SECRET'
node bot-example.mjsThe script demonstrates signing verification, acknowledgements, reconnection and idempotent replies. Production services must persist event deduplication and make external business side effects idempotent. Never acknowledge an event before processing or reliably saving it.
bot-example.mjs をダウンロードしてローカルに保存します。Node.js 22 以上が必要です。WebSocket モードでは ws もインストールします。返信の冪等キーにはイベント ID を使用します。
npm install ws
export BOT_BASE_URL='https://api.surprising.top:8443'
export BOT_TOKEN='YOUR_BOT_TOKEN'
node bot-example.mjsWebhook モードは 127.0.0.1:8088/events で待ち受けます。自分の公開 HTTPS リバースプロキシからこのポートへ転送し、公開 URL をボット編集に入力してください。
export BOT_MODE='webhook'
export BOT_WEBHOOK_SECRET='YOUR_WEBHOOK_SIGNING_SECRET'
node bot-example.mjsサンプルは署名検証、確認応答、再接続、冪等な返信を示しています。本番環境ではイベントの重複排除記録を永続化し、外部の業務処理の副作用も冪等にしてください。処理や確実な保存が完了する前に成功を返さないでください。
bot-example.mjs를 다운로드해 로컬에 저장하세요. Node.js 22 이상이 필요합니다. WebSocket 모드에는 ws도 설치해야 합니다. 답장에는 이벤트 ID에서 만든 멱등 키를 사용합니다.
npm install ws
export BOT_BASE_URL='https://api.surprising.top:8443'
export BOT_TOKEN='YOUR_BOT_TOKEN'
node bot-example.mjsWebhook 모드는 127.0.0.1:8088/events에서 수신합니다. 자신의 공개 HTTPS 리버스 프록시를 이 포트로 연결하고 공개 URL을 봇 편집 화면에 입력하세요.
export BOT_MODE='webhook'
export BOT_WEBHOOK_SECRET='YOUR_WEBHOOK_SIGNING_SECRET'
node bot-example.mjs예제는 서명 검증, 확인 응답, 재연결, 멱등 답장을 보여줍니다. 운영 환경에서는 이벤트 중복 처리 기록을 영구 저장하고 외부 업무 작업의 부수 효과도 멱등하게 설계해야 합니다. 처리나 안전한 저장을 완료하기 전에 성공으로 확인하지 마세요.
Скачайте bot-example.mjs и сохраните локально. Требуется Node.js 22 или новее; для режима WebSocket также установите ws. Ключ идемпотентности ответа строится из ID события.
npm install ws
export BOT_BASE_URL='https://api.surprising.top:8443'
export BOT_TOKEN='YOUR_BOT_TOKEN'
node bot-example.mjsВ режиме Webhook сервер слушает 127.0.0.1:8088/events. Направьте запросы со своего публичного HTTPS-прокси на этот порт и укажите публичный URL при редактировании бота.
export BOT_MODE='webhook'
export BOT_WEBHOOK_SECRET='YOUR_WEBHOOK_SIGNING_SECRET'
node bot-example.mjsПример демонстрирует проверку подписи, подтверждения, переподключение и идемпотентные ответы. В рабочем сервисе нужно постоянно хранить записи исключения дубликатов и обеспечивать идемпотентность внешних бизнес-действий. Не подтверждайте успех до обработки или надёжного сохранения события.
Téléchargez bot-example.mjs et enregistrez-le localement. Node.js 22 ou ultérieur est requis. Le mode WebSocket nécessite aussi ws. Les réponses utilisent une clé d’idempotence dérivée de l’ID d’événement.
npm install ws
export BOT_BASE_URL='https://api.surprising.top:8443'
export BOT_TOKEN='YOUR_BOT_TOKEN'
node bot-example.mjsLe mode Webhook écoute sur 127.0.0.1:8088/events. Faites suivre les requêtes de votre propre proxy HTTPS public vers ce port et renseignez son URL publique dans l’éditeur du bot.
export BOT_MODE='webhook'
export BOT_WEBHOOK_SECRET='YOUR_WEBHOOK_SIGNING_SECRET'
node bot-example.mjsLe script illustre la vérification des signatures, les confirmations, la reconnexion et les réponses idempotentes. En production, conservez durablement les traces de déduplication et rendez les effets métier externes idempotents. Ne confirmez jamais un événement avant son traitement ou son enregistrement fiable.
نزّل bot-example.mjs واحفظه محليًا. يتطلب Node.js 22 أو أحدث. يحتاج وضع WebSocket أيضًا إلى تثبيت ws. تستخدم الردود مفتاح منع تكرار مشتقًا من معرّف الحدث.
npm install ws
export BOT_BASE_URL='https://api.surprising.top:8443'
export BOT_TOKEN='YOUR_BOT_TOKEN'
node bot-example.mjsيستمع وضع Webhook على 127.0.0.1:8088/events. وجّه طلبات وكيل HTTPS العكسي العام الخاص بك إلى هذا المنفذ، وأدخل عنوانه العام في محرر الروبوت.
export BOT_MODE='webhook'
export BOT_WEBHOOK_SECRET='YOUR_WEBHOOK_SIGNING_SECRET'
node bot-example.mjsيوضح المثال التحقق من التوقيع والتأكيدات وإعادة الاتصال والردود التي لا تتكرر آثارها. في بيئة الإنتاج، احفظ سجلات منع التكرار بشكل دائم وصمّم العمليات التجارية الخارجية بحيث لا تتكرر آثارها عند إعادة المحاولة. لا تؤكد نجاح الحدث قبل معالجته أو حفظه بأمان.
| HTTP 状态 | 常见原因 | 处理方式 |
|---|---|---|
| 400 | 参数或卡片格式错误 | 检查必填字段、长度和按钮配置 |
| 401 | Token 无效或已重置,机器人停用或删除 | 检查 Token 与机器人状态,不要无限重试 |
| 403 | 会话尚未授权或已停止订阅 | 请用户「开始使用」,使用真实事件中的 chatId |
| 404 | 发送记录不存在 | 检查 requestId 是否属于当前机器人 |
| 409 | requestId 对应的内容或会话发生变化 | 原消息重试保持内容一致,新消息使用新 ID |
| 429 | 超出每秒 10 次的发送或查询限额 | 延迟后重试,避免密集轮询 |
| 5xx | 服务暂时不可用 | 退避重试,保留原 requestId |
发送到聊天服务的消息自动尝试最多 8 次,失败后可在「消息记录」手动重试。Webhook 事件自动尝试最多 12 次,失败后可在「事件记录」手动重试。停用机器人会暂停未完成投递,重新启用后继续。
| HTTP status | Common reason | What to do |
|---|---|---|
| 400 | Invalid parameters or card format | Check required fields, lengths and buttons |
| 401 | Invalid or reset Token; disabled or deleted bot | Check credentials and bot state; do not retry indefinitely |
| 403 | Unauthorized or unsubscribed conversation | Ask the user to start using the bot; use a real event's chatId |
| 404 | Delivery record not found | Check the requestId belongs to this bot |
| 409 | Same requestId with different content or recipient | Keep retries identical; use new IDs for new messages |
| 429 | More than 10 sends or queries per second | Back off and avoid frequent polling |
| 5xx | Temporary service failure | Retry with backoff and the original requestId |
Chat delivery makes up to 8 automatic attempts; use “Message history” to retry failures. Webhook events make up to 12 attempts; use “Event history” for manual retries. Disabling a bot pauses pending deliveries, which resume when it is enabled again.
| HTTP ステータス | 主な原因 | 対応 |
|---|---|---|
| 400 | パラメーターやカード形式の誤り | 必須項目、長さ、ボタン設定を確認 |
| 401 | 無効またはリセット済みの Token、停止または削除されたボット | 認証情報と状態を確認し、無限に再試行しない |
| 403 | 未許可または購読停止済みの会話 | ユーザーに利用開始を依頼し、実際のイベントの chatId を使用 |
| 404 | 配信記録が存在しない | requestId がこのボットのものか確認 |
| 409 | 同じ requestId で内容や送信先が変わった | 再試行は同じ内容にし、新規メッセージには新しい ID を使用 |
| 429 | 送信と確認の合計が毎秒 10 回を超えた | 間隔を空け、頻繁なポーリングを避ける |
| 5xx | サービスの一時的な障害 | 元の requestId を維持してバックオフしながら再試行 |
チャットへの配信は最大 8 回自動試行されます。失敗後は「メッセージ履歴」から再試行できます。Webhook イベントは最大 12 回で、「イベント履歴」から手動再試行できます。ボットを停止すると未完了の配信が一時停止し、再開すると続行します。
| HTTP 상태 | 일반적인 원인 | 대응 방법 |
|---|---|---|
| 400 | 잘못된 매개변수 또는 카드 형식 | 필수 필드, 길이, 버튼 설정 확인 |
| 401 | 무효 또는 재설정된 Token, 비활성화되거나 삭제된 봇 | 인증 정보와 상태를 확인하고 무한 재시도 금지 |
| 403 | 허용되지 않았거나 구독을 중지한 대화 | 사용자에게 사용 시작을 요청하고 실제 이벤트의 chatId 사용 |
| 404 | 전달 기록이 없음 | requestId가 현재 봇에 속하는지 확인 |
| 409 | 같은 requestId로 내용 또는 수신 대상을 변경 | 재시도 내용은 동일하게 유지하고 새 메시지에는 새 ID 사용 |
| 429 | 전송과 조회 합계가 초당 10회를 초과 | 지연 후 재시도하고 잦은 조회 피하기 |
| 5xx | 일시적인 서비스 장애 | 원래 requestId를 유지하며 백오프로 재시도 |
채팅 전달은 자동으로 최대 8회 시도하며 실패하면 ‘메시지 기록’에서 재시도할 수 있습니다. Webhook 이벤트는 최대 12회 시도하고 ‘이벤트 기록’에서 직접 재시도할 수 있습니다. 봇을 비활성화하면 미완료 전달을 일시 중지하고 다시 활성화하면 이어서 처리합니다.
| Статус HTTP | Частая причина | Действие |
|---|---|---|
| 400 | Ошибка параметров или формата карточки | Проверьте обязательные поля, длины и кнопки |
| 401 | Недействительный или сброшенный Token; бот отключён или удалён | Проверьте учётные данные и состояние; не повторяйте бесконечно |
| 403 | Диалог не разрешён или подписка прекращена | Попросите пользователя начать использование, возьмите chatId из реального события |
| 404 | Запись доставки не найдена | Проверьте принадлежность requestId этому боту |
| 409 | Тот же requestId с другим содержимым или получателем | Сохраняйте повторы идентичными, для новых сообщений используйте новые ID |
| 429 | Более 10 отправок или проверок в секунду | Делайте паузы, избегайте частого опроса |
| 5xx | Временный сбой сервиса | Повторите с задержкой и исходным requestId |
Доставка в чат выполняет до 8 автоматических попыток; после неудачи используйте историю сообщений. Для Webhook предусмотрено до 12 попыток и ручной повтор в истории событий. Отключение бота приостанавливает незавершённые доставки, включение возобновляет их.
| Statut HTTP | Cause fréquente | Action |
|---|---|---|
| 400 | Paramètres ou format de carte incorrects | Vérifier les champs obligatoires, longueurs et boutons |
| 401 | Token invalide ou réinitialisé ; bot désactivé ou supprimé | Vérifier les identifiants et l’état, sans reprises infinies |
| 403 | Conversation non autorisée ou abonnement arrêté | Demander à l’utilisateur d’activer le bot et utiliser le chatId d’un vrai événement |
| 404 | Livraison introuvable | Vérifier que le requestId appartient à ce bot |
| 409 | Même requestId avec contenu ou destinataire différent | Garder les reprises identiques ; nouvel ID pour un nouveau message |
| 429 | Plus de 10 envois ou consultations par seconde | Attendre et éviter les interrogations fréquentes |
| 5xx | Panne temporaire du service | Réessayer avec un délai progressif et le requestId d’origine |
La livraison au chat effectue jusqu’à 8 tentatives automatiques, puis peut être relancée depuis l’historique des messages. Les événements Webhook ont jusqu’à 12 tentatives et peuvent être relancés depuis l’historique des événements. Désactiver un bot suspend les livraisons en cours ; les réactiver permet de les reprendre.
| حالة HTTP | السبب الشائع | الإجراء |
|---|---|---|
| 400 | خطأ في المعلمات أو تنسيق البطاقة | افحص الحقول المطلوبة والأطوال والأزرار |
| 401 | Token غير صالح أو أُعيد تعيينه؛ الروبوت معطل أو محذوف | افحص بيانات المصادقة وحالة الروبوت، ولا تعِد المحاولة بلا نهاية |
| 403 | المحادثة غير مصرح بها أو أُلغي الاشتراك | اطلب من المستخدم بدء الاستخدام واستعمل chatId من حدث حقيقي |
| 404 | سجل التسليم غير موجود | تأكد من أن requestId يخص الروبوت الحالي |
| 409 | requestId نفسه مع محتوى أو مستلم مختلف | احتفظ بطلبات الإعادة متطابقة واستخدم معرّفات جديدة للرسائل الجديدة |
| 429 | تجاوز 10 طلبات إرسال أو استعلام في الثانية | انتظر قبل الإعادة وتجنب الاستعلام المتكرر |
| 5xx | تعطل مؤقت للخدمة | أعد المحاولة بتأخير متزايد مع requestId الأصلي |
تُجرى حتى 8 محاولات تلقائية لتسليم الرسالة إلى خدمة المحادثة، ثم يمكن إعادتها من سجل الرسائل. لأحداث Webhook حتى 12 محاولة، مع إمكانية الإعادة يدويًا من سجل الأحداث. يؤدي تعطيل الروبوت إلى إيقاف التسليم غير المكتمل مؤقتًا، ويُستأنف عند تفعيله.
完整 Token 无法再次查看。在机器人详情重置 Token 后更新你的服务配置,再重新连接。重置会同时更换 Webhook 签名密钥,并关闭旧开发者连接。
不用。只需 Token 和 HTTP 发送接口。需要处理用户回复或卡片交互时,再连接 WebSocket 或配置 Webhook。
202 表示已受理。使用相同 requestId 查询投递状态,或打开机器人详情的「消息记录」查看结果;不要换一个 ID 再发送同一条消息。
把机器人 ID 给对方。对方在应用中心查找并点击「开始使用」后即可接收;让对方发一条文字,你的服务就能从事件中取得其 chatId。
一个机器人选择一种事件接收方式。可以在编辑页面切换;WebSocket 模式每个机器人只有一个开发者连接,多端用户聊天不受此限制。
停用可恢复,仍占创建名额,并暂停未完成投递。删除后释放名额,原 Token 失效,需要重新创建机器人。
The full Token cannot be retrieved. Reset it in bot details, update your server configuration and reconnect. Resetting also rotates the Webhook signing secret and closes the previous developer connection.
No. A Token and the HTTP send endpoint are sufficient. Connect WebSocket or configure Webhook only when you need replies or card actions.
202 means accepted. Query with the original requestId or check “Message history”. Do not use a new ID to resend the same message.
Share the bot ID. They can find it in the App Center and choose “Start using”. Ask them to send a text reply so your service receives their chatId in an event.
Each bot uses one event transport. Change it in the editor. The one-developer-connection limit for WebSocket does not limit users chatting across devices.
Disabling is reversible, still occupies a slot and pauses pending deliveries. Deleting frees the slot and invalidates the Token. Create a new bot to start again.
完全な Token は再表示できません。ボット詳細でリセットし、サーバー設定を更新して再接続してください。Webhook の署名用シークレットも同時に更新され、以前の開発者接続は閉じられます。
不要です。Token と HTTP の送信 API だけで送れます。返信やカード操作を処理したい場合だけ、WebSocket または Webhook を設定してください。
202 は受け付け済みを意味します。元の requestId で状態を確認するか、「メッセージ履歴」を確認してください。同じメッセージを新しい ID で再送しないでください。
ボット ID を共有します。相手がアプリセンターで検索して「利用開始」を選び、テキストを返信すると、サービスはイベントからその人の chatId を取得できます。
1 つのボットで使える受信方式は 1 つです。編集画面で切り替えられます。WebSocket の開発者接続 1 本という制限は、ユーザーの複数端末での会話を制限しません。
停止は解除でき、作成枠を引き続き使用して未完了の配信を一時停止します。削除すると枠が空き Token は無効になります。再び利用するにはボットを新規作成してください。
전체 Token은 다시 조회할 수 없습니다. 봇 상세 화면에서 재설정한 뒤 서버 설정을 갱신하고 다시 연결하세요. Webhook 서명 비밀 키도 함께 변경되며 이전 개발자 연결은 종료됩니다.
아니요. Token과 HTTP 전송 API만 있으면 됩니다. 답장이나 카드 동작을 처리할 때만 WebSocket에 연결하거나 Webhook을 설정하세요.
202는 요청이 접수되었다는 뜻입니다. 원래 requestId로 상태를 조회하거나 ‘메시지 기록’을 확인하세요. 같은 메시지를 새 ID로 다시 전송하지 마세요.
봇 ID를 공유하세요. 상대가 앱 센터에서 검색하고 ‘사용 시작’을 선택한 뒤 텍스트로 답장하면 서비스가 이벤트에서 해당 chatId를 얻을 수 있습니다.
봇 하나는 하나의 이벤트 수신 방식만 사용합니다. 편집 화면에서 변경할 수 있습니다. WebSocket의 개발자 연결 한 개 제한은 사용자의 여러 기기 채팅을 제한하지 않습니다.
비활성화는 되돌릴 수 있으며 생성 한도를 계속 차지하고 미완료 전달을 일시 중지합니다. 삭제하면 자리가 비워지고 Token이 무효가 됩니다. 다시 사용하려면 새 봇을 만드세요.
Полный Token повторно не выдаётся. Сбросьте его в карточке бота, обновите настройки сервера и подключитесь заново. При сбросе также меняется секрет подписи Webhook и закрывается прежнее соединение разработчика.
Нет. Достаточно Token и HTTP-метода отправки. WebSocket или Webhook нужны только для ответов пользователей и действий карточек.
202 означает приём запроса. Проверьте статус по исходному requestId или откройте историю сообщений. Не отправляйте то же сообщение заново с другим ID.
Поделитесь ID бота. Пользователь найдёт его в Центре приложений и разрешит получение сообщений. Попросите отправить текстовый ответ: его chatId придёт вашему сервису в событии.
Бот использует один способ получения событий, который можно сменить при редактировании. Ограничение одного соединения разработчика WebSocket не ограничивает общение пользователей с разных устройств.
Отключение обратимо, сохраняет занятое место и приостанавливает незавершённые доставки. Удаление освобождает место и делает Token недействительным. Для возобновления работы создайте нового бота.
Le Token complet ne peut pas être relu. Réinitialisez-le dans la fiche du bot, mettez à jour votre serveur et reconnectez-vous. Cela renouvelle aussi le secret de signature Webhook et ferme l’ancienne connexion développeur.
Non. Le Token et l’endpoint d’envoi HTTP suffisent. Configurez WebSocket ou Webhook seulement si vous souhaitez recevoir les réponses ou les actions des cartes.
202 signifie que la demande est acceptée. Consultez le statut avec le requestId d’origine ou ouvrez l’historique des messages. Ne renvoyez pas le même message avec un nouvel ID.
Partagez son ID. Elles peuvent le rechercher dans le centre d’applications et commencer à l’utiliser. Demandez une réponse textuelle afin de recevoir leur chatId dans un événement.
Un bot utilise un seul mode de réception, modifiable dans l’éditeur. La limite d’une connexion développeur WebSocket ne limite pas les utilisateurs qui discutent depuis plusieurs appareils.
La désactivation est réversible, occupe toujours une place et suspend les livraisons inachevées. La suppression libère la place et invalide le Token. Créez un nouveau bot pour recommencer.
لا يمكن استرجاع Token كاملًا. أعد تعيينه من تفاصيل الروبوت، وحدّث إعدادات خادمك، ثم أعد الاتصال. تتغير أيضًا قيمة سر توقيع Webhook ويُغلق اتصال المطور السابق.
لا. يكفي Token وواجهة الإرسال عبر HTTP. اتصل بـWebSocket أو اضبط Webhook فقط عند الحاجة إلى الردود أو إجراءات البطاقات.
تعني 202 أن الطلب قُبل. استعلم باستخدام requestId الأصلي أو افتح سجل الرسائل. لا ترسل الرسالة نفسها بمعرّف جديد.
شارك معرّف الروبوت. يستطيع المستخدم البحث عنه في مركز التطبيقات والبدء باستخدامه. اطلب منه إرسال رد نصي ليصل chatId الخاص به إلى خدمتك ضمن حدث.
يستخدم كل روبوت طريقة واحدة لاستقبال الأحداث، ويمكن تغييرها من المحرر. لا يحد اتصال المطور الواحد في WebSocket من محادثات المستخدم عبر أجهزة متعددة.
التعطيل قابل للعكس، ويظل الروبوت محسوبًا ضمن الحد، ويوقف التسليم غير المكتمل مؤقتًا. يحرر الحذف مكانًا ويلغي صلاحية Token. أنشئ روبوتًا جديدًا للبدء مجددًا.
开始接入
创建机器人,保存 Token,然后发一条消息给自己。