تدفقات WebSocket
انقطع الاتصال
- يقوم الخادم بإغلاق اتصال WebSocket بعد 60 ثانية من عدم النشاط (Connection Keep-Alive)
- يُعرَّف الخمول بأنه عدم وجود طلبات مرسلة من العميل
إبقاء الاتصال مفتوحًا
للحفاظ على اتصال WebSocket نشطًا، عليك القيام بما يلي:
- أرسل طلبات دورية كل 50 ثانية
- تعامل بشكل صحيح مع حالات انقطاع الاتصال المحتملة في منطق تطبيقك
التفويض
مقدمة
قبل توقيع أي طلبات WebSocket، يجب عليك إنشاء مفتاح API في حسابك الشخصي على Cryptomus
تتوفر تعليمات مفصلة لإنشاء مفتاح API هنا
الحصول على رمز مميز لمرة واحدة للاتصال
قبل الاتصال بخادم WebSocket، ستحتاج إلى الحصول على رمز مصادقة لمرة واحدة
يمكنك الحصول على الرمز المميز عن طريق إرسال الطلب المقابل
تكون البطاقة صالحة لمدة 5 دقائق أو حتى يتم الاتصال بنجاح لأول مرة
الاتصال بخادم WebSocket
للاتصال بخادم WebSocket
1. احصل على عرض لمرة واحدة رمز المصادقة
2. حدد الرمز المميز في معلمة الاستعلام token عند إنشاء الاتصال
مثال على عنوان URL للاتصال: wss://api-ws.cryptomus.com/ws?token=b0b1cacd26993392ecf072155bd1686c96e380ad12cefa564aa6665c85c77334
لا يمكن استخدام الرمز المميز إلا مرة واحدة. لكل اتصال جديد، ستحتاج إلى طلب رمز مميز جديد.
بعد التحقق الناجح من الرمز المميز، سيتم إنشاء الاتصال، ويمكنك الاشتراك في القنوات المتاحة.
الحصول على رمز مصادقة لمرة واحدة لاتصال WebSocket
يُتيح هذا البرنامج إنشاء رمز مصادقة لمرة واحدة للاتصال بخادم WebSocket. يكون الرمز صالحًا حتى أول اتصال ناجح أو حتى انتهاء صلاحيته (بعد 5 دقائق).
رؤوس التفويض
تتوفر معلومات كاملة حول رؤوس التفويض المطلوبة هنا
إجابة
{ "token": "168b34a3a12370740ff1654f0d0c4726ff1bba8c4675edc0d7553f15e5a2a094" }ينسخالرموز الممكنة
200: تم إنشاء الطلب بنجاح
404: لم يتم العثور على المستخدم أو المورد
500: خطأ داخلي في الخادم
رموز مقياس العمق
طلب
إجابة
1{
2 "status": "success",
3 "message": "success",
4 "data": [
5 {
6 "scale": "0.01",
7 "index": 0 // index
8 },
9 ...
10 ]
11}ينسخقائمة السوق
طلب
إجابة
1{
2 "result": [
3 {
4 "id": "01HSBPVS17CT2GN2FV34K3AMP9",
5 "symbol": "BTC_USDT",
6 "baseCurrency": "BTC",
7 "quoteCurrency": "USDT",
8 "baseMinSize": "0.0000100000000000",
9 "quoteMinSize": "0.1000000000000000",
10 "baseMaxSize": "10000000000.0000000000000000",
11 "quoteMaxSize": "99999999.0000000000000000",
12 "basePrec": "8",
13 "quotePrec": "6",
14 "baseCurrencyFullName": "Bitcoin",
15 "quoteCurrencyFullName": "Tether USD"
16 },
17 ...
18 ]
19}ينسختطبيق الطالب
1const WebSocket = require('ws');
2
3class CryptomusWebSocket {
4 constructor(token) {
5 this.token = token;
6 this.socket = new WebSocket('wss://api-ws.cryptomus.com/ws?token=${this.token}');
7 this.setupConnection();
8 }
9
10 setupConnection() {
11 this.socket.on('open', () => {
12 console.log('Connected to Cryptomus WebSocket');
13 this.startPing();
14 });
15
16 this.socket.on('message', (data) => {
17 console.log('Received:', data.toString());
18 });
19 }
20
21 ping() {
22 if (this.socket.readyState === WebSocket.OPEN) {
23 this.socket.send(JSON.stringify({
24 id: 0,
25 method: "ping",
26 params: []
27 }));
28 }
29 }
30
31 startPing() {
32 setInterval(() => {
33 this.ping();
34 }, 50 * 1000); // Every 50 seconds
35 }
36}
37
38// Usage
39const token = "your_auth_token_here";
40const client = new CryptomusWebSocket(token);
41 ينسخ
1import asyncio
2import websockets
3import json
4
5class CryptomusWebSocket:
6 def __init__(self, token):
7 self.token = token
8 self.socket = None
9
10 async def connect(self):
11 self.socket = await websockets.connect(f"wss://api-ws.cryptomus.com/ws?token={self.token}")
12 print('Connected to Cryptomus WebSocket')
13
14 async def ping(self):
15 await self.socket.send(json.dumps({
16 "id": 0,
17 "method": "ping",
18 "params": []
19 }))
20
21 async def start_ping(self):
22 while True:
23 await asyncio.sleep(50) # Every 50 seconds
24 await self.ping()
25
26 async def listen(self):
27 async for message in self.socket:
28 print(f"Received: {message}")
29
30 async def run(self):
31 await self.connect()
32
33 # Start ping task
34 ping_task = asyncio.create_task(self.start_ping())
35
36 # Listen for messages
37 await self.listen()
38
39# Usage
40token = "your_auth_token_here"
41client = CryptomusWebSocket(token)
42asyncio.run(client.run())
43 ينسخجميع نقاط النهاية تُرجع الوقت بتنسيق الطابع الزمني لنظام يونكس
بنية رسالة الطلب
| اسم | نوع المعلمة | تعريف |
|---|---|---|
| id | Integer | يجب أن يكون فريدًا لمعالجة الرد على طلبك |
| method | String | اسم الطلب |
| params | Array | مرر معلمات الطريقة هنا |
نوع المعلمة
Integerتعريف
يجب أن يكون فريدًا لمعالجة الرد على طلبكنوع المعلمة
Stringتعريف
اسم الطلبنوع المعلمة
Arrayتعريف
مرر معلمات الطريقة هنا
سيتم إنهاء اتصال WebSocket في حالة إرسال JSON غير صالح
أنواع الرسائل والطلبات
- طلب (`ping`, `candles_request`, إلخ.)
- الاشتراك (`candles_subscribe`، `lastprice_subscribe`، إلخ). سيتم إلغاء إعادة الاشتراك في نفس نوع البيانات.
رسالة الرد
| اسم | نوع المعلمة | تعريف |
|---|---|---|
| id | Integer | معرّف الطلب |
| data | Null | في حال فشل الطلب. أما في حال نجاحه، فسيتم عرض بنية الاستجابة لكل طريقة أدناه. |
| error | Null | في حال نجاح العملية. في حال حدوث خطأ |
| message | String | |
| code | Integer | رمز الخطأ |
نوع المعلمة
Integerتعريف
معرّف الطلبنوع المعلمة
Nullتعريف
في حال فشل الطلب. أما في حال نجاحه، فسيتم عرض بنية الاستجابة لكل طريقة أدناه.نوع المعلمة
Nullتعريف
في حال نجاح العملية. في حال حدوث خطأنوع المعلمة
Integerتعريف
رمز الخطأ
الرمز: 1. الرسالة: تنسيق رسالة غير صالح
الرمز: 2. الرسالة: أخطاء أخرى
أنواع رسائل الاستجابة
- نتيجة الاستعلام
- حالة الاشتراك (نجاح/فشل)
- تحديث الأحداث
تنس الطاولة
بينغ
1{
2 "id": 0,
3 "method": "ping",
4 "params": []
5}
6 ينسخرد فعل بونغ
1{
2 "id": 0,
3 "method": "pong",
4 "data": null,
5 "error": null
6}
7 ينسخأمثلة على الاشتراكات
طلب
1{
2 "id": 0,
3 "method": "trade_subscribe",
4 "params": [
5 "BTC_USDT"
6 ]
7}
8 ينسخإجابة
1{
2 "id": 0,
3 "method": "trade_subscribe",
4 "data": {
5 "status": "success"
6 },
7 "error": null
8}
9 ينسخحدث التحديث
1{
2 "id": 0,
3 "method": "trade_update",
4 "data": [], // See structure for each method below
5 "error": null
6}
7 ينسخالسعر الأخير
الاشتراك
1{
2 "id": 0,
3 "method": "lastprice_subscribe",
4 "params": [
5 "BTC_USDT", // Market
6 "BTC_USDT",
7 "ETH_USDT",
8 ...
9 ]
10}
11 ينسخاشترك في جميع الفعاليات lastprice_subscribe
1{
2 "id": 0,
3 "method": "lastprice_subscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8 ينسخإجابة
1{
2 "id": 0,
3 "method": "lastprice_subscribe",
4 "data": {
5 "status": "success"
6 },
7 "error": null
8}
9 ينسخحدث
1{
2 "id": 0,
3 "method": "lastprice_update",
4 "data": {
5 "symbol": "BTC_USDT",
6 "timestamp": 1750953362,
7 "price": "107152.55"
8 },
9 "error": null
10}
11 ينسخإلغاء الاشتراك
طلب
1{
2 "id": 0,
3 "method": "lastprice_unsubscribe",
4 "params": [
5 "BTC_USDT",
6 "ETH_USDT",
7 ...
8 ]
9}
10 ينسخإلغاء الاشتراك في جميع الفعاليات lastprice_unsubscribe
1{
2 "id": 0,
3 "method": "lastprice_unsubscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8 ينسخإجابة
1{
2 "id": 0,
3 "data": {
4 "status": "success"
5 },
6 "error": null
7}ينسخعمق
الاشتراك
أولاً، عليك الحصول على مؤشر حجم السوق كيفية الحصول على
1{
2 "id": 0,
3 "method": "depth_subscribe",
4 "params": [
5 "BTC_USDT:0", // market:scale_index
6 "BTC_USDT:1",
7 "ETH_USDT:1",
8 ...
9 ]
10}
11 ينسخاشترك في جميع الفعاليات depth_subscribe
1{
2 "id": 0,
3 "method": "depth_subscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8 ينسخإجابة
1{
2 "id": 0,
3 "method": "depth_subscribe",
4 "data": {
5 "status": "success"
6 },
7 "error": null
8}
9 ينسخحدث
1{
2 "id": 0,
3 "method": "depth_update",
4 "data": {
5 "symbol": "BTC_USDT",
6 "timestamp": 1750952911,
7 "full_reload": false, // If false, it is a partial update, if true, it is a fully updated orderbook.
8 "scale_index": 0,
9 "asks": [
10 [
11 "107043.93", // price
12 "0.304313" // value
13 ]
14 ],
15 "bids": [
16 [
17 "106976.11",
18 "0" // for partial update - finished orders will be 0
19 ]
20 ]
21 },
22 "error": null
23}
24 ينسخإلغاء الاشتراك
طلب
1{
2 "id": 0,
3 "method": "depth_unsubscribe",
4 "params": [
5 "BTC_USDT:0", // market:scale_index
6 "ETH_USDT:1",
7 ...
8 ]
9}
10 ينسخإلغاء الاشتراك في جميع الفعاليات depth_unsubscribe
1{
2 "id": 0,
3 "method": "depth_unsubscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8 ينسخإجابة
1{
2 "id": 0,
3 "data": {
4 "status": "success"
5 },
6 "error": null
7}
8 ينسخمؤشر الأسعار
الاشتراك
1{
2 "id": 0,
3 "method": "ticker_subscribe",
4 "params": [
5 "BTC_USDT", // Market
6 "BTC_USDT",
7 "ETH_USDT",
8 ...
9 ]
10}
11 ينسخاشترك في جميع الفعاليات ticker_subscribe
1{
2 "id": 0,
3 "method": "ticker_subscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8 ينسخإجابة
1{
2 "id": 0,
3 "method": "ticker_subscribe",
4 "data": {
5 "status": "success"
6 },
7 "error": null
8}
9 ينسخحدث
1{
2 "id": 0,
3 "method": "ticker_update",
4 "data": {
5 "symbol": "BTC_USDT",
6 "timestamp": 1750953144,
7 "price": "107090.35",
8 "open": "107042.21",
9 "high": "108248.15",
10 "low": "106573.19",
11 "volume": "1531.027982",
12 "quote_volume": "164564314.80174687",
13 "price_change": "0.04"
14 },
15 "error": null
16}
17 ينسخإلغاء الاشتراك
طلب
1{
2 "id": 0,
3 "method": "ticker_unsubscribe",
4 "params": [
5 "BTC_USDT", // Market
6 "ETH_USDT",
7 ...
8 ]
9}
10 ينسخإلغاء الاشتراك في جميع الفعاليات ticker_unsubscribe
1{
2 "id": 0,
3 "method": "ticker_unsubscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8 ينسخإجابة
1{
2 "id": 0,
3 "data": {
4 "status": "success"
5 },
6 "error": null
7}
8 ينسخالصفقات
الاشتراك
1{
2 "id": 0,
3 "method": "trade_subscribe",
4 "params": [
5 "BTC_USDT", // Market
6 "BTC_USDT",
7 "ETH_USDT",
8 ...
9 ]
10}
11 ينسخاشترك في جميع الفعاليات trade_subscribe
1{
2 "id": 0,
3 "method": "trade_subscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8 ينسخإجابة
1{
2 "id": 0,
3 "method": "trade_subscribe",
4 "data": {
5 "status": "success"
6 },
7 "error": null
8}
9 ينسخحدث
1{
2 "id": 0,
3 "method": "trade_update",
4 "data": {
5 "symbol": "BTC_USDT",
6 "timestamp": 1750953177,
7 "trades": [
8 {
9 "price": 107100.01,
10 "quantity": 0.000254,
11 "timestamp": 1750953177,
12 "direction": "buy"
13 },
14 ...
15 ]
16 },
17 "error": null
18}
19 ينسخإلغاء الاشتراك
طلب
1{
2 "id": 0,
3 "method": "trade_unsubscribe",
4 "params": [
5 "BTC_USDT", // Market
6 "ETH_USDT",
7 ...
8 ]
9}
10 ينسخإلغاء الاشتراك في جميع الفعاليات trade_unsubscribe
1{
2 "id": 0,
3 "method": "trade_unsubscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8 ينسخإجابة
1{
2 "id": 0,
3 "data": {
4 "status": "success"
5 },
6 "error": null
7}
8 ينسخطلبات
الاشتراك
1{
2 "id": 0,
3 "method": "order_subscribe",
4 "params": [
5 "BTC_USDT", // Market
6 "TRX_USDT",
7 "ETH_USDT",
8 ...
9 ]
10}
11 ينسخاشترك في جميع الفعاليات order_subscribe
1{
2 "id": 0,
3 "method": "order_subscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8 ينسخإجابة
1{
2 "id": 0,
3 "method": "order_subscribe",
4 "data": {
5 "status": "success"
6 },
7 "error": null
8}
9 ينسخالفعاليات
إنشاء طلب
1{
2 "id": "1",
3 "method": "order_update",
4 "data": {
5 "type": "created",
6 "info": {
7 "id": "01JYET5DQ772MPYHHE417FQF1J",
8 "symbol": "TRX_USDT",
9 "orderType": "limit",
10 "direction": "sell",
11 "price": "0.2200000000000000",
12 "quantity": "50.0000000000000000",
13 "value": "11.0000000000000000",
14 "filledQuantity": "0.0000000000000000",
15 "filledValue": "0.0000000000000000",
16 "clientOid": null,
17 "createTs": 1750696376
18 }
19 },
20 "error": null
21}
22 ينسختم تحديث الطلب
1{
2 "id": "3",
3 "method": "order_update",
4 "data": {
5 "type": "updated",
6 "info": {
7 "id": "01JYET5DQ772MPYHHE417FQF1J",
8 "symbol": "TRX_USDT",
9 "orderType": "limit",
10 "direction": "sell",
11 "price": "0.2200000000000000",
12 "quantity": "50.0000000000000000",
13 "value": "11.0000000000000000",
14 "filledQuantity": "20.0000000000000000",
15 "filledValue": "4.4000000000000000",
16 "clientOid": null,
17 "createTs": 1750696376,
18 "updateTs": 1750696487,
19 }
20 },
21 "error": null
22}
23 ينسختم الانتهاء من الطلب
1{
2 "id": "3",
3 "method": "order_update",
4 "data": {
5 "type": "finished",
6 "info": {
7 "id": "01JYET5DQ772MPYHHE417FQF1J",
8 "symbol": "TRX_USDT",
9 "orderType": "limit",
10 "direction": "sell",
11 "price": "0.2200000000000000",
12 "quantity": "50.0000000000000000",
13 "value": "11.0000000000000000",
14 "filledQuantity": "50.0000000000000000",
15 "filledValue": "11.0000000000000000",
16 "clientOid": null,
17 "createTs": 1750696376,
18 "finishTs": 1750696417,
19 "state": "completed""internalState": "filled"
20 }
21 },
22 "error": null
23}
24 ينسخإلغاء الاشتراك في التحديثات
من أسواق محددة
1{
2 "id": 0,
3 "method": "order_unsubscribe",
4 "params": [
5 "BTC_USDT", // Market
6 "ETH_USDT",
7 ...
8 ]
9}
10 ينسخمن جميع الأسواق
1{
2 "id": 0,
3 "method": "order_unsubscribe",
4 "params": [
5 "all" // Optional, will also work if an empty array is passed in
6 ]
7}
8 ينسخإجابة
1{
2 "id": 0,
3 "data": {
4 "status": "success"
5 },
6 "error": null
7}
8 ينسخالأرصدة
الاشتراك
العملة الأساسية من قائمة السوق
1{
2 "id": 0,
3 "method": "balance_subscribe",
4 "params": [
5 "BTC", // BaseCurrency from market list
6 "TRX,
7 "ETH",
8 ...
9 ]
10}
11 ينسخاشترك في جميع الفعاليات balance_subscribe
1{
2 "id": 0,
3 "method": "balance_subscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8 ينسخإجابة
1{
2 "id": 0,
3 "method": "balance_subscribe",
4 "data": {
5 "status": "success"
6 },
7 "error": null
8}
9 ينسخالفعاليات
1{
2 "id": "4",
3 "method": "balance_update",
4 "data": {
5 "info": {
6 "walletId": "01J7E836F6K5KCX5DP2W0F6FAG",
7 "currencyCode": "USDT",
8 "amount": "50.0000000000000000",
9 "oldBalance": "40000.0000000000000000",
10 "newBalance": "39950.00000000"
11 }
12 },
13 "error": null
14}
15 ينسخإلغاء الاشتراك في الفعاليات
من عملات محددة
العملة الأساسية من قائمة السوق
1{
2 "id": 0,
3 "method": "balance_unsubscribe",
4 "params": [
5 "BTC", // BaseCurrency from market list
6 "ETH",
7 ...
8 ]
9}
10 ينسخمن جميع العملات
1{
2 "id": 0,
3 "method": "balance_unsubscribe",
4 "params": [
5 "all" // Optional, will also work if an empty array is passed in
6 ]
7}
8 ينسخإجابة
1{
2 "id": 0,
3 "data": {
4 "status": "success"
5 },
6 "error": null
7}
8 ينسخعروض
الاشتراك
1{
2 "id": 0,
3 "method": "deal_subscribe",
4 "params": [
5 "BTC_USDT", // Market
6 "TRX_USDT,
7 "ETH_USDT",
8 ...
9 ]
10}
11 ينسخاشترك في جميع الفعاليات deal_subscribe
1{
2 "id": 0,
3 "method": "deal_subscribe",
4 "params": [
5 "all" // This also works for other events
6 ]
7}
8 ينسخإجابة
1{
2 "id": 0,
3 "data": {
4 "status": "success"
5 },
6 "error": null
7}
8 ينسخالفعاليات
1{
2 "id": "4",
3 "method": "deal_update",
4 "data": {
5 "info": {
6 "dealId": "01JYH50V5VWPP3QTYGM6CPZ0AR",
7 "symbol": "TRX_USDT",
8 "dealState": "completed",
9 "transactionId": "01JYH50V5YM8M3943KJ9HY2VXM",
10 "filledPrice": "0.2726960000000000",
11 "filledQuantity": "100.0000000000000000",
12 "filledValue": "27.2696000000000000",
13 "fee": "1.0907840000000000",
14 "feeCurrency": "USDT",
15 "tradeRole": "taker",
16 "committedAt": 1750774869
17 }
18 },
19 "error": null
20}
21 ينسخإلغاء الاشتراك في التحديثات
من أسواق محددة
1{
2 "id": 0,
3 "method": "deal_unsubscribe",
4 "params": [
5 "BTC_USDT", // Market
6 "TRX_USDT,
7 ...
8 ]
9}
10 ينسخمن جميع الأسواق
1{
2 "id": 0,
3 "method": "deal_unsubscribe",
4 "params": [
5 "all" // Optional, will also work if an empty array is passed in
6 ]
7}
8 ينسخإجابة
1{
2 "id": 0,
3 "data": {
4 "status": "success"
5 },
6 "error": null
7}
8 ينسخ