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而已,想不通。

 

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 博科FC光纤交换机zone配置[通俗易懂]

    博科FC光纤交换机zone配置[通俗易懂]zonecreate“a01”,“1,0;1,4”//创建zone,命名为01,将1.01.4这两个端口加入zonea01中zonecreate“a02”,“1,1;1,4”zonecreate“a03”,“1,2;1,4”zonecreate“a04”,“1,3;1,4”cfgcreate“abcd”,”a01;a02;a…

  • 2020低压电工模拟考试及低压电工实操考试视频

    2020低压电工模拟考试及低压电工实操考试视频题库来源:安全生产模拟考试一点通公众号小程序2020低压电工模拟考试及低压电工实操考试视频,包含低压电工模拟考试答案解析及低压电工实操考试视频练习。由安全生产模拟考试一点通公众号结合国家低压电工考试最新大纲及低压电工考试真题出具,有助于低压电工考试试题考前练习。1、【判断题】特种作业人员未经专门的安全作业培训,未取得相应资格,上岗作业导致事故的,应追究生产经营单位有关人员的责任。(√)2、【判断题】正弦交流电的周期与角频率的关系互为倒数的。(×)3、【判断题】遮栏是为防止…

  • PXE及PXE启动

    PXE及PXE启动PXE(Pre-bootExecutionEnvironment)是由Intel设计的协议,它可以使计算机通过网络启动。协议分为client和server两端,PXEclient在网卡的ROM中,当计算机引导时,BIOS把PXEclient调入内存执行,并显示出命令菜单,经用户选择后,PXEclient将放置在远端的操作系统通过网络下载到本地运行。  PXE协议的成功运行需要解决以下

  • linux搭建邮件服务器配置_docker 邮件服务器

    linux搭建邮件服务器配置_docker 邮件服务器Postfix配置并设置账户认证(Postfix+Sasl)记录一下,比较简单的使用安装Postfix系统一般都自带了Postfix,如果不清楚可以使用下面的指令检查rpm-qa|greppostfix如果没用安装Postfix则使用以下指令安装yum-yinstallpostfix安装sasldb、saslauthd用来提供smtp的虚拟账户和密码服务sasldb2包含在saslauthd当中使用指令yum-yinstallcyrus-saslcy.

    2022年10月20日
  • 计算机网络 | 思科网络 | ACL通配符掩码「建议收藏」

    计算机网络 | 思科网络 | ACL通配符掩码「建议收藏」目录一.什么是通配符掩码二.使用通配符掩码三.通配符掩码示例1.使用通配符掩码匹配IPv4子网2.使用通配符掩码匹配网络范围四.计算通配符掩码1.通配符掩码计算:示例12.通配符掩码计算:示例23.通配符掩码计算:示例3五.通配符掩码关键字1.示例1:匹配单个IPv4地址的通配符掩码过程2.示例2:匹配所有IPv4地址的通配符掩码过程一.什么是通配符掩码通配符掩码是由32个二进制数字组成的字符串,路由器使用它来确定检查地址的

发表回复

您的电子邮箱地址不会被公开。

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