Feed examples? In PHP?

Added by Henning over 7 years ago

I'm completely lost on how to tap into the feeds using PHP, or actually I don't know how to use the feeds at all.
Can anyone help me out? Share some example code?

Regards,
- Henning


Replies (23)

RE: Feed examples? In PHP? - Added by Martin over 7 years ago

Hi.

Did you get any further with this. I'm stuck, just like you, using PHP. I used your example to log in and it works great. I'm now trying to write a wrapper to simplify things. Let me know how you are doing. Maybe we can help each other out.

RE: Feed examples? In PHP? - Added by Henning over 7 years ago

Hi Martin

Thought someone actually had an example for me :(

Unfortunately I haven't figured it out yet, but I hope to do it sometime soon.
I am too trying to write a wrapper, this is what I got so far.
Please note, that it isn't very well polished.

https://gist.github.com/2182941

RE: Feed examples? In PHP? - Added by Björn over 7 years ago

Hi!

The login request returns the server adress and port number to be used for the public and private feeds. The commands and responses on the feeds are in JSON format and encrypted using SSL. I don't have much PHP experience, but it was quite easy in Java, so I expect it to be a walk in the park using PHP. Just google 'php ssl socket' or something similar, and you should be up and running in no time.

The only thing I had a problem with was that you will get absolutely no indication if you make a mistake with the JSON commands. For example if you misspell an attribute, Nordnet's servers will just ignore the command without giving you any feedback that something was wrong. So read the Wiki carefully when you implement a command! :-)

RE: Feed examples? In PHP? - Added by Martin over 7 years ago

Henning.

I like what you've done so far, it looks very promising. I'll try to expand on it and get back to you...

RE: Feed examples? In PHP? - Added by Anders over 7 years ago

Nice REST login and retrieval functions, Henning! They helped me a lot to get started.

But now's the problem of using the public trade and price feed. Does anyone how some example PHP code for connecting and retrieving data? I have no experience using SSL and sockets.

/Anders

RE: Feed examples? In PHP? - Added by Anders over 7 years ago

Är det verkligen ingen på de tre månader denna tråd legat ute som lyckats läsa en feed med PHP? Följande kodförslag falerar inte på fsockopen och inte på timeout, men ingenting hamnar i $result...

stream_set_blocking($fp, 0) eller stream_set_blocking($fp, 1) ger ingen skillnad.

public function _public_feed($session_key)
{
    $hostname  = "ssl://pub.api.test.nordnet.se";
    $port      = 443;

    $fp = fsockopen($hostname, $port, $errno, $errstr, 30);
    if (!$fp) {
        echo "$errstr ($errno)<br />\n";
    } else {
        stream_set_timeout($fp, 30);
//        stream_set_blocking($fp, 0);

        fwrite($fp, '{"cmd":"login", "args":{"session_key":"$session_key", "service":"NEXTAPI"}}');

        while (!feof($fp)) {
            echo fgets($fp, 128);     // ingenting skrivs ut, borde det det?
        }

        $info = stream_get_meta_data($fp);
        echo "<pre>";
        print_r($info);
        echo "</pre>";

// Subscribe to Nordnet B (identifier 1869) on Burgundy (marketplace 30).
        fwrite($fp, '{"cmd":"subscribe", "args":{"t":"price", "i":"1869", "m":"30"}}');

        $result = "";
        while (!feof($fp)) {
            $result .= fgets($fp, 128);
        }
        $info = stream_get_meta_data($fp);
        echo "<pre>";
        print_r($info);
        echo "</pre>";

        fclose($fp);

        return json_decode($result);

    }
}

stream_get_meta_data($fp) ger

Array
(
    [stream_type] => tcp_socket/ssl
    [mode] => r+
    [unread_bytes] => 0
    [seekable] => 
    [timed_out] => 
    [blocked] => 1
    [eof] => 1
)

Några förslag från er som faktiskt fått detta att fungera?

RE: Feed examples? In PHP? - Added by Nordnet Simon over 7 years ago

Anders wrote:

Är det verkligen ingen på de tre månader denna tråd legat ute som lyckats läsa en feed med PHP? Följande kodförslag falerar inte på fsockopen och inte på timeout, men ingenting hamnar i $result...

stream_set_blocking($fp, 0) eller stream_set_blocking($fp, 1) ger ingen skillnad.

Jag kan inte PHP och vet inte om fwrite() fixar det själv men allt du skickar in ska avslutas med newline (står https://api.test.nordnet.se/projects/api/wiki/Feed_API_documentation#Introduction).

Så man kanske måste lägga till \n sist isträngaran (återigen jag har aldrig knackat PHP men det brukar vara \n).


fwrite($fp, '{"cmd":"login", "args":{"session_key":"$session_key", "service":"NEXTAPI"}}\n');

Det är större chans att det händer något på NasdaqOMX så prova med Eric B på NasdaqOMX - "m" är en integer så det ska vara "m":11


fwrite($fp, '{"cmd":"subscribe", "args":{"t":"price", "i":"101", "m":11}}\n');

RE: Feed examples? In PHP? - Added by Anders over 7 years ago

Tack för svaret, Simon, men tyvärr gav det ingen förändring att lägga till \n. Försöker hämta ERIC nu.

Returneras något efter man skickat sin login? Vore bra att ha något att testa emot att det gått bra så långt.

RE: Feed examples? In PHP? - Added by Nordnet Simon over 7 years ago

Inget returneras direkt. Men om det är fel i login så kastas du ut direkt.

Prova och sätt upp timeouten till 120 sekunder och gör bara login och vänta på svar.

Då ska du efter ett tag (jag har för mig att det är 30 sekunder) få ett heartbeat meddelande.

RE: Feed examples? In PHP? - Added by Martin over 7 years ago

Följande kod gör så att åtminstone jag får ut handshake-meddelanden:

$fp = stream_socket_client("ssl://pub.api.test.nordnet.se:443", $errno, $errstr, 30,STREAM_CLIENT_ASYNC_CONNECT);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
}
else {
$arr = array('cmd' => "login", 'args' => array('session_key' => $session_key, 'service' => 'NEXTAPI'));
$cmd = json_encode($arr)."\n";
fwrite($fp, $cmd);
while (!feof($fp)) {
echo fgets($fp, 1024);
}
fclose($fp);
}

Längre än så har jag inte kommit. Jag vet inte hur jag ska kunna skicka fler meddelanden, eftersom den bara verkar fastna och bara lyssna efter handshakes.

RE: Feed examples? In PHP? - Added by Anders over 7 years ago

Jag testade detta, men som tidigare kastas jag ut efter 10 sekunder (timar själv i koden hur lång tid det tar). Är dessa 10 sekunder den tid ni tar på er för att kolla login? Det låter lite för långt för att vara "kastas ut direkt".

RE: Feed examples? In PHP? - Added by Martin over 7 years ago

Anders. Försök ställa upp någon timeout. Det tar säkert 20-30 sekunder innan jag får första handskakningsmeddelandet. Dessutom fungerar det olika i olika webbläsare, Safari visar ingenting (för det mesta). I Firefox funkar det bra.

RE: Feed examples? In PHP? - Added by Nordnet Simon over 7 years ago

Martin wrote:

Följande kod gör så att åtminstone jag får ut handshake-meddelanden:

$fp = stream_socket_client("ssl://pub.api.test.nordnet.se:443", $errno, $errstr, 30,STREAM_CLIENT_ASYNC_CONNECT);
if (!$fp) {
echo "$errstr ($errno)<br />

";

}
else {
$arr = array('cmd' => "login", 'args' => array('session_key' => $session_key, 'service' => 'NEXTAPI'));
$cmd = json_encode($arr)."

";

fwrite($fp, $cmd);
while (!feof($fp)) {
echo fgets($fp, 1024);
}
fclose($fp);
}

Längre än så har jag inte kommit. Jag vet inte hur jag ska kunna skicka fler meddelanden, eftersom den bara verkar fastna och bara lyssna efter handshakes.

Jag tog den koden och satte session_key. Observera att session_key måste vara giltigt dvs skapat eller använt i Rest dom senaste 300 sekunderna - annars har det expirerat.


<?php
$session_key='<key>';
$fp = stream_socket_client("ssl://pub.api.test.nordnet.se:443", $errno, $errstr, 30,STREAM_CLIENT_ASYNC_CONNECT);
if (!$fp) {
   echo "$errstr ($errno)<br />\n";
}
else {
   $arr = array('cmd' => "login", 'args' => array('session_key' => $session_key, 'service' => 'NEXTAPI'));
   $cmd = json_encode($arr)."\n";
   fwrite($fp, $cmd);
   while (!feof($fp)) {
   echo fgets($fp, 1024);
}
   fclose($fp);
}
?>


Jag sparade i en fil test.php och körde

$ php -f test.php 
{"cmd":"heartbeat","args":{}}
{"cmd":"heartbeat","args":{}}
{"cmd":"heartbeat","args":{}}
{"cmd":"heartbeat","args":{}}
{"cmd":"heartbeat","args":{}}

Jag körde under Ubuntu och det exekverar loggar in och tar emot heartbeats.

Om man tittar här: http://php.net/manual/en/function.fsockopen.php står det under hostname att openSSL måste vara installerat för att ssl: ska fungera. Från den infon finns det en länk hit http://www.php.net/manual/en/openssl.installation.php

Så kontrollera att ni har en sessionsnyckel som är nyskapad och att openSSL är installerat korrekt.

http://www.php.net/manual/en/openssl.installation.php

RE: Feed examples? In PHP? - Added by Anders over 7 years ago

Har äntligen lyckats få heartbeats och data från Eric B, men man måste stoppa det hela med någon timeout eftersom while (!feof($fp)) annars ligger och hämtar hela tiden, och webbsidan fastnar. Skönt att det gick att komma vidare!

RE: Feed examples? In PHP? - Added by Martin over 7 years ago

Vad bra! Har du lust att dela med dig hur du gör med din timeout för att få ut datat från Eric B?

RE: Feed examples? In PHP? - Added by Nordnet Simon over 7 years ago

Hej, nu vet jag inte exakt vad ni gör eftersom jag inte begriper PHP.

Men feeden är INTE tänkt för att koppla upp sig, polla priset och koppla ner. Det är en feed för att klienten ska vara uppkopplad och prenumerera på realtidsdata.

En applikation som kopplar upp sig pollar en eller flera priser och kopplar ner sig om och om igen (vid varje reload tex) kommer inte att godkännas i certifieringen.

EDIT: Stavfel

RE: Feed examples? In PHP? - Added by Anders over 7 years ago

Detta funkar iaf. Väntar på första heartbeat efter login, gör sedan en ensam fgets på kursdatan (jag behöver inte streamade data).

    $fp = stream_socket_client($hostname.":".$port, $errno, $errstr, 30, STREAM_CLIENT_ASYNC_CONNECT);
    if (!$fp) {
        echo "$errstr ($errno)<br />\n";
    } else {
        $arr = array('cmd' => "login", 'args' => array('session_key' => $session_key, 'service' => 'NEXTAPI'));
        $cmd = json_encode($arr)."\n";
        fwrite($fp, $cmd);
        stream_set_timeout($fp, 120);

        while (!feof($fp)) {
            if ($result = fgets($fp, 1024))        {break;}
        }

// Subscribe to ERIC B (identifier 101) on NasdaqOMX (marketplace 11).
        $arr = array('cmd' => 'subscribe', 'args' => array('t' => 'price', 'i' => '101', 'm' => 11));
        $cmd = json_encode($arr)."\n";
        fwrite($fp, $cmd);
        stream_set_timeout($fp, 30);

        $result = fgets($fp, 1024);

        fclose($fp);

        return json_decode($result);

    }

RE: Feed examples? In PHP? - Added by Anders over 7 years ago

Simon wrote:

Hej, nu vet jag inte exakt vad ni gör eftersom jag inte begriper PHP.

Men feeden är INTE tänkt för att koppla upp sig, polla priset och koppla ner. Det är en feed för att klienten ska vara uppkopplad och prenumerera på realtidsdata.

En applikation som kopplar upp sig pollar en eller flera priser och kopplar ner sig om och om igen (vid varje reload tex) kommer inte att godkännas i certifieringen.

Men finns det något annat sätt att bara hämta realtidsdata vid ett givet tillfälle? Om applikationen ska ge möjlighet att skicka köporder m.m. så vill man ju veta vad (realtids)kursen är vid det tillfället. Så som det väl funkar i er egen webbapplikation. Den möjligheten finns ju inte i REST så man måste väl använda feeden?

RE: Feed examples? In PHP? - Added by Nordnet Simon over 7 years ago

Anders wrote:

Simon wrote:

Hej, nu vet jag inte exakt vad ni gör eftersom jag inte begriper PHP.

Men feeden är INTE tänkt för att koppla upp sig, polla priset och koppla ner. Det är en feed för att klienten ska vara uppkopplad och prenumerera på realtidsdata.

En applikation som kopplar upp sig pollar en eller flera priser och kopplar ner sig om och om igen (vid varje reload tex) kommer inte att godkännas i certifieringen.

Men finns det något annat sätt att bara hämta realtidsdata vid ett givet tillfälle? Om applikationen ska ge möjlighet att skicka köporder m.m. så vill man ju veta vad (realtids)kursen är vid det tillfället. Så som det väl funkar i er egen webbapplikation. Den möjligheten finns ju inte i REST så man måste väl använda feeden?

Nej, men API:t är inte tänkt för att användas till statiska applikationer (tex webben - det finns ju redan en web som är gratis för Nordnet-kunder). Det är tänkt att för att användas för applikationer som antingen visar realtidsdata för användaren (tradingapplikationer) eller använder realtidsdata för att ta beslut. Ska man bygga en web-applikation så är inte nExt API inte optimalt.

En feed kan ha 0 eller flera prenumerationer samtidigt så om ni har en process om ligger uppkopplad mot feeden så kan ni starta/stoppa prenumerationer hur mycket som helst för att vid givna tillfällen visa korrekt data för användaren.

RE: Feed examples? In PHP? - Added by Anders over 7 years ago

Jag avser att skapa en beslutsapplikation, men den kommer inte behöva streamade realtidsdata. Det räcker med att hämta kurser för ett fåtal instrument kanske var femte minut, och ska kunna göra köp och sälj automatiskt när vissa premisser gäller. Jag analyserar inte realtidsdatan i detalj, utan det handlar om teknisk analys.

Om detta inte är något ni vill certifiera för feederna, så kanske jag kan få certifiering med endast REST?

RE: Feed examples? In PHP? - Added by Anders over 7 years ago

Det jag behöver finns förresten i chart_data, men tyvärr är den ju inte tillgänglig i test. Kan ni inte öppna detta i test också?

RE: Feed examples? In PHP? - Added by Nordnet Simon over 7 years ago

Anders wrote:

Jag avser att skapa en beslutsapplikation, men den kommer inte behöva streamade realtidsdata. Det räcker med att hämta kurser för ett fåtal instrument kanske var femte minut, och ska kunna göra köp och sälj automatiskt när vissa premisser gäller. Jag analyserar inte realtidsdatan i detalj, utan det handlar om teknisk analys.

Om detta inte är något ni vill certifiera för feederna, så kanske jag kan få certifiering med endast REST?

Absolut - det går bra vi har inga krav på att allt ska hanteras.

Det jag behöver finns förresten i chart_data, men tyvärr är den ju inte tillgänglig i test. Kan ni inte öppna detta i test också?

Tyvärr kan vi inte ordna det i test för tillfället. Men vi vet att det inte går att utveckla mot chart_data i test så om resten av applikationen certifieras så får du testa dom delarna mot produktion.

RE: Feed examples? In PHP? - Added by Anders over 7 years ago

Låter bra, tack!

(1-23/23)