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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • LDAP统一认证服务解决方案[通俗易懂]

    LDAP是什么首先LDAP是一种通讯协议,LDAP支持TCP/IP。协议就是标准,并且是抽象的。在这套标准下,AD(ActiveDirectory)是微软出的一套实现。 那AD是什么呢?暂且把它理解成是个数据库。也有很多人直接把LDAP说成数据库(可以把LDAP理解成存储数据的数据库)。像是其他数据库一样,LDAP也是有client端和server端。server端是用来存放资源,client端用来操作增删改查等操作。 而我们通常说的LDAP是指运行这个数据库的服务器。 可以简单理解AD=LD

    2022年4月8日
  • windows 2008文件服务器审计

    windows 2008文件服务器审计windows2008或者windows2008r2,系统做域内的文件服务器,能否做到谁删除某个共享出来的文件夹或者文件的操作审计?审计级别能做到怎么样一个程度?回答:依据您的问题您想知道Windows2008文件服务器的审计相关。依据我的经验,这个要分成两种情况:1.在远端访问,就是通过网络路径访问;2.在本地上本地访问共享文件,就是在创建的机器上访问;远端访问访问共享文件…

    2022年6月4日
  • T-SQL基础–TOP

    T-SQL基础–TOP

    2021年11月26日
  • mysql索引b树b+树_索引为什么用b+树而不是b树

    mysql索引b树b+树_索引为什么用b+树而不是b树第一篇引用第二篇引用第三篇引用第四篇引用

    2022年8月8日
  • 倒立摆模型分析_倒立摆系统建模方法

    倒立摆模型分析_倒立摆系统建模方法模型对小车的水平受力分析Mx¨=F−bx˙−NM\ddot{x}=F-b\dot{x}-NMx¨=F−bx˙−Nx¨\ddot{x}x¨代表对运动距离的二阶微分,即小车在外力作用下的加速度。FFF是外部施加给系统的外力。x˙\dot{x}x˙代表小车当前的运动速度,小车所受到的摩擦力为摩擦系数与小车运动速度之积,即f=bx˙f=b\dot{x}f=bx˙。NNN为倒单摆作用给小车水平方向的力。对倒单摆的受力分析摆杆做平面运动,可以分解为质心的平动和绕质心的转动。N=mx¨−(mlψ

    2022年8月18日
  • 软件激活成功教程官网_激活成功教程软件资源

    软件激活成功教程官网_激活成功教程软件资源[转]国内软件激活成功教程下载网站列表!Postedon2005-04-2511:17Laser.NET阅读(872)评论(1)编辑收藏国内最有信誉的激活成功教程下载网站,总能让你有意外收获。18DD资源中心:http://www.18dd.com7年:http://www.7year.com/热战软件园:http://soft.rezhan.comwqsky:http…

    2022年10月11日

发表回复

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

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