Скрипт для подключения к торговой платформе

Данный скрипт написан на языке программирования python и представляет собой набор действий для подключения к серверу входа. Сервер входа предоставляет адрес (IP-адрес и порт) для подключения к шлюзу торговой платформы.

Пример скрипта для подключения к торговой платформе

#!/usr/bin/python
# -*- coding: utf-8 -*-

import binascii
import socket
import struct
import sys
import time

# 1. Подключение к сервису входа на Т-полигоне
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('194.247.145.35', 7001)
sock.connect(server_address)
sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)

# 2. Отправка сообщения Hello
values = (32, 1, 0, 'YOUR_LOGIN', 'YOUR_PASSWORD') # h.size, h.msgid, h.seq, login, password
packer = struct.Struct('=hhq 16s16s')
packed_data = packer.pack(*values)

print >>sys.stderr, 'sending %d bytes "%s"' % (len(packed_data), binascii.hexlify(packed_data))
sock.send(packed_data)

# 3. Получение ответа Report
fmt_frame = struct.Struct('=hhq')    # заголовок
fmt_data = struct.Struct('=h 128s')  # тело
fmt_list = struct.Struct('=hh')      # список
fmt_addr = struct.Struct('=hbb 48s') # элемент списка

print >>sys.stderr, 'wait for %d bytes' % fmt_frame.size
data = sock.recv(fmt_frame.size) # получение заголовка ответа
(size,msgid,seq) = fmt_frame.unpack(data)
data = sock.recv(size) # получение тела сообщения со списком

print >>sys.stderr, 'received: %d bytes "%s"' % (len(data), binascii.hexlify(data)) 

(status, text) = fmt_data.unpack(data[:fmt_data.size])
if status != 0:
  print >>sys.stderr, "Reject: %s" % text
  exit(1)
  
data = data[fmt_data.size:]

# 4. Обработка списка адресов шлюзов
(offset, count) = fmt_list.unpack(data[:fmt_list.size])
data = data[offset:]
Types = {'Transaction': 0x1, 'DropCopy': 0x2, 'Risk': 0x4,        # виды шлюзов
         'Dictionary': 0x8, 'MarketData': 0x10, 'Backup': 0x4000}
for i in range(count):
  (type, ver, pad0, address) = fmt_addr.unpack(data[:fmt_addr.size])
  data = data[fmt_addr.size:]
  names = [t for t in Types if type&Types[t]]
  version = 'version 0.'+str(ver) if ver else 'default version'
  print '%s(%s) is %s' % (",".join(names), version, address)
  
# 5. Завершение
sock.close()