MtGox API 和 websocketpp

Posted

技术标签:

【中文标题】MtGox API 和 websocketpp【英文标题】:MtGox API and websocketpp 【发布时间】:2013-11-18 19:19:39 【问题描述】:

我无法通过名为 websocketpp 的 WebSockets C++ 库从 MtGox API 获取信息:

#include <websocketpp/config/asio_no_tls_client.hpp>
#include <websocketpp/client.hpp>

#include <iostream>

typedef websocketpp::client<websocketpp::config::asio_client> client;

using websocketpp::lib::placeholders::_1;
using websocketpp::lib::placeholders::_2;
using websocketpp::lib::bind;

typedef websocketpp::config::asio_client::message_type::ptr message_ptr;

void on_open(websocketpp::connection_hdl hdl)

    std::cout << "on_open \n";


void on_close(websocketpp::connection_hdl hdl)

    std::cout << "on_close \n";


void on_message(client* c, websocketpp::connection_hdl hdl, message_ptr msg)

    std::cout << msg->get_payload() << '\n';


int main()

    client c;

    try
    
        c.init_asio();

        c.set_open_handler(on_open);
        c.set_close_handler(on_close);
        c.set_message_handler(bind(&on_message, &c, ::_1, ::_2));

        websocketpp::lib::error_code ec;
        client::connection_ptr con = c.get_connection("ws://websocket.mtgox.com:80/mtgox?Currency=EUR", ec);
        c.connect(con);

        c.run();
    
    catch (const std::exception& e)
    
        std::cout << e.what() << std::endl;
    
    catch (websocketpp::lib::error_code e)
    
        std::cout << e.message() << std::endl;
    
    catch (...)
    
        std::cout << "other exception" << std::endl;
    

输出

[2013-11-18 23:10:10] [connect] 连接成功

[2013-11-18 23:10:14] [错误] 服务器握手响应无效:HTTP 状态无效。

[2013-11-18 23:10:14] [断开连接] 失败:HTTP 状态无效。

在调试器中我看到“403 禁止”错误,但我可以通过http://www.websocket.org/echo.html 等服务使用它。

我已经尝试使用“ws://socketio.mtgox.com:80/mtgox?Currency=EUR”,但收到以下错误:

[2013-11-18 23:18:07] [connect] 连接成功

[2013-11-18 23:18:08] [error] handle_read_http_response 中的错误:文件结束

[2013-11-18 23:18:08] [断开连接] 失败:文件结束

这段代码有什么问题?

【问题讨论】:

【参考方案1】:

MtGox 似乎在进行来源过滤。基于浏览器的 WebSocket 连接将自动发送一个原始标头,其中包含运行脚本的域的值。由于这主要是针对运行可能未知的 javascript 代码的浏览器的安全措施,WebSocket++ 默认不发送源头。

MtGox 似乎适用于我尝试过的任何来源,只要设置了一个。据推测,他们使用此功能将他们认为恶意的来源列入黑名单。您可以使用带有以下代码的 WebSocket++ 发送原始标头(填写任何适合您的应用程序的来源):

con->replace_header("Origin","http://www.example.com");

在您请求与endpoint::get_connection 建立新连接之后,但在调用endpoint::connect 之前运行此命令。

有关此处使用的“同源策略”安全方法的更多详细信息,请参阅http://en.wikipedia.org/wiki/Same-origin_policy。

【讨论】:

以上是关于MtGox API 和 websocketpp的主要内容,如果未能解决你的问题,请参考以下文章

如何将MtGox报价器数据添加到网站?

HttpWebRequest.GetResponse() 不断超时

MtGox赔付将近 安全警钟长鸣

Bitfinex 推出比特币分裂代币BT2;韩国比特币交易所Bithumb上线Zcash;MtGox盗窃案嫌疑人或面临55年刑期

使用 Boost.Asio 和 OpenSSL 的 HTTPS 请求

在 Objective-C 中解析 JSON 的最漂亮方法?