彭 飛,趙清揚
(1.四川省德陽市氣象局,四川 德陽 618000;2.四川省氣象服務中心,四川 成都 610072)
目前,我國的氣象服務體系由決策氣象服務、公眾氣象服務、專業專項氣象服務和氣象科技服務構成[1-3]。專業氣象服務[4-8]是公共氣象服務的重要組成部分,是對一些行業用戶提供專業的氣象服務,是根據用戶的需求而制作相應的預報服務。由于專業用戶所在行業不同,對氣象服務的需求也各不相同,這給從事專業氣象服務的工作人員提出了新的課題:如何才能快速應對各行業用戶多樣化的業務需求。
通過梳理各種專業氣象服務的需求不難發現,其核心就是天氣預報服務。精細化格點要素預報是目前中國氣象局的主推業務和未來天氣預報的發展方向[9-11]。在2017年底前,我國氣象預報服務統一數據源的“一張網”網格預報業務已經開始正式運行。位于國家氣象中心天氣業務內網中的智能網格預報[12-17]應用分析平臺網站提供了基于位置的精細化氣象服務,實現了天氣預報從傳統站點預報向格點預報的轉變。在該網站的前端頁面上,提供了根據某點經緯度信息來獲得該點未來10 d天氣預報數據的功能,相應的預報數據可以從頁面上下載并導出到Excel格式的文檔中。從前端頁面經緯度數據的準備和提交,到下載服務器返回的數據到本地,再對數據進行分析處理,最終形成氣象服務產品和文檔,都需要手工操作,流程繁瑣、效率低下,還容易出錯。用軟件來實現以上過程將極大地提高工作效率。
下文,以開發德陽市高速公路智能網格預報服務軟件為例,介紹利用Fiddler抓包工具軟件和Aspose.Words for .NET[18-20]類庫相結合,一鍵實現客戶端向服務器發出請求、從服務器返回的信息中解析出需要的預報數據、并將數據寫入Word模板中,自動地生成德陽市高速公路專業氣象服務產品文檔的全部功能。
用軟件來模擬瀏覽器向服務器請求數據時,要明確客戶端需要向服務器發送什么樣的參數,從服務器返回的信息中哪些數據是有用的預報數據。這就需要Fiddler等抓包工具軟件在瀏覽器向服務器請求數據的過程中,對請求的各種參數和返回的信息進行偵測。當獲取到預報數據后,再結合Aspose.Words for .NET類庫自動生成Word格式的氣象服務產品文檔。
Fiddler是強大的HTTP調試抓包工具,可以用其檢測網頁和服務器的交互情況,其原理是以Web代理服務器的形式進行工作的,它能記錄客戶端和服務器之間的http和https所有通訊,查看所有的“進出”Fiddler的數據。
Aspose.Words for .NET是.NET環境下功能強大的Word文檔處理類庫,它支持DOC、PDF、RTF、OOXML、HTML、OpenDocument、EPUB、XPS等格式。通過Aspose.Words for .NET類庫和.NET平臺下的編程語言相結合,在沒有安裝Microsoft Word軟件的環境中,也可以生成Word格式的文檔,并能對文檔進行查看、修改、渲染、格式轉換以及打印等操作,也無需考慮Microsoft Office軟件的版本兼容性問題,靈活地實現辦公文檔的自動化。
首先,運行Fiddler軟件,確保軟件的Capture Traffic是開啟的。用瀏覽器訪問智能網格預報應用分析平臺網站,在網頁的文本框中輸入某站點的經緯度數據,并把數據向網站服務器提交。服務器在接收到瀏覽器的請求后,向前端頁面返回該站點連續10 d的天氣預報,返回的氣象要素包括:降水量、氣溫、風速、相對濕度和云量。Fiddler詳細而完整地記錄了從提交請求到返回數據這一過程。
在Fiddler軟件的數據包列表窗口中,點擊和智能網格預報應用分析平臺網站(Ip地址為10.1.64.146)相關的數據包,在右側請求(即客戶端發出的數據)窗口中的Headers標簽頁顯示的數據就是客戶端向服務器請求數據時需要的各個參數,包括請求方式、協議、Client頭域、主機名或域名等。在響應(服務器返回的數據)窗口中的TextView標簽頁顯示的是從服務器返回給客戶端的數據,這些數據是以JSON對象的方式呈現的,其中包括以“category”、“data”和“publishDate”為鍵名的鍵值對。通過分析可知,“category”鍵對應的值是氣象要素的預報時間,“data”鍵對應的值是氣象要素的預報值,“publishDate”鍵對應的值是智能網格預報發布的時間。如圖1所示。
首先,在Visual Studio IDE(Integrated Development Environment:集成開發環境)中建立一個WinForm項目,在工程中添加對Aspose.Words.dll和Newtonsoft.Json.dll文件的引用,并引入命名空間:
using Aspose.Words;
using Newtonsoft.Json.Linq;
模擬瀏覽器向服務器發起請求的主要代碼如下:
string longitude = longitudeAndLatitude.Split(',')[0];//經度
string latitude = longitudeAndLatitude.Split(',')[1];//緯度
if(element.ToLower() == "rain")//降水
{
strURL = "http://10.1.64.146/WebHandler/MeteoHandler?method=getmeteodat
ablockfeatureinfo&type=grid&relativePath=/forecast/QPF_V2/gridrain03&format=grid03_{yyyyMMddHH}.{XXX}&publishDate=" + publishDate +"&lat=" + latitude + "&lng=" + longitude + "&day=10";
}
……(向服務器請求氣溫、風速和云量的代碼與降水相似,此處略去。)

圖1 Fiddler偵測瀏覽器和服務器之間的通訊Fig.1 Fiddler detects communication between the browser and the server
然后,解析從服務器返回的JSON格式的數據,主要代碼如下:
var responseStr = HttpGet(url);//用各個URL和對應的參數查詢
JObject jObj = JObject.Parse(responseStr);//反序列化Json數據
//存放日期時間的數組
JArray dataArrayDatetime = JArray.Parse(jObj["category"].ToString());
JArray dataArray = JArray.Parse(jObj["data"].ToString());//存放元素值的數組
int intCountOfData = dataArrayDatetime.Count;
//字典,用于存儲全部的日期時間及其對應的數據(氣溫、降水、風速、云量)
Dictionary
//每次請求URL時返回的時間和元素值對應(個數相等)
for(int i = 0; i < intCountOfData; i++)
dict.Add(dataArrayDatetime[i].ToString(), dataArray[i].ToString());
……
最后,把預報數據寫入事先準備好的Word模板中,以便生成服務產品文檔。關鍵代碼如下:
Aspose.Words.Document doc = new Aspose.Words.Document(strDocPath);
Aspose.Words.Bookmarkdatetime_header = doc.Range.Bookmarks["datetime_header"]; //當前書簽 datetime_header
SetBookmarkValue(datetime_header, strYMD_bookmark);//給當前書簽的文本賦值
……
bookmark = doc.Range.Bookmarks[tq_bookmark]; //當前書簽(天氣現象)
SetBookmarkValue(bookmark, tq_dic[curDT]);//給當前書簽的文本賦值
……
sfd.FileName = strYMD_file + ".docx";//要保存的文件名(word格式)
doc.Save(sfd.FileName);//保存文檔
……
軟件最終生成的德陽市高速公路專業氣象服務產品文檔截圖(部分)如圖2所示。

圖2 高速公路專業氣象服務產品Fig.2 Documentation of Expressway Meteorological Service Products
通過利用抓包軟件監視瀏覽器和智能網格預報網站服務器之間的通訊,可以詳細地掌握客戶端向服務器請求數據時需要提供的參數和從服務器向客戶端返回的數據,從而為開發軟件來模擬瀏覽器向服務器請求數據提供了依據。再配合功能強大的Aspose.Words for .NET第三方類庫,可以非常高效地實現智能網格預報專業氣象服務產品文檔的一鍵生成,極大地提高了工作效率。