惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Vulnerabilities – Threatpost
U
Unit 42
F
Fortinet All Blogs
aimingoo的专栏
aimingoo的专栏
P
Proofpoint News Feed
F
Full Disclosure
月光博客
月光博客
Engineering at Meta
Engineering at Meta
博客园_首页
The Register - Security
The Register - Security
G
Google Developers Blog
The Cloudflare Blog
博客园 - Franky
K
Kaspersky official blog
A
Arctic Wolf
Scott Helme
Scott Helme
C
Cisco Blogs
Hugging Face - Blog
Hugging Face - Blog
C
Check Point Blog
NISL@THU
NISL@THU
AI
AI
D
DataBreaches.Net
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Stack Overflow Blog
Stack Overflow Blog
Project Zero
Project Zero
The GitHub Blog
The GitHub Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
量子位
Vercel News
Vercel News
T
Tor Project blog
P
Privacy International News Feed
D
Docker
I
Intezer
L
LangChain Blog
P
Proofpoint News Feed
Security Latest
Security Latest
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Threatpost
博客园 - 聂微东
AWS News Blog
AWS News Blog
Martin Fowler
Martin Fowler
P
Privacy & Cybersecurity Law Blog
V
V2EX
Last Week in AI
Last Week in AI
C
Cybersecurity and Infrastructure Security Agency CISA
The Hacker News
The Hacker News
T
Tenable Blog
Blog — PlanetScale
Blog — PlanetScale
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog

博客园 - 在路上...

Iphone的HEIC图片文件格式转换及相关开发工具 账号复活了 2015年,即将结束 CentOS 6 minimal 安装之后添加gnome Windows8离线安装.net framework 3.5 新年快到了,此记 flex中ComboBox对应的几种数据绑定 - 在路上... - 博客园 Jquery中增加参数与Json转换代码 - 在路上... - 博客园 如何获取到informix for linux? 建国大业 《红》mp3下载 T42内存升级 随便一帖 Informix 9.40UC9 on Redhat Linux AS 4安装手记 Taking the web Offline and On the Desktop Flex上传文件功能 乱弹ruby on rails目录下面的文件数有3万多个 Ruby on rails 2.0.2傻瓜入门之Hello world Javascript代码压缩、加密算法的破解分析及工具实现 【翻译】Oracle不同版本之间Export & Import的兼容性矩阵
Flex实现QQ网页提取天气信息
在路上... · 2008-08-02 · via 博客园 - 在路上...

以前用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="" width="110" styleName="myfont" id="t1"/>
    
<mx:Label x="75" y="129.5" text="" width="110" styleName="myfont" id="t2"/>
    
<mx:Label x="75" y="151.5" text="" width="110" styleName="myfont" id="t3"/>
    
<mx:Label x="75" y="175.5" text="" 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命令编译之后,运行效果如下:

 

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