2011年9月3日星期六

[PerlChina] Re: 如何用Perl来实现像Opera浏览器的主要功能

谢谢truncatei分享,你提供的这个包,和我需要的功能类似,
其实就是让Perl可以和浏览器的API进行通信,我看了WWW::Mechanize::Firefox这个包其实是和Firefox安装
MozRepl插件后启动的端口进行通知
提交一个Url,获取到Firefox访问这个Url返回的结果。并且包含了status_line等信息,挺实用的
不过还存在一个问题,
使用WWW::Mechanize::Firefox模块后,返回的内容其实和在Firefox输入网址一样了。
但是Firefox默认对wml站点支持不了,安装了Wmlbrowse插件后,可以支持访问Content_type为wml的站点,但是对于这些站
点上的Oneterforward并不会自动跳转,
会停留在跳转页面上,需要你去点击"点击进入"这种链接后才会到达最终页面,是否有办法可以让这个Content_type为wml的网站自动跳转到最
终地址?


附上自己测试的过程记录

Perl如何实现和Firefox API通信

一、如何开放Firefox浏览器的API
系统版本:winxp 32Bit
Firefox版本:3.6.21
MozRepl版本:1.0

1、安装MozRepl插件
首先在一台安装了Firefox的winxp机器(理论上Linux机器也可以)使用Firefox访问下面MozRepl插件的下载地址
https://github.com/bard/mozrepl/wiki
下载好能支持Firefox的版本后,会要求重启Firefox

2、启动MozRepl插件的服务,开启Firefox的API
在Firefox的工具选项中点击MozRepl这个菜单,有三个会用到的功能
Start【启动功能,点击默认会在本机开启一个127.0.0.1:4242的端口】
Activate on Startup【开启Firefox时就自动启动】
Allow Outside Connections【允许所有访问,将4242端口监听在0.0.0.0上】

3、测试Firefox的API是否启动成功
telnet 127.0.0.1 4242
如果有一个MozRepl的提示信息,就说明Firefox的API已经启动成功

二、Perl如何访问Firefox的API
1、在环境变量中配置Firefox API所监听的地址和端口
如果不在这里配置MOZREPL的地址,下面安装WWW::Mechanize::Firefox模块时,就会提示连接到locahost 4242失
败,
因为默认会认为Firefox API监听地址为本机
export MOZREPL="192.168.20.235:4242"

2、安装Perl所需要的模块WWW::Mechanize::Firefox
通过这个模块,可以实现Perl和Firefox MozRepl插件实现的API接口通信
使用cpan安装WWW::Mechanize::Firefox模块
cpan WWW::Mechanize::Firefox

3、Perl和Firefox API通信的范例脚本
#!/usr/bin/env perl

use strict;
use warnings;
use Data::Dumper;
use WWW::Mechanize::Firefox;

my $url = shift;
# 如果没在环境变量是配置,也可以直接在Perl脚本中定义
# $ENV{MOZREPL} = "192.168.20.235:4242";
my $mech = WWW::Mechanize::Firefox->new(activate => 1,);
$mech->get($url);
print $mech->content . "\n";;
print $mech->status . "\n";;


On 9月3日, 上午11时43分, truncatei <trunca...@gmail.com> wrote:
> 曾经看到这么一个包,希望对你有帮助
>
> http://search.cpan.org/~corion/WWW-Mechanize-Firefox-0.55/lib/WWW/Mec...
>
> $mech->eval( $str [, $env [, $document]] )
>
> my ($value, $type) = $mech->eval( '2+2' );
>
> Evaluates the given Javascript fragment in the context of the web
> page. Returns a pair of value and Javascript type.
>
> This allows access to variables and functions declared "globally" on
> the web page.
>
> 2011/9/2 Morya Feng <mo...@is-coder.com>:
>
>
>
> > 如果不限定语言的话,用别的语言写一个工具,只是用perl取得
> > 一下返回值和返回一些具体的执行结果字符串是不是可行?
> > 比如,用python + PySide/PyQt + QtWebkit
> > 在 2011年9月2日 上午10:18,liseen <liseen....@gmail.com>写道:
>
> >> Hi, all
> >> 用QtWebkit 吧, 用c++ 写, 接口很简单, 执行js什么的都没有问题。
> >> xunxin
> >> 2011/9/2 eexpress <eex...@gmail.com>
>
> >>> 兼容测试?实际用浏览器测试好些。WWW::Mechanize不支持js,常规抓网页/提交内容,倒是顺手。Opera的菜单可以调用perl脚本,传递些Opera内部参数,这可以的。
>
> >>> 在 Thu, 01 Sep 2011 22:04:47 +0800,Jeova Sanctus Unus
> >>> <jeova.sanctus.u...@gmail.com> 写道:
>
> >>>> 按需写perl,该执行js,就找个模块来跑嘛,;)
> >>>> 在 2011-9-1 下午8:09,"洋葱" <fine...@gmail.com>写道:
>
> >>>>> 请教一个Perl方面问题,生产中有需要使用Perl去测试一大堆手机网站,想判断这些网址是否最后都可以成功打开,并且判断返回的Content长度
> >>>>> 都超过1024字节。
>
> >>>>> 目的:可以使用脚本对网站进行测试,如果网址有302或301跳转会自动跟进,如果网站有onenterforward或ontimer这种页面内的跳
> >>>>> 转也能够自动跳转,直至跟进到最后的页面,返回最后页面的status_line和content
>
> >>>>> 但是如果要兼容这些网站,就会存在一些问题,
> >>>>> 1、比如网站的302 301Location要了识别并跟进【这个还好解决】
> >>>>> 2、如页有些网站的跳转是通过页面的refresh或者一些onenterforward、ontimer等等各种各样的花样百出的来实现的,其实如果
> >>>>> 想把所有网站都兼容好,那相当于写了一个Opera浏览器了。
>
> >>>>> Perl是否可以直接调取现成的包,来实现这个功能,我在网上找过了,没有发现有这么功能的模块。我又想过装个Linux版本下的Opera,看是否有
> >>>>> 接口供调用,发现也没有这个功能。大家有什么好建议吗?
>
> >>>>> --
> >>>>> 您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
> >>>>> 要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
> >>>>> 要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
> >>>>> 若有更多问题,请通过http://groups.google.com/group/perlchina?hl=zh-CN访问此网上论坛。
>
> >>> --
> >>> 您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
> >>> 要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
> >>> 要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
> >>> 若有更多问题,请通过http://groups.google.com/group/perlchina?hl=zh-CN访问此网上论坛。
>
> >> --
> >> - xunxin 万�新
> >> - 技术部搜索组工程师
> >> - Tel: 86-10-5760 3320
>
> >> - Mobile: 86-13811636901
>
> >> --
> >> 您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
> >> 要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
> >> 要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
> >> 若有更多问题,请通过http://groups.google.com/group/perlchina?hl=zh-CN访问此网上论坛。
>
> > --
> > 您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
> > 要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
> > 要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
> > 若有更多问题,请通过http://groups.google.com/group/perlchina?hl=zh-CN访问此网上论坛。
>
> --
> 如果觉得无聊,您不妨访问Google Reader消遣https://www.google.com/reader/view
> 要尝试黑版本Google,请访问http://tinyurl.com/yk3yp7j

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

没有评论: