首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mojo::UserAgent和JavaScript

Mojo::UserAgent和JavaScript
EN

Stack Overflow用户
提问于 2018-09-10 16:54:24
回答 2查看 491关注 0票数 9

我想知道是否可以用Mojo::UserAgent来做类似下面这样的事情:

假设我有以下代码:

代码语言:javascript
复制
my $ua  = Mojo::UserAgent->new;
my $res = $ua->get('mojolicious.org/perldoc')->result;

有没有可能截取Mojo::UserAgent请求并将其发送到其他知道javascript的web客户端,在那里它的结果作为Mojo::Transaction::HTTP (上面的$res )发送回来,在那里用户可以继续使用Mojo::UserAgent接口结果。

也就是说,我想要以下内容:

->截获HTTP请求->将HTTP请求发送到web客户端支持javascript如WWW::Chrome::Marionette或FireFox::Marionette -> JavaScript Web客户端执行请求并将截获的返回结果更改为Mojo::Transaction::HTTP

Mojo::UserAgent ->非阻塞HTTP请求->non阻塞HTTP响应->发送到嵌入式web浏览器,如webkit ->获取结果为Mojo::Transaction::HTTP

对于如何让Mojo::UserAgent与javascript协同工作,/examples有什么想法吗?

EN

回答 2

Stack Overflow用户

发布于 2018-09-12 02:01:25

这几乎总是可能的,但实际的问题是你会做多少工作来完成它。这个特定答案的一部分是您希望如何拦截请求。这是最简单的部分,因为您可以包装start方法(就像Mojo::UserAgent::Role::Queued一样)。

截取请求后,可以做任何你想做的事情。获取原始响应,让Mojo解析它并构建事务的该部分。在此之后,您将重新进入正常进程。

有一段时间,人们会推荐无头浏览器phantomjs,但这个项目似乎已经停滞不前了。这是Joel Berger的Mojo::Phantom,但这并不是你想要的。

最后,请记住,几乎每个人都希望它存在,但它并不存在。这是重要的信息。;)

如果你还想做这方面的工作,在此过程中问更多范围狭窄的问题可能会更有帮助。

祝好运!

票数 5
EN

Stack Overflow用户

发布于 2019-12-01 22:13:06

不完全是您所要求的,但可能足够接近可以通过以下方式实现:

安装chrome-headless

  • setting up nodejs +几个模块

  • 从perl代码outerHTML

中加载和解析客户端事件

如下所示:

代码语言:javascript
复制
# just a perl oneliner, parsing the scrapped html and passing it to Mojo::DOM
perl -MMojo::DOM -e '$s=`node scrap-html.js`; for my $e (Mojo::DOM->new($s)->find("html body a.scroll")->each){ print $e->text}';

scrap html.js的代码在哪里

代码语言:javascript
复制
  // file: scrap-html.js src: https://gist.github.com/magician11/a979906401591440bd6140bd14260578
  const CDP = require('chrome-remote-interface');
  const chromeLauncher = require('chrome-launcher');

  (async function() {
    const launchChrome = () =>
      chromeLauncher.launch({ chromeFlags: ['--disable-gpu', '--headless','--blink-settings=imagesEnabled=false'] });

    const chrome = await launchChrome();
    const protocol = await CDP({ port: chrome.port });
    const timeout = ms => new Promise(resolve => setTimeout(resolve, ms));

    // See API docs: https://chromedevtools.github.io/devtools-protocol/
    const { Page, Runtime, DOM } = protocol;
    await Promise.all([Page.enable(), Runtime.enable(), DOM.enable()]);

    uri = 'https://qto.fi/qto/view/readme_doc'
    Page.navigate({ url: uri });

    // wait until the page says it's loaded...
    Page.loadEventFired(async () => {
      try {
        await timeout(4000); // give the JS some time to load

        // get the page source
        const rootNode = await DOM.getDocument({ depth: -1 });
        const pageSource = await DOM.getOuterHTML({
          nodeId: rootNode.root.nodeId
        });
        protocol.close();
        chrome.kill();
        console.log ( pageSource.outerHTML)
      } catch (err) {
        console.log(err);
      }
    });
  })();
  //eof file: scrap-html.js

ubuntu上的整个设置示例:

代码语言:javascript
复制
  # start install chromium-headless
  sudo apt-get update
  sudo apt-get install -y software-properties-common
  sudo apt-get install -y chromium-browser
  sudo apt-get update

  wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
  sudo dpkg -i google-chrome-stable_current_amd64.deb
  apt --fix-broken install
  # stop install chromium-headless
  # start installing the nodejs + node modules
  sudo apt install nodejs
  sudo npm install -g chrome-remote-interface
  sudo npm install -g chrome-launcher
  export NODE_PATH=/usr/local/lib/node_modules
  # stop installing the nodejs + modules
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52254228

复制
相关文章

相似问题

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