Es braucht nicht mehr als ein paar Zeilen Code in python, um sich seinen eigenen autobuy Bot for den Marktplatz von Hashnest zu erstellen. Zwei dazu notwendige Scripte seien hier vorgestellt. Alle Angaben ohne Gewähr und Anwendung auf eigenes Risiko!

hashnest.py – ein kleines Script, um Zugriff auf Hashnest zu bekommen (erfolgreiche api-key Erstellung vorausgesetzt)

from urllib import urlencode
import urllib2
import time
import hashlib
import hmac
import base64
import json
import os
class hashnest_connector:
DATADIR=os.path.dirname(os.path.abspath(__file__))
LOGFILE='hashnestapilog.txt'
CONNECTION_RETRY=30000
#BASEURL='https://104.20.5.196/api/'
BASEURL='https://www.hashnest.com/api/'
APIVERSION='v1'
URL=BASEURL+APIVERSION+'/'
URL_ACCOUNT='account'
URL_BALANCE='currency_accounts'
URL_HASHRATE='hash_accounts'
URL_ORDERS='orders/active'
URL_HISTORY='orders/history'
URL_CREATE_ORDER='orders'
URL_DELETE_ORDER='orders/revoke'
URL_DELETE_ALL_ORDERS='orders/quick_revoke'
URL_OPENED_MARKETS='currency_markets'
URL_CURRENCY_ORDERS='currency_markets/orders'
URL_CURRENCY_TRADES='currency_markets/order_history'
SELL='sale'
BUY='purchase'
def __init__(self,username,key,secret):
self.username=username
self.key=key
self.secret=secret
def printlog(self, nonce,url,r,data):
try:
f = open(self.DATADIR+self.LOGFILE, 'a')
f.write('['+str(nonce)+',"'+str(url)+'",'+str(r)+',"'+data+'"]'+"\n")
f.close()
except Exception,e:
print "ERROR: can't write log file :" + str(Exception) + '---' + str(e)
def get_nonce(self):
self.nonce= int(time.time()*100000);
return self.nonce;
def check_result(self,result):
pass
def perform_private(self,url,req={}):
#time.sleep(1)
nonce= self.get_nonce()
message = str(nonce) + self.username + self.key
req['access_key']=self.key
req['nonce']=nonce
req['signature']= hmac.new( self.secret, msg=message, digestmod=hashlib.sha256).hexdigest()
data = urlencode(req)
headers = {'User-Agent':'ApeGoxApi'}
url=self.URL+url
for i in range(0,self.CONNECTION_RETRY):
try:
req = urllib2.Request(url, data, headers)
res = urllib2.urlopen(req,data)
r=res.read()
self.printlog(nonce,url,r,data)
return json.loads(r)
except Exception,e:
self.printlog(nonce,url,str(e),data)
print 'ERROR:' +str(i+1)+'/'+str(self.CONNECTION_RETRY)+':' + str(Exception) + '---' + str(e)+"\n"+url+"\n"+data
time.sleep(10)
def get_account_info(self):
return self.perform_private(self.URL_ACCOUNT);
def get_account_balance(self):
return self.perform_private(self.URL_BALANCE)
def get_account_hashrate(self):
return self.perform_private(self.URL_HASHRATE)
def get_orders(self,cmi):
param={'currency_market_id':cmi}
return self.perform_private(self.URL_ORDERS,param)
def get_history(self,cmi,page=None,page_amount=None):
param={'currency_market_id':cmi}
if page is not None:param['page']=page
if page_amount is not None:param['page_per_amount']=page_amount
return self.perform_private(self.URL_HISTORY,param)
def create_order(self,cmi,amount,ppc,category):
param={'currency_market_id':cmi}
param['amount']=amount
param['ppc']=ppc
param['category']=category
return self.perform_private(self.URL_CREATE_ORDER,param)
def delete_order(self,order_id):
param={'order_id':order_id}
return self.perform_private(self.URL_DELETE_ORDER,param)
def delete_all_orders(self,cmi):
param={'currency_market_id':cmi}
return self.perform_private(self.URL_DELETE_ALL_ORDERS,param)
def get_opened_markets(self):
return self.perform_private(self.URL_OPENED_MARKETS)
def get_currency_orders(self,cmi,category='sale'):
param={'currency_market_id':cmi}
param['category']=category
return self.perform_private(self.URL_CURRENCY_ORDERS,param)
def get_currency_trades(self,cmi):
param={'currency_market_id':cmi}
param['page_per_amount']=100
return self.perform_private(self.URL_CURRENCY_TRADES,param)

hashnest_autobuy.py – das eigentlich Script, dass man regelmäßig aufrufen muss, um GHS nachzukaufen!

############ SETTINGS #############
USERNAME='Registrierter Username bei Hashnest'
KEY='Api-Key'
SECRET='Api-Secret'

#MARKET=19 #AntS5
#MARKET=20 #AntS7
MARKET=21 #AntS9
#MARKET=18 #AntS4
#MARKET=15 #AntS3
BUY_PRICE=0.00008
#########################
import math
from hashnest import hashnest_connector #SOURCE https://steal1982.altervista.org/hashnest.php
def get_hashbal(bal,code):
for b in bal:
if b['currency']['code']==code:
return b
con=hashnest_connector(USERNAME,KEY,SECRET)
balance=con.get_account_balance()
btc=float(get_hashbal(balance,'btc')['amount'])
qty=math.floor(btc/BUY_PRICE)
if qty>0:
print con.create_order(MARKET,qty,BUY_PRICE,'purchase')

Update 27.12.2017

Aufgrund der zahlreichen Nachfragen nachfolgend eine beispielhafte Anleitung, wie man die Scripte auf einem Raspberry Pi installiert und einsetzt. Vorausgesetzt wird ein installiertes python und ein registrierter Hashnest Account nebst API-Key. Die Scrippte laufen natürlich auf auf der Shell anderer Linux-Systeme.

Im Homeverzeichnis vom Benutzer Pi ein Ordner anlegen.

mkdir hashnest

Da hinein kopiert man die beiden Scripte hashnest.py und hashnest_autobuyer.py. Im letzteren müssen folgende Werte angepasst werden: Username, Key und Secret, sowie der Höchstpreis, den man bereit ist zu zahlen. Alle Orders werden als Market Orders ausgeführt, d.h. das Script versucht, für alles Guthaben soviele GH/s zu kaufen, wie es für den gewünschten Preis bekommen kann (Preis in BTC). Auf welchem Markt man kaufen will, wird durch das Auskommentieren der Markt-ID bewerksteligt. Nachfolgend soll S9-Hashpower gekauft werden. Die Markt-ID dafür lautet 21 und stammt aus der URL des Marktes auf der Website: https://www.hashnest.com/hash_currencies/27/trade_markets/21. Vielleicht findest sich eine genauere Beschreibung irgendwo in der API-Dokumentation – ich konnte keine finden, bzw, vermute, dass sie nicht gut gepflegt wird, bzw ohnehin nur in Chinesisch vorliegt. Bei der Menge von Bots, die auf dem Marktplatz offensichtlich aktiv sind, gehe ich aber davon aus, das die API hochfrequentiert ist.

USERNAME='Benutzername'
KEY='Api-Key'
SECRET='Api-Secret'

#MARKET=19 #AntS5
#MARKET=20 #AntS7
MARKET=21 #AntS9
#MARKET=18 #AntS4
#MARKET=15 #AntS3
BUY_PRICE=0.00008

Jetzt muss man nur noch für eine regelmäßige Ausführung des Scripts sorgen, aber wer Guthaben in der Hashnest Wallet hat, kann durch Aufruf von

python /home/pi/hashnest/hashnest_autobuyer.py

auf der Shell das Script schon mal testen. Es dauert einen Moment und liefert bei Erfolg KEINE Ausgabe auf der Konsole. In /hashnest/log findet sich ein Logfile mit Details jeden Aufrufes.

Das trägt man jetzt – sagen wir mal 10-minütigen Aufruf – in die Crontab ein.

crontab -e

öffnet den bevorzugten Editor und dort macht man einen Eintrag wie

*/10 * * * * python /home/pi/hashnest/hashnest_autobuyer.py

Die Scripte legen temporär einen Delta-Wert (Zeitdifferenz) ab und manchmal bleibt eine .pyc-Datei vom python-Aufruf stehen. Bei mir sorgte das regelmäßig für Ärger. Daher habe ich die ebenfalls nach jeder Ausführung gelöscht! Der Eintrag sieht dann so in der Crontab aus:

*/10 * * * * python /home/pi/hashnest/hashnest_autobuyer.py ; rm /home/pi/hashnest/hashnest.pyc ; rm /home/pi/hashnest/temp/delta.dat

Wie immer bei Crontab-Einträgen drauf achten, dass die Zeile durch ein Return abgeschlossen wird. Um das sicherzustellen hat sich eine “#”in der nachfolgenden Zeile bewährt.