
Отправка уведомлений продавцу о переводе средств в P2P-чате Binance. Подключение через WebSocket и автоматизация на Python.
В мире автоматизации криптовалютной торговли важной частью остаётся взаимодействие с контрагентами. В Binance P2P-чате часто требуется уведомить продавца или покупателя о том, что платёж был произведён. Это можно сделать автоматически — без ручного ввода, используя WebSocket-соединение и Python.
В этой статье мы рассмотрим, как получить учётные данные чата, подключиться к WebSocket и отправить сообщение в P2P-чат Binance, уведомляя о переводе средств. Это удобно, если вы разрабатываете P2P-бота или автоматизируете P2P-операции.
Для начала нам нужно получить chatWssUrl, listenKey и listenToken, чтобы подключиться к WebSocket-каналу.
retrieveChatCredential
def retrieveChatCredential():
# You Api Key on binance
api_key = "11111"
# You Apy Secret on binance
secret_key = "11111"
base_url = "https://api.binance.com"
endpoint = "/sapi/v1/c2c/chat/retrieveChatCredential"
timestamp = int(time.time() * 1000)
query_string = f"timestamp={timestamp}"
signature = hmac.new(
secret_key.encode('utf-8'),
query_string.encode('utf-8'),
hashlib.sha256
).hexdigest()
headers = {
"clientType": "web",
"X-MBX-APIKEY": api_key
}
url = f"{base_url}{endpoint}?{query_string}&signature={signature}"
response = requests.get(url, headers=headers)
if response.status_code == 200:
return response.json()
else:
print("Error:", response.status_code, response.text)
return None
После получения данных формируется URL подключения:
Мы используем библиотеку websocket-client, чтобы установить соединение и получать события в реальном времени из P2P-чата.
chatWssUrl = res_detail['data']['chatWssUrl']
listenKey = res_detail['data']['listenKey']
listenToken = res_detail['data']['listenToken']
chat_wss_url = f"{chatWssUrl}/{listenKey}?token={listenToken}&clientType=web"
🔌 Установка WebSocket-соединения
def connect_to_websocket():
global reconnect_attempts, ws
reconnect_attempts = 0
ws = websocket.WebSocketApp(
chat_wss_url,
on_open=on_open,
on_message=on_message,
on_error=on_error,
on_close=on_close
)
ws.run_forever()
on_open — подключение установлено
on_message — пришло сообщение
on_error — ошибка соединения
on_close — закрытие соединения и автоматический reconnect
Когда приходит нужный момент (например, после перевода средств продавцу), вызывается функция:
def send_message(content, order_no):
if ws_connection:
# ============================================================
# 💖 Donation Notice
#
# English:
# ⚠️ Full functionality is available only after making a donation.
# After your donation, provide the transaction hash and we will unlock the feature for you.
#
# Spanish:
# ⚠️ La funcionalidad completa está disponible solo después de realizar una donación.
# Después de tu donación, proporciona el hash de la transacción y desbloquearemos la función.
# ============================================================
try:
ws_connection.send(json.dumps(response_message))
print(f"Message sent to chat: {content}")
log.logging(f"Message sent payload: {json.dumps(response_message)}")
except Exception as e:
log.logging(f"Message sending error: {str(e)}")
Пример вызова:
send_message("Здравствуйте, деньги переведены. Пожалуйста, отпустите крипту.", "789456123ABCDEF")
Полный код реализации:
import uuid
import websocket
import time
import hmac
import hashlib
import requests
import json
# You Api Key on binance
api_key = "11111"
# You Apy Secret on binance
secret_key = "11111"
def retrieveChatCredential():
base_url = "https://api.binance.com"
endpoint = "/sapi/v1/c2c/chat/retrieveChatCredential"
timestamp = int(time.time() * 1000)
query_string = f"timestamp={timestamp}"
signature = hmac.new(
secret_key.encode('utf-8'),
query_string.encode('utf-8'),
hashlib.sha256
).hexdigest()
headers = {
"clientType": "web",
"X-MBX-APIKEY": api_key
}
url = f"{base_url}{endpoint}?{query_string}&signature={signature}"
response = requests.get(url, headers=headers)
if response.status_code == 200:
return response.json()
else:
print("Error:", response.status_code, response.text)
return None
res_detail = retrieveChatCredential()
if res_detail:
chatWssUrl = res_detail['data']['chatWssUrl']
listenKey = res_detail['data']['listenKey']
listenToken = res_detail['data']['listenToken']
chat_wss_url = f"{chatWssUrl}/{listenKey}?token={listenToken}&clientType=web"
#print("WebSocket URL:", chat_wss_url)
else:
raise Exception("Failed to obtain credentials for WebSocket.")
def generate_uuid():
return str(uuid.uuid4())
def send_message(content, order_no):
if ws_connection:
# ============================================================
# 💖 Donation Notice
#
# English:
# ⚠️ Full functionality is available only after making a donation.
# After your donation, provide the transaction hash and we will unlock the feature for you.
#
# Spanish:
# ⚠️ La funcionalidad completa está disponible solo después de realizar una donación.
# Después de tu donación, proporciona el hash de la transacción y desbloquearemos la función.
# ============================================================
try:
ws_connection.send(json.dumps(response_message))
print(f"Message sent to chat: {content} for orderNo: {order_no} ")
except Exception as e:
print(f"Message sent error: {str(e)}")
def on_open(ws):
global ws_connection
ws_connection = ws
print("WebSocket connection established for Chat")
def on_message(ws, message):
try:
parsed_message = json.loads(message)
print(f"parsed_message: {parsed_message}")
except json.JSONDecodeError:
print("Error JSON:", message)
def on_error(ws, error):
print("Error WebSocket:", error)
def on_close(ws, close_status_code, close_msg):
global reconnect_attempts
print("WebSocket connection closed.", close_msg)
if reconnect_attempts < 5:
reconnect_attempts += 1
print(f"Attempting to reconnect ({reconnect_attempts})...")
time.sleep(5)
connect_to_websocket()
else:
print("The maximum number of reconnection attempts has been reached.")
reconnect_attempts = 0
ws_connection = None
def connect_to_websocket():
global reconnect_attempts, ws
reconnect_attempts = 0
ws = websocket.WebSocketApp(
chat_wss_url,
on_open=on_open,
on_message=on_message,
on_error=on_error,
on_close=on_close
)
ws.run_forever()
connect_to_websocket()
📈 Ускорение сделок — продавец быстрее получит уведомление.
🔒 Безопасность — меньше ручных действий, меньше ошибок.
⏱ Экономия времени — особенно при большом объёме сделок.
🧠 Интеграция с ботами — логика может быть встроена в вашего P2P-бота.
Такая автоматизация особенно полезна при масштабных операциях или если вы работаете с несколькими ордерами. Бот может моментально уведомить продавца, что оплата отправлена, и сократить общее время завершения сделки.
У нас есть готовый продукт — P2Pay Binance Bot, в котором уже реализован необходимый функционал. Этот бот автоматически отслеживает статусы заказов, выполняет выплаты продавцам криптовалюты на банковские счета (карты) согласно условиям ордера и одновременно отправляет уведомления и сообщения в чат.
Таким образом, P2Pay Binance Bot полностью автоматизирует процесс обработки сделок и коммуникацию с участниками, обеспечивая удобство и безопасность.
Автоматизация P2P-чата Binance с помощью Python и WebSocket — это инструмент для разработчиков, создающих ботов или автоматизирующих торговые процессы. Получив chatWssUrl и listenToken, вы можете подключаться к чату, слушать события и отправлять сообщения, уведомляя контрагентов о переводах.