让 phantomjs、socket.io 和 gevent-socketio 协同工作

2023-11-29

我正在尝试构建一个利用 Phantomjs 1.7(模拟浏览器)的应用程序,并创建一个 Python 后端来启动一些事件并收集数据。

问题是 Phantomjs 和我的 Python 程序这两个进程需要双向通信。问题是里面page.evaluate我不能:

  • 传递任何复杂的对象,例如“fs”(从标准输入读取)
  • 创建一个 WebSocket 连接到我的 Python 脚本
  • 任何其他形式的进程间通信都受到限制

所以我的解决方案很简单:

  • 将socket.io js注入我正在查看的页面中。
  • 连接到我的 python 服务器,该服务器是使用 gevent-socketio 实现的

当我尝试从 page.evaluate 内部连接时,我得到:

Unexpected response code: 404

这是 Phantomjs 脚本:

var page   = require("webpage").create();
page.onAlert = function(msg) { console.log("alert>>>" + msg); };
page.onConsoleMessage= function(msg) { console.log(msg); };

page.open("http://google.com", function() {
  page.injectJs("socket.io.js");
  page.evaluate(function() {
    var socket = new io.Socket();
    socket.connect('localhost:5051/test');
    socket.on('connect',function() {
      console.log('Client has connected to the server!');
    });
    // Add a connect listener
    socket.on('signal',function(data) {
      console.log('Received a signal: ',data);
    });
    // Add a disconnect listener
    socket.on('disconnect',function() {
      console.log('The client has disconnected!');
    });
    // Sends a message to the server via sockets
    socket.send("kakalq");
  });
    //phantom.exit();
});

这是服务器端 Python 脚本:

from socketio import socketio_manage
from socketio.server import SocketIOServer
from socketio.namespace import BaseNamespace

class MyNs(BaseNamespace):
  def initialize(self):
    print "connected"
    self.emit('connect')

  def disconnect(self, *args, **kwargs):
    print "diconnecting"
    super(MyNs, self).disconnect(*args, **kwargs)

 def signal(self, message):
   print "received signal", message
   self.emit("okay", "this will be sent to js")

 def start(environ, start_response):
   if environ['PATH_INFO'].startswith('/test'):
     return socketio_manage(environ, { '/test': MyNs })


if __name__ == "__main__":
  server = SocketIOServer( ('', 5051), start,policy_server=False )
  server.serve_forever()

我猜测它不起作用的原因是 PhantomJS 仅支持旧的、已弃用的 WebSockets 版本。我们必须等待几个月 PhantomJS 2.0 才能支持当前版本的 WebSockets。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

让 phantomjs、socket.io 和 gevent-socketio 协同工作 的相关文章

随机推荐

  • 编译sdk应该低于目标sdk

    对 SO 的压倒性建议是编译 SDK 通常应该与目标 SDK 匹配 https stackoverflow com a 27629181 360211 同样 建议将此 compileSdk 与您的目标 sdk 版本相匹配 https sta
  • 如何从不受支持的国家/地区销售付费应用程序[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我想出售我开发的应用程序 但我的国家 罗马尼亚 不支持此服务 因此 我想请一位住在可以销售付费应用程序的国家 法国或美国 的朋友帮助我 现在我不知道该怎么告诉他这个过程 他身边需要什
  • 捕获地理位置错误 - 异步等待

    如何捕获特定于地理位置的错误以通知用户他们必须打开地理定位 catch 记录了一个名为位置误差正如 Mozilla 文档中所引用的 https developer mozilla org en US docs Web API Positio
  • 在 Android M 上请求麦克风权限

    我需要在 Android M 中使用麦克风 我尝试在清单中设置权限组 但无法使其正常工作 这是我在清单中得到的内容
  • 将 iPhone 应用程序与 Shibboleth 集成

    有人将 iPhone 应用程序与 Shibboleth 身份提供商集成吗 谷歌搜索没有得到任何结果 所以我直接询问大师 如果以前没有这样做过 这样做是否可行 两者的答案都是 是 我是一名 Java 人员 所以两周前被问到 学习 Object
  • 温莎城堡如何响应实现多个接口的类?

    例如 我有两个接口 ICustomerService 和 IOrderService 每个接口都有几个函数 例如 GetCustomer GetOrder 等 我想要一个类来实现这两个接口 Server 温莎城堡对此有何回应 首先有可能吗
  • 合并 XmlNodelist

    任何人都可以给我一个将 xmlNodelists 合并到单个列表的解决方案吗 我会使用 LINQ Concat方法 问题是XmlNodeList is IEnumerable相对于IEnumerable lt XmlNode gt 因此你必
  • 解释GDB寄存器(SSE寄存器)

    我已经使用 GDB 1 天了 我对它有了一定的了解 但是 当我使用 GDB 和打印寄存器在最后一个分号处设置断点时 我无法完全解释存储到 XMM 寄存器中的数据的含义 我不知道数据是否采用 MSB gt LSB 格式 反之亦然 m128i
  • R 中向量的子向量之和

    给定一个向量x长度为 k 我想获得一个 k x k 矩阵X where X i j 是x i x j 我现在的做法是 set seed 1 x lt rnorm 10 X lt matrix 0 10 10 for i in 1 10 fo
  • 程序集版本是否可以随每个 TFS 2010 版本自动更新?

    我正在使用 Visual Studio 2010 和 TFS 2010 有没有办法让 dll 版本随着每个 TFS 版本自动递增 Thanks 我有一篇关于如何在 TFS Build 2010 中对程序集进行版本控制的博客文章 如何为 TF
  • 递归与yield返回树中的元素顺序

    我有一个递归函数 在给定起始根节点的情况下返回所有子树节点 private IEnumerable
  • Google App Engine 中可以进行长轮询吗?

    我需要制作需要经常轮询服务器的应用程序 但GAE对请求有限制 因此发出大量请求可能会非常昂贵 是否可以使用长轮询并使请求等待最多 30 秒的更改 Google AppEngine 有一个新功能 Channel API 您可以使用它 A构建良
  • 有人成功调试 iPhone 的单元测试吗?

    我找到了例子如何在 Cocoa 中调试单元测试 or the ADC 页面在这里 但我无法让调试适用于 iPhone 应用程序目标 我可以启动并运行测试 并且它们在构建期间运行 但我需要的是debug一些更复杂的故障的测试 您可能会考虑将测
  • 如何将数据注入到从路由器创建的 Angular2 组件中?

    我目前正在尝试为我们的 Angular1 应用程序 相当复杂的一个 构建 Angular2 原型 基于 alpha44 并且我正在尝试在使用路由和子路由时找到最佳的模型 数据架构 在我的示例中 从从路由创建的子组件中 我想访问父组件的属性
  • 管理许多 git 存储库

    在 git 中设置项目很容易 因此即使对于小脚本 我也可以拥有单独的存储库 现在的问题是如何管理它们 我在多个地方使用这些存储库工作 当我对某些存储库进行更改后 我希望能够更新其他位置的存储库 所以我有一个目录 里面有很多存储库 我怎样才能
  • 如何通过TabBars调用Activity

    我正在制作一个使用选项卡栏的应用程序 现在我需要知道的是 如何通过打开其他选项卡setOnTabChangedListener 在我的代码中 例如 我当前位于选项卡中 当我单击第二个选项卡时 它应该调用第二个选项卡的活动 看下面的代码 Ta
  • 从安全性中删除时间戳元素

    所有的极客都会说 WSE 已经过时了 现在对我来说没关系 只是想找到解决我问题的方法 尝试使用 WSE 使用 Java Web 服务 在传出的soap请求中有一个安全有附加时间戳的节点 我的待发肥皂请求如下所示
  • 动态使用时,波形符不会转换为绝对路径

    我想动态创建 3 张卡片 每张卡都有一个图像 我想为每张卡动态设置路径 但我不能使用波形符 因为波浪号不会转换为绝对路径 img 我收到此错误 GET http localhost 3000 assets images how to use
  • 按给定索引对多维数组进行排序 - PHP?

    我有两个数组 days order and mysql result 我要排序 mysql result数组使用 days order大批 我想以天数升序显示 MySQL 结果 有什么办法可以做到这一点或任何其他方式 以便我可以通过 day
  • 让 phantomjs、socket.io 和 gevent-socketio 协同工作

    我正在尝试构建一个利用 Phantomjs 1 7 模拟浏览器 的应用程序 并创建一个 Python 后端来启动一些事件并收集数据 问题是 Phantomjs 和我的 Python 程序这两个进程需要双向通信 问题是里面page evalu