我无法从MtGox API通过名为万维网的WebSockets C++库获得信息
#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失败:档案结束
这个密码怎么了?
发布于 2013-11-19 01:23:08
MtGox似乎在进行原点过滤。基于浏览器的WebSocket连接将自动发送一个源标头,其中包含正在运行脚本的域的值。由于这主要是运行可能未知的Javascript代码的浏览器的安全措施,默认情况下WebSocket++不会发送源标头。
MtGox似乎可以很好地工作,任何来源,我已经尝试过,只要一个是完全设置的。据推测,他们利用这一手段来黑名单他们认为是恶意的来源。您可以使用以下代码使用WebSocket++发送源标头(为您的应用程序填写任何合适的来源):
con->replace_header("Origin","http://www.example.com");在请求使用endpoint::get_connection的新连接之后,但在调用endpoint::connect之前,运行此命令。
有关此处使用的“同源策略”安全方法的更多详细信息,请参见政策。
https://stackoverflow.com/questions/20055987
复制相似问题