我想知道,使用Mojo :: UserAgent是否可以进行以下操作:
假设我有以下代码:
my $ua = Mojo::UserAgent->new;
my $res = $ua->get('mojolicious.org/perldoc')->result;
是否有可能拦截Mojo :: UserAgent请求并将其发送到其他知道javascript的Web客户端,其结果以Mojo :: Transaction :: HTTP($ res above)的形式发送回去,因此用户可以继续使用Mojo :: UserAgent接口结果。
即我需要以下内容:
Mojo :: UserAgent-> HTTP请求->拦截HTTP请求->将HTTP请求发送到Web客户端支持javascript,例如WWW :: Chrome :: Mechanize或FireFox :: Marionette-> JavaScript Web客户端执行请求->返回的结果被拦截并更改为Mojo :: Transaction :: HTTP
或
Mojo :: UserAgent->非阻塞HTTP请求->非阻塞HTTP响应->发送到嵌入式Web浏览器(如webkit)->得到的结果为Mojo :: Transaction :: HTTP
任何想法/示例如何使Mojo :: UserAgent与javascript一起使用?
答案 0 :(得分:3)
几乎总是可能的,但是实际的问题是您要完成这项工作的工作量。此特定答案的一部分是您希望如何截取请求。这很容易,因为您可以包装create trigger TRIGGERNAME
after update on "SCHEMANAME.T1" for each row
begin
update "SCHEMANAME.T2"
set F2 = "MY NEW VALUE"
where X2 = X1
end;
方法(就像Mojo::UserAgent::Role::Queued一样)。
截获请求后,请执行任何操作。获取原始响应,并让Mojo解析它并构建事务的该部分。之后,您重新输入正常进度。
人们会建议使用无头浏览器phantomjs,但看起来该项目已停滞。有乔尔·伯杰(Joel Berger)的Mojo::Phantom,但这并不是您想要的。
最后,请记住,几乎每个人都希望这个存在,但事实并非如此。那是重要的信息。 ;)
如果您仍然想解决这个问题,那么在此过程中提出更狭-的问题可能会有所帮助。
祝你好运!
答案 1 :(得分:0)
并非完全符合您的要求,但可以通过以下方法实现足够接近的效果:
如下:
# 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的代码
// 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上整个设置的示例:
# 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