2015-12-26 16 views
5

Push API of Poloniexに接続したいと思います。彼らのページでは、次のように書いています:PoloniexプッシュAPIに接続

プッシュAPIを使用するには、wss://api.poloniex.comに接続し、希望するフィードを購読します。

WSS = WebSocketを固定します - > SSL

を保護された彼らはまたのNode.jsとアウトバーンのための例を与える| JS:

var autobahn = require('autobahn'); 
var wsuri = "wss://api.poloniex.com"; 
var connection = new autobahn.Connection({ 
    url: wsuri, 
    realm: "realm1" 
}); 

connection.onopen = function (session) { 
     function marketEvent (args,kwargs) { 
       console.log(args); 
     } 
     function tickerEvent (args,kwargs) { 
       console.log(args); 
     } 
     function trollboxEvent (args,kwargs) { 
       console.log(args); 
     } 
     session.subscribe('BTC_XMR', marketEvent); 
     session.subscribe('ticker', tickerEvent); 
     session.subscribe('trollbox', trollboxEvent); 
} 

connection.onclose = function() { 
    console.log("Websocket connection closed"); 
} 

connection.open(); 

しかし、私はJavaScriptを使用したくありません代わりに、私はC++を使用します。 Autobahn|CPPと呼ばれるC++用のAutobahn-Libraryもあります。

#include <autobahn/autobahn.hpp> 
#include <boost/asio.hpp> 
#include <iostream> 
#include <memory> 
#include <tuple> 

void topic1(const autobahn::wamp_event& event) 
{ 
    std::cerr << "received event: " << event.argument<uint64_t>(0) << std::endl; 
} 
using namespace boost; 
using namespace boost::asio; 
using namespace boost::asio::ip; 
int main() 
{ 
    try { 

     boost::asio::io_service io; 
     boost::asio::ip::tcp::socket socket(io); 

     bool debug = true; 
     auto session = std::make_shared< 
       autobahn::wamp_session<boost::asio::ip::tcp::socket, 
       boost::asio::ip::tcp::socket>>(io, socket, socket, debug); 

     boost::future<void> start_future; 
     boost::future<void> join_future; 

     boost::asio::ip::tcp::endpoint rawsocket_endpoint(boost::asio::ip::address::from_string("173.236.42.218"), 443/*8000=standard*/); 


     socket.async_connect(rawsocket_endpoint, 
      [&](boost::system::error_code ec) { 
       if (!ec) { 
        std::cerr << "connected to server" << std::endl; 

        start_future = session->start().then([&](boost::future<bool> started) { 
         if (started.get()) { 
          std::cerr << "session started" << std::endl; 
          join_future = session->join("realm1").then([&](boost::future<uint64_t> s) { 
           std::cerr << "joined realm: " << s.get() << std::endl; 
           session->subscribe("ticker", &topic1); 
          }); 
         } else { 
          std::cerr << "failed to start session" << std::endl; 
          io.stop(); 
         } 
        }); 
       } else { 
        std::cerr << "connect failed: " << ec.message() << std::endl; 
        io.stop(); 
       } 
      } 
     ); 

     std::cerr << "starting io service" << std::endl; 
     io.run(); 
     std::cerr << "stopped io service" << std::endl; 
    } 
    catch (std::exception& e) { 
     std::cerr << e.what() << std::endl; 
     return 1; 
    } 

    return 0; 
} 

がここで説明するいくつかのことがあります: 私が見つけたIP-住所173.236私は(ちょうどアドレスとポートをハードコード基本的には)それをインストールし、少しの変更で自分のsubscriber example codeを実行しようとしました.42.218に単純にpingすると、api.poloniex.comが表示されます。

ポート443は標準SSLポートです。私は標準のWAMP/WebSocketポート8000​​を使用しようとしましたが、サーバーはそれを受け入れません。 80は受け入れられません。

だから私はプログラムを起動した場合、出力は以下の通りです:

が次にサーバー

に接続IOサービスを開始、何も起こりません。だから、コードは、あなたが私の意見ではライン80

wamp_session.ippに見たとき、あなたが見ることができるものWSハンドシェイクが行われのsession_start()、で立ち往生しなければならない問題は、APIを使用したいということです安全な接続(ws s://)。このコードはSSLで暗号化された接続を作成しようとしないので、安全なものが必要であることをセッションに伝える方法はわかりません。

編集は:this questionで著者は、アウトバーンがのhttpリクエストがのWebSocketプロトコルを使用する前に、最初に必要とされるアップグレードし混合HTTP/WAMPサーバを扱うことができないと言います。私はPoloniexがこのような混合型を使用していることを知っていますが、私はAutobahnでAPIにアクセスしようとしました。 JSすでに正常に動作しており、アップグレード要求も送信されます。だから、これはオートバンです。 CPPに問題がありますか?

編集2:上記の場合、Http-Update-Requestを自分で送信して、接続にSSL暗号化を設定することも可能ですか?多分それがライブラリを妨害するかもしれないので、わからない。

答えて

7

いいえ、いいえ、いいえ、このは遅い応答です。遅かれ早かれ、私はそれがあなたのためのもう少し直接的な解決策かもしれないと信じていますBobface(そしてこれと苦労した他の人たち)。競合他社が使用する可能性があるので、私はこれを躊躇しています。しかし、競争のない人生は何ですか?ボーリング、それは何ですか。そして、誰かが私の前に来て、これを投稿してくれたらいいと思うので、ここに行く!あなたが見たいと思っている変更、右ですか?

以下、websocketppとautobahn | cppを使用してPoloniexのプッシュAPIに接続する実装が見つかります。この場合、BTC_ETHの書籍に加えられた更新を受け取ります。

これは、websocketppとautobahn | cppを利用して、WAMPプロトコル(別名wss://ip-address.com:portなど)を実装したセキュアなWebソケットサーバに接続する方法です。

乾杯!

に含まれるもの:

#include <autobahn/autobahn.hpp> 
#include <autobahn/wamp_websocketpp_websocket_transport.hpp> 
#include <websocketpp/config/asio_no_tls_client.hpp> 
#include <websocketpp/client.hpp> 
#include <boost/version.hpp> 
#include <iostream> 
#include <memory> 
#include <string> 
#include <tuple> 

コード:接続は、多くの場合、すぐに...ちょうど三時間を確立していない

typedef websocketpp::client<websocketpp::config::asio_tls_client> client; 
typedef autobahn::wamp_websocketpp_websocket_transport<websocketpp::config::asio_tls_client> websocket_transport; 

try { 
    //std::cerr << "Connecting to realm: " << parameters->realm() << std::endl; 

    boost::asio::io_service io; 
    //bool debug = parameters->debug(); 

    client ws_client; 
    ws_client.init_asio(&io); 
    ws_client.set_tls_init_handler([&](websocketpp::connection_hdl) { 
     return websocketpp::lib::make_shared<boost::asio::ssl::context>(boost::asio::ssl::context::tlsv12_client); 
    }); 
    auto transport = std::make_shared < autobahn::wamp_websocketpp_websocket_transport<websocketpp::config::asio_tls_client> >(
      ws_client, "wss://api.poloniex.com:443", true); 

    // create a WAMP session that talks WAMP-RawSocket over TCP 
    auto session = std::make_shared<autobahn::wamp_session>(io, true); 

    transport->attach(std::static_pointer_cast<autobahn::wamp_transport_handler>(session)); 

    // Make sure the continuation futures we use do not run out of scope prematurely. 
    // Since we are only using one thread here this can cause the io service to block 
    // as a future generated by a continuation will block waiting for its promise to be 
    // fulfilled when it goes out of scope. This would prevent the session from receiving 
    // responses from the router. 
    boost::future<void> connect_future; 
    boost::future<void> start_future; 
    boost::future<void> join_future; 
    boost::future<void> subscribe_future; 
    connect_future = transport->connect().then([&](boost::future<void> connected) { 
     try { 
      connected.get(); 
     } catch (const std::exception& e) { 
      std::cerr << e.what() << std::endl; 
      io.stop(); 
      return; 
     } 

     std::cerr << "transport connected" << std::endl; 

     start_future = session->start().then([&](boost::future<void> started) { 
      try { 
       started.get(); 
      } catch (const std::exception& e) { 
       std::cerr << e.what() << std::endl; 
       io.stop(); 
       return; 
      } 

      std::cerr << "session started" << std::endl; 

      join_future = session->join("realm1").then([&](boost::future<uint64_t> joined) { 
       try { 
        std::cerr << "joined realm: " << joined.get() << std::endl; 
       } catch (const std::exception& e) { 
        std::cerr << e.what() << std::endl; 
        io.stop(); 
        return; 
       } 

       subscribe_future = session->subscribe("BTC_ETH", &on_topic1).then([&] (boost::future<autobahn::wamp_subscription> subscribed) 
       { 
        try { 
         std::cerr << "subscribed to topic: " << subscribed.get().id() << std::endl; 
        } 
        catch (const std::exception& e) { 
         std::cerr << e.what() << std::endl; 
         io.stop(); 
         return; 
        } 

       }); 
      }); 
     }); 
    }); 

    std::cerr << "starting io service" << std::endl; 
    io.run(); 
    std::cerr << "stopped io service" << std::endl; 
} 
catch (std::exception& e) { 
    std::cerr << "exception: " << e.what() << std::endl; 
    ret_var.successfully_ran = false; 
    return ret_var; 
} 
+0

... – Aftershock

+0

はい、私はその最近気づきましたこの解決策(と私がノードjsとJavaで書いた他の解決策)で。もし誰かがこれに対する解決策を持っていれば(より速くなるようにpoloniexを得ることを超えて)、私に知らせてください。 – Xandrix

+0

設定を増やすことはできますか...何とかハンドシェイクの待ち時間ですか? – Aftershock

1

これはあなたの質問に対するかなり遅い応答ですが、リモートサーバーへの接続時にHTTP/Websocketのアップグレードを実行していないという問題があるようです。使用しているサンプルコードはrawsocket_endpointトランスポートで設定されています。これはHTTP WebsocketのアップグレードやWebsocketカプセル化が発生していないことを意味しています。私はあなたの問題がSSLとは関係ないと信じています。

WebSocketの接続を有効にするには、Websocketppを使用するAutobahnCPP exampleを確認してください。