首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MtGox API和websocketpp

MtGox API和websocketpp
EN

Stack Overflow用户
提问于 2013-11-18 19:19:39
回答 1查看 857关注 0票数 1

我无法从MtGox API通过名为万维网的WebSockets C++库获得信息

代码语言:javascript
复制
#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成功连接 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成功连接 2013年-11-18 23:18:08 handle_read_http_response错误:文件结束 2013-11-18 23:18:08失败:档案结束

这个密码怎么了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-19 01:23:08

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

MtGox似乎可以很好地工作,任何来源,我已经尝试过,只要一个是完全设置的。据推测,他们利用这一手段来黑名单他们认为是恶意的来源。您可以使用以下代码使用WebSocket++发送源标头(为您的应用程序填写任何合适的来源):

代码语言:javascript
复制
con->replace_header("Origin","http://www.example.com");

在请求使用endpoint::get_connection的新连接之后,但在调用endpoint::connect之前,运行此命令。

有关此处使用的“同源策略”安全方法的更多详细信息,请参见政策

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20055987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档