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.