Flex实现QQ网页提取天气信息

Flex实现QQ网页提取天气信息

以前用C#实现了从QQ天气网页提取天气信息显示,最近了解Flex,随便测试了一下Flex版的QQ天气抓取,效果还不错。

1、预备知识

Flex是Adobe提供的基于Flash环境的RIA展现技术,主要采用MXML+Action Script来编写程序、界面,然后通过编译器编译成flash格式的SWF文件发布到网站上。

实现该功能需要安装Flex SDK,可以从Adobe网站上面下载,或者安装Flex Builder plugin+Eclipse来开发。

同时需要具备简单的正则表达式知识。

2、界面布局、代码实现

文件:QQWeather.mxml

 

<?
xml version=”1.0″ encoding=”utf-8″
?>


<
mx:Application 
xmlns:mx
=”http://www.adobe.com/2006/mxml”
 layout
=”absolute”
 width
=”213″
 height
=”234″
  creationComplete
=”initApp()”
 backgroundGradientAlphas
=”[1.0, 1.0]”
 backgroundGradientColors
=”[#F6FBFC, #3FEEDC]”
>

    

<
mx:Style
>

        .myfont{font-size:12pt;font-family:’宋体’;}
    

</
mx:Style
>

    

<
mx:Script 
source
=”QQWeather.as”
></
mx:Script
>

    

<
mx:Label 
x
=”10″
 y
=”53″
 text
=”选择城市:”
 styleName
=”myfont”
/>

    

<
mx:ComboBox 
id
=”cmbCity”
 x
=”66″
 y
=”49″
 width
=”133″
 rowCount
=”6″
 change
=”changeHandler(event);”
 styleName
=”myfont”
></
mx:ComboBox
>

    

<
mx:Image 
x
=”10″
 y
=”10″
 source
=”@Embed(‘../title.gif’)”
 width
=”189″
 
/>

    

<
mx:Image 
x
=”10″
 y
=”106″
 source
=”@Embed(‘../tem1.png’)”
 width
=”57″
 height
=”13″
/>

    

<
mx:Image 
x
=”10″
 y
=”132″
 source
=”@Embed(‘../tem2.png’)”
 width
=”57″
 height
=”13″
/>

    

<
mx:Image 
x
=”10″
 y
=”178″
 source
=”@Embed(‘../tem3.png’)”
 width
=”57″
 height
=”13″
/>

    

<
mx:Image 
x
=”10″
 y
=”154″
 source
=”@Embed(‘../tem5.png’)”
 width
=”57″
 height
=”13″
/>

    

<
mx:Label 
x
=”75″
 y
=”103.5″
 text
=”Flex实现QQ网页提取天气信息
 width
=”110″
 styleName
=”myfont”
 id
=”t1″
/>

    

<
mx:Label 
x
=”75″
 y
=”129.5″
 text
=”Flex实现QQ网页提取天气信息
 width
=”110″
 styleName
=”myfont”
 id
=”t2″
/>

    

<
mx:Label 
x
=”75″
 y
=”151.5″
 text
=”Flex实现QQ网页提取天气信息
 width
=”110″
 styleName
=”myfont”
 id
=”t3″
/>

    

<
mx:Label 
x
=”75″
 y
=”175.5″
 text
=”Flex实现QQ网页提取天气信息
 width
=”110″
 styleName
=”myfont”
 id
=”t4″
/>

    

<
mx:Label 
x
=”34″
 y
=”202″
 text
=”Label”
 width
=”169″
 styleName
=”myfont”
 textAlign
=”right”
 id
=”lbToday”
/>

    

<
mx:Label 
x
=”10″
 y
=”80″
 width
=”193″
 id
=”t0″
 styleName
=”myfont”
 fontWeight
=”normal”
/>

    

</
mx:Application
>

 

后台脚本:QQWeather.as

 

 1 
//
 ActionScript file


 2 
import
 flash.events.Event;

 3 
import
 flash.events.SecurityErrorEvent;

 4 


 5 
import
 mx.collections.ArrayCollection;

 6 
import
 mx.controls.Alert;

 7 
import
 mx.utils.Base64Encoder;

 8 


 9 
private
 var loader:URLStream;

10 
private
 var htmldata:String;

11 
private
 var ifloaded:Boolean
=
false
;

12 
private
 var dataUrl:String
=

http://weather.qq.com/inc/ss*.htm

;

13 


14 
public
 function initApp():
void


15 
    var t:Date
=
new
 Date();

16 
    lbToday.text
=
t.fullYear
+



+
(t.month
+
1
)
+



+
t.date
+

 

+
t.hours
+

:

+
t.minutes
+

:

+
t.seconds;

17 
    loadUrl(

125

,parseCityInfo);

18 
}

19 
private
 function loadUrl(cityno:String,callback:Function):
void
{


20 
    loader
=
 
new
 URLStream();

21 
    loader.addEventListener(Event.COMPLETE, callback);

22 
    loader.addEventListener(

securityError

,onSecurityError );

23 
    var addr:String
=
dataUrl.replace(
/
\
*/
,cityno);

24 
    trace(

Loading

,addr);

25 
    var request:URLRequest 
=
 
new
 URLRequest(addr);

26 
    
//
var enc:Base64Encoder=new Base64Encoder();

27 
    
//
enc.encodeUTFBytes(addr);

28 
    
//
var request:URLRequest = new URLRequest(“
http://localhost/httpproxy/webservlet?data=
“+enc.toString());


29 
    
try
 {


30 
        loader.load(request);

31 
    } 
catch
 (error:Error) {


32 
        Alert.show(

不能连接服务器:

+
addr,

Tips

);

33 
    }

34 
}

35 
private
 function onSecurityError(event:SecurityErrorEvent):
void
{


36 
    Alert.show(

安全错误:

+
event.text,

Tips

);

37 
}

38 
private
 function parseCityInfo(event:Event):
void
 {


39 
    var sm:URLStream
=
event.target as URLStream;

40 
    htmldata
=
 sm.readMultiByte(sm.bytesAvailable, 

gb2312

); 

41 
    trace(

completeHandler: 

 
+
 htmldata );

42 
    
if
(
!
ifloaded){


43 
        var pattern:RegExp 
=
new
 RegExp(

value=\

(\\d{

1
,
3
})\

>([^<]*)</option>

,

g

);

44 
        var result:Object 
=
 pattern.exec(htmldata);

45 
        var data:ArrayCollection 
=
 
new
 ArrayCollection();

46 
        var item:Object;

47 
        
while
 (result 
!=
 
null
) {


48 
             trace(result[
1
],result[
2
]);

49 
             item
=
new
 Object();

50 
             item.label
=
result[
2
];

51 
             item.data
=
result[
1
];

52 
             data.addItem(item);

53 
             result 
=
 pattern.exec(htmldata);

54 
         }

55 
        cmbCity.dataProvider
=
data;

56 
        ifloaded
=
true
;

57 
    }

58 
    parseWeather();

59 
}

60 
private
 function parseWeather():
void
{


61 
    
//
分析天气信息


62 
    var item:Object
=
cmbCity.selectedItem;

63 
    var pattern:RegExp 
=
new
 RegExp(

align=\

center\

>([^<]*)</td>

,

g

);

64 
    var result:Object 
=
 pattern.exec(htmldata);

65 
    var data:Array
=
new
 Array();

66 
    
while
 (result 
!=
 
null
) {


67 
        data.push(trimString(result[
1
]));

68 
        trace(result[
1
]);

69 
        result 
=
 pattern.exec(htmldata);

70 
    }

71 
    t0.text
=
item.label
+

:  

+
data[
0
];

72 
    t1.text
=
data[
1
];

73 
    t2.text
=
data[
2
];

74 
    t3.text
=
data[
3
];

75 
    t4.text
=
data[
4
];

76 
}

77 
private
 function changeHandler(event:Event):
void
{


78 
    var item:Object
=
ComboBox(event.target).selectedItem;

79 
    trace(item.data);

80 
    loadUrl(item.data,parseCityInfo);

81 
}

82 
private
 function trimString(s:String):String{


83 
    
return
 s.replace(
/
(
^
\s
*
)
|
(\s
*
$)
/
g, 
“”
);

84 
}

 

 

用mxmlc命令编译之后,运行效果如下:

 

Flex实现QQ网页提取天气信息 

3、注意事项

根据flash的sandbox安全模型要求,A域名下的flash文件只能从A域名中获取服务端数据,如果需要从B域名中提取数据,需要B域名配置一个crossdomain.xml的文件,允许A从B

下载数据,但是我们不可能有这样的公关能力要求腾讯在http://weather.qq.com/下面放一个xml文件,允许其他网站访问,因此只能另辟蹊径:

方案1:A域名下自己实现一个代理,从B域名网页下载数据返回,这样就回避了sandbox的安全性错误,Line 26-28注释的代码就是我用java Servlet实现的一个代理。

方案2:建立代理服务器,例如squid或者Apache代理

方案3:采用adobe提供的开源软件bladeDS,该软件采用J2EE War方式发布,可以提供RPC、HTTP Proxy的代理功能

方案4:采用Adobe的企业级解决方案Adobe LiveCycle ES ,这个东西试用版就2.5G,真是庞然大物,受不了了,没见过这样的软件,一个Oracle数据库也就几百M而已,想不通。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/111004.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 安装VMware Tools选项显示灰色的正确解决办法

    安装VMware Tools选项显示灰色的正确解决办法百度了一天,重新安装了vm,在csdn逛了又逛,结合无数篇大神文章,最后自己成功琢磨出了真正能点亮灰色按钮的方法。简单实在,大神们的方法实在千秋万变,一个比一个复杂,最后只能实现成功拖拽,而复制粘贴却还是不行。首先问题如下:解决办法如下:1.关闭虚拟机;2.在虚拟机设置分别设置CD/DVD、CD/DVD2和软盘为自动检测三个步骤;3.再重启虚拟机,灰色字即点…

    2022年5月9日
    684
  • Linux环境下如何安装wget(CentOS 7系统)「建议收藏」

    Linux环境下如何安装wget(CentOS 7系统)「建议收藏」问题现象:利用Linux自带的wget命令去下载安装相关应用时,提示:“sudo:wget:commandnotfound”如下图所示:问题原因:(1)Linux服务器本身没有自带安装wget,但一般很少有这种情况出现。(2)Linux服务器自带的wget版本过低,无法通过wget命令去安装其它应用。分析过程:先在Linux服务器窗口中,输入如下命令,检查Linux服务器有没有安装过wget。如果出现如下图所示,则说明已经安装过wget,但版本过低,需要将原有版本卸载,再

    2022年10月16日
    0
  • rcep协议内容_ptp协议

    rcep协议内容_ptp协议展开全部(1)合同的含义合同是当事人或当事双方之间设立、变更、终止民事关系的协议。依法62616964757a686964616fe78988e69d8331333363373036成立的合同,受法律保护。合同具有如下法律特征:①合同是两个或两个以上的、法律地位平等的当事人意思表示一致的协议;②合同以产生、变更或终止债权债务关系为目的;③合同是一种民事法律行为。在合同中,一般用甲方、乙方来指代交易…

    2022年9月6日
    3
  • sensor接口之DVP

    sensor接口之DVPsensor接口之DVP什么是DVPDVP时序PCLK、HSYNC、VSYNC对应关系sensor并行输出说明实际测量DVP信号什么是DVPDVP(DigitalVideoPort)是传统的sensor输出接口,采用并行输出方式,d数据位宽有8bit、10bit、12bit、16bit,是CMOS电平信号(重点是非差分信号),PCLK最大速率为96MHz,接口如下图:PCLK:pix…

    2022年6月11日
    62
  • pycharm 2022.01.12 激活[最新免费获取]

    (pycharm 2022.01.12 激活)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月31日
    41
  • beescms网站渗透测试和修复意见「建议收藏」

    beescms网站渗透测试和修复意见「建议收藏」beescms网站渗透测试目录1.环境搭建2.渗透前信息收集3.开始渗透Beescms实验环境搭建1、官方下载Beescmsv4.0,下载地址:http://beescms.com/cxxz.html2、解压压缩文件,然后把文件放到phpstudy的网站根目录3、浏览器访问http://127.0.0.1/beescms/install,开始安装4、一直下一步,出现如下界面,输入数据库账户密码5、成功安装6、修改mysql.ini文件,在mysqld下添加条目:secu

    2022年6月21日
    53

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号