我创建了一个nodeJS脚本来自动化网站上的一些操作 - 这是不我的!
为了更好地控制正在发生的事情,我想听一下网站socket.io流上的事件。
到目前为止在NODE中工作:
在NODE中无法使用:
我在点击此网站上的特定按钮时检查了Chrome中发生的XHR请求。发送此请求后,chrome上的websocket连接会发出有关我的操作状态的事件。当然,这些事件仅发送给执行此操作的用户。
在节点中执行完全相同的请求(使用来自网站登录的cookie)给出正确的响应(成功),但我之前打开的套接字流只显示一些公共事件 - 与我的行为无关。
如此处所示,它登录,显示网站的cookie,打开套接字流。然后它发送一个XHR POST请求,其中包含标题中显示的cookie。响应表示“成功”,但每秒弹出一次的socket.io事件只是公共事件(userCount)。
发送请求后,应该会弹出“step_calc”等事件,显示我的操作状态。
在收到网站的登录cookie后,我正在运行:
const io = require('socket.io-client');
const request = require('request');
main()
function main() {
var socket = io(socketURL, {});
socket.on('connect', function () {
setTimeout(function(){
performAction(); // Send XHR to server
console.log(" > Sending XHR request...")
}, 1500)
});
socket.on('step_calc', function (data) { // Personal event about my action
console.log(" >>> Event = step_calc: " + data)
});
socket.on('login_time', function (data) { // Personal event being displayed every few seconds IF LOGGED IN (chrome) console.log(" >>> Event = step_calc: " + data)
});
socket.on('userCount', function (data) { // Public event
console.log(" >>> Event = userCount: " + data)
});
socket.on('disconnect', function () {
console.log(" > [Disconnected]");
});
}
连接到套接字后1500ms,它将发送XHR请求,该请求应该使服务器向套接字发出信息 - performAction()。
当我检查chrome控制台时:
step_calc 跟随成功的XHR请求(特定于帐户)
login_time 每2秒显示一次,但仅在我登录时(帐户特定)
userCount 一直在向所有人展示
我检查了socket.io-client的API指南,找到了有关socketID的信息。但它只是说,如何在连接到服务器后获得此ID ...
https://github.com/socketio/socket.io-client/blob/master/docs/API.md#socket
...是的......在打开网站时,chrome首先做的是向网站发送GET请求,其数据如下:
EIO = 3及运输=轮询& T公司= 1493058868222-0
响应包含某种“sid”。
{ “SID”: “g_mqoOS __________ BHB”, “升级”:[ “的WebSocket”], “pingInterval”:25000 “pingTimeout”:60000}
现在我收集了所有这些信息,我该如何使用它?
如何将套接字连接“连接”到我从登录中获取的cookie(我用来向网站发送请求)?
我真的希望我的问题是可以理解的。感谢任何帮助,我已经花了很多时间试图让它自己工作。
非常感谢!
我尝试在chrome中使用握手添加相同的Cookie。一个奇怪的是,当我打开网站(它似乎是握手)时它所做的第一个XHR已经包含一个名为“io”的cookie,然后由一个新的替换。如果我检查chrome控制台>应用程序> cookie,我根本看不到这个cookie。它从何而来?
左侧:Chrome上XHR选项卡下的请求 右侧:这将显示在Websocket选项卡
下是这两个不同的请求还是以某种方式相同?
这些信息是否有助于解决我的问题?
答案 0 :(得分:0)
从我所看到的,您并未将会话cookie传递给socket.io-client
构造函数,这可能意味着套接字连接未经过身份验证。
试试这个:
var socket = io(socketURL, {
extraHeaders: {
Cookie : '...'
}
});
记录here。