Exempel

Added by Patrik almost 4 years ago

Hej,
har fått Python exemplet att fungera, undrar om någon med vana skulle kunna lägga upp ett kod exempel hur man kan se information om sitt egna konto, typ hur mycket pengar man har på det. Har aldrig jobbat med http requests på det sättet innnan.

MvH
Patrik


Replies (4)

RE: Exempel - Added by Patrik almost 4 years ago

Har försökt subscriba till en feed men får bara tomma svar tillbaks. Kan någon säga vad jag missat.

import time
import base64
from M2Crypto import RSA
import httplib, urllib
import json
import socket, ssl, pprint

def print_json(j,prefix=''):
for key, value in j.items():
if isinstance (value,dict):
print '%s%s' % (prefix,key)
print_json(value, prefix+' ')
else:
print '%s%s:%s' % (prefix,key,value)

username = '********'
password = '*********'
service = 'NEXTAPI'
URL='api.test.nordnet.se'
API_VERSION='2'

timestamp = int(round(time.time()*1000))
timestamp = str(timestamp)
buf = base64.b64encode(username)+':'+base64.b64encode(password)+':'+base64.b64encode(timestamp)
rsa=RSA.load_pub_key('NEXTAPI_TEST_public.pem')
encrypted_hash = rsa.public_encrypt(buf, RSA.pkcs1_padding)
hash = base64.b64encode(encrypted_hash)

headers = {"Accept": "application/json"}
conn = httplib.HTTPSConnection(URL)

  1. GET server status
    conn.request('GET','/next/'+API_VERSION + '/', '', headers)
    r=conn.getresponse()
    response=r.read()
    j = json.loads(response)
    print_json(j)
  1. POST login
    params = urllib.urlencode({'service': 'NEXTAPI', 'auth': hash})
    conn.request('POST','/next/'+API_VERSION+'/login',params,headers)
    r=conn.getresponse()
    response=r.read()
    j = json.loads(response)
    print_json(j)

#Create SSL-wrapped socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssl_socket = ssl.wrap_socket(s)
#Connect to socket
ssl_socket.connect(("pub.api.test.nordnet.se", 443))
print repr(ssl_socket.getpeername)
print ssl_socket.cipher()
#Send session key
cmd = {"cmd":"login", "args":{"session_key":buf, "service":"NEXTAPI"}}
num_bytes = ssl_socket.write(json.dumps(cmd) + "\n")
print "Session key sent (%d bytes)" % num_bytes
#Get account information

#Subscribe to a stock
market = 11
instrument = "101"
cmd = {"cmd":"subscribe", "args":{"t":"price", "m":market, "i":instrument}}
num_bytes = ssl_socket.send(json.dumps(cmd) + "\n")
print "Subscription request sent for market = %d and instrument = %s (%d bytes)" % (market, instrument, num_bytes)
#Read stream
print "Reading stream"
for i in range(10):
output = ssl_socket.read(1024)
print (output)
time.sleep(1)
#print ("-")
#output = ssl_socket.recv()
#print output

#print "Closing socket connection..."
del ssl_socket
s.close()

RE: Exempel - Added by Björn almost 4 years ago

Det ser ut som att du skickar ett felaktigt login-meddelande på feeden.
Wikin säger följande:
"session_key" The session key from the HTTP login
Med det menas att du ska skicka "session_key" från svaret från HTTP login.

RE: Exempel - Added by Patrik over 3 years ago

Hej Björn,
Tack för hjälpen! Nu har jag fått subscribtion att funka och kan följa aktier. Har dock lite problem att förstå vad skillnaden mellan Public och Private Feed är samt. När jag försöker få information från den publica feeden så får jag bara tomma rader. Missar antagligen ngt uppenbart...

Koden jag använder ser ut så här.

public_cmd = {"cmd": "subscribe", "args": {"session_key": session_key}}
num_bytes = ssl_socket.send(json.dumps(public_cmd) + "\n")
print "Trying to log into public feed."
while(True):
public_output = ssl_socket.read()
print public_output

RE: Exempel - Added by Lars over 3 years ago

På Private Feed loggar du in och sedan bara lyssnar, där kommer uppdateringar angående order och avslut på dina egna konton. På Public Feed loggar du först in och sedan prenumererar på prisdata, orderdjup, avslut etc för utvalda instrument, där data avser marknaden som helhet.

{"cmd": "subscribe", "args": {"session_key": session_key}}

Detta ser ut som en sammanblandning av kommandon och argument, "session_key"-argumentet hör ihop med login-kommandot. "subscribe"-kommandot ska ha argument av typen: "args":{"t":"price", "i":"1869", "m":30} Ta en titt till på dokumentationen så klarnar det nog.

(1-4/4)