tradeogre-order-monitoring/tomonitor.py

130 lines
4.1 KiB
Python

#!/usr/bin/python3
# SPDX-License-Identifier: BSD-3-Clause
# Copyright (c) 2020, The Monero Project.
# Copyright (c) 2020, dsc@xmr.pm
"""
Usage:
1) copy the 2 cookies from browser into this script
2) install virtualenv, install `aiohttp`
- `virtualenv -p /usr/bin/python3 venv && source venv/bin/activate && pip install aiohttp`
3) will write .txt files to disk
"""
from datetime import datetime
from typing import Callable, List
import asyncio
import json
import aiohttp
COOKIE_CF_CLEARANCE = "bcea6d51759ffbadc0462b1af1bfcba8a66d9c22-1622477379-0-150"
COOKIE_JWT = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOjYyOTMyLCJleHAiOjE2MjI0MTYzNTUsInByaXYiOjB9.w4IoPla-iK4qhg-90BeMCoh6kMnpDRDBDBebYv159SY"
class C:
OK = '\033[92m'
WARN = '\033[93m'
FAIL = '\033[91m'
ENDC = '\033[0m'
now = lambda: datetime.now().strftime('%Y-%m-%d %H:%M:%S')
msg = lambda _m, ok=True: print(f"[{now()}] {C.WARN if ok else C.FAIL}[+] {_m}{C.ENDC}")
msg_trade = lambda _m, sell=True: print(f"[{now()}] {C.FAIL if sell else C.OK}{'⬇️' if sell else '⬆️'} {_m}{C.ENDC}")
timeout = aiohttp.ClientTimeout(total=2)
class TradeOgreMarkets:
async def trading_pairs(self) -> List[str]:
msg("fetching available markets")
async with aiohttp.ClientSession(cookies={
"cf_clearance": COOKIE_CF_CLEARANCE,
"jwt": COOKIE_JWT
}, timeout=timeout) as client:
async with client.get('https://tradeogre.com/api/v1/markets') as resp:
body = await resp.text()
pairs = [list(z.keys())[0] for z in json.loads(body)]
msg(f"{len(pairs)} market pairs found")
return pairs
class TradeOgreWS:
def __init__(self, symbol, host: str = "tradeogre.com", port: int = 8443):
self.host = host
self.port = port
self.symbol = symbol
self.ses = aiohttp.ClientSession(timeout=timeout)
self.f = open(f"data/{symbol}.txt", "wb")
self._ws = None
self._ws_connect_date = None
self._loop_task: Callable = None
async def connect(self):
msg(f"Connecting to BTC-{self.symbol} websocket endpoint")
try:
self._ws = await self.ses.ws_connect(f"wss://{self.host}:{self.port}")
self._ws_connect_date = datetime.now()
except Exception as ex:
msg(f"{ex.__class__.__name__} - {ex}", ok=False)
exit()
msg_hello = {"a": "auth", "cookie": f"jwt={COOKIE_JWT}"}
msg_data = {"a": "submarket", "name": f"BTC-{self.symbol}"}
await self._ws.send_bytes(json.dumps(msg_hello).encode())
await self._ws.send_bytes(json.dumps(msg_data).encode())
self._loop_task = asyncio.create_task(self.loop())
async def loop(self):
while True:
buffer = await self._ws.receive()
blob = json.loads(buffer.data)
if blob['a'] != 'sub':
continue
sell = blob['t'] == "sell"
data = blob['d']
price = list(data.keys())[0]
amount = list(data.values())[0]
_msg = f"{'SELL' if sell else 'BUY'} {amount} {self.symbol} at a price of {price} BTC"
self.f.write(f"[{now()}] {_msg}\n".encode())
self.f.flush()
msg_trade(_msg, sell=sell)
# is it time to renew the connection?
if(datetime.now() - self._ws_connect_date).total_seconds() > 3600: # hour
msg(f"renewing the websocket connection for {self.symbol}")
await self._ws.close()
await self.connect()
break
async def main():
# uncomment the following lines to track all trading pairs
# markets = TradeOgreMarkets()
# trading_pairs = await markets.trading_pairs()
# hardcode some trading pairs for now
trading_pairs = ["BTC-WOW", "BTC-XMR"]
for t in trading_pairs:
symbol = t.split("-", 1)[1]
t = TradeOgreWS(symbol=symbol)
await t.connect()
# hack to keep the script running
while True:
await asyncio.sleep(1)
loop = asyncio.get_event_loop()
loop.run_until_complete(main())