(zhuan)http://bbs.99081.com/viewthread.php?tid=346101根據(jù)IP獲取當(dāng)?shù)靥鞖忸A(yù)報(bào)的實(shí)現(xiàn)
訪問(wèn)
www.163.com,
首頁(yè)的欄目里有當(dāng)?shù)氐奶鞖忸A(yù)報(bào)。可以猜想,這里的天氣預(yù)報(bào),應(yīng)該是根據(jù)來(lái)訪者的ip判斷其所在地給出當(dāng)?shù)氐奶鞖馇闆r。問(wèn)了一些朋友,也證實(shí)了這一點(diǎn)。項(xiàng)目
里也需要天氣預(yù)報(bào)這個(gè)小欄目,同事做過(guò)一個(gè)(從其他站點(diǎn)抓取的),不過(guò)實(shí)現(xiàn)不了根據(jù)IP顯示當(dāng)?shù)氐奶鞖馇闆r,需要用戶自行選擇,而且抓取的站點(diǎn)屬于小
站….其可靠性值得懷疑。。所以就萌生了抓取網(wǎng)易的天氣預(yù)報(bào)的想法。。。對(duì)頁(yè)面進(jìn)行分析。。發(fā)現(xiàn)顯示天氣預(yù)報(bào)的區(qū)域是一個(gè)IFrame,IFrame里嵌
入了如下鏈接http: //news.163.com/util/position1.html,對(duì)這個(gè)地址訪問(wèn)直接跳轉(zhuǎn)到另外一個(gè)鏈接
http://news.163.com/weather/news/qx1/56294.html,此鏈接顯示了天氣情況,如圖:
由此可以推測(cè)
http://news.163.com/util/position1.html,
是在根據(jù)來(lái)訪者的IP判斷所屬區(qū)域,然后返回一個(gè)該地區(qū)所對(duì)應(yīng)的區(qū)位碼,如:
56294代表成都。如何讓網(wǎng)易來(lái)幫我們的站點(diǎn)來(lái)訪者判斷所屬區(qū)域,并給出天氣情況,并顯示在自己的站點(diǎn)頁(yè)面上呢?還得繼續(xù)分析。。因?yàn)閔ttp:
//news.163.com/util/position1.html,此鏈接一訪問(wèn)就轉(zhuǎn)向到天氣情況的鏈接,而無(wú)法查看源碼。便猜想。。此頁(yè)面肯定有
些東西。。無(wú)奈之下。。WebRequest一下,出現(xiàn)了如下代碼:
以下是引用片段:
1<script language="Javascript">
2var
city = new
Array("安徽","黑龍江","山東","北京","湖北","山西","福建","湖南","陜西","甘肅","吉林","上海","廣
東","江蘇","四川","廣西","江西","天津","貴州","遼寧","西藏","海南","內(nèi)蒙古","新疆","河北","寧夏","云
南","河南","青海","浙江","重慶"

;
3var weaths = new
Array('58321','50953','54823','54511','57494','53772','59134','57679','57036','52889','54172','58367','59287','58238','56294','59431','58606','54527','57816','54342','55591','52856','53463','51463','53698','53614','56778','57083','52866','58457','57516');
4
5function getCookieVal (offset) {
6 var endstr = document.cookie.indexOf (";", offset);
7 if (endstr == -1)
8 endstr = document.cookie.length;
9 return unescape(document.cookie.substring(offset, endstr));
10}
11function GetCookie (name) {
12 var arg = name + "=";
13 var alen = arg.length;
14 var clen = document.cookie.length;
15 var i = 0;
16 while (i < clen) {
17 var j = i + alen;
18 if (document.cookie.substring(i, j) == arg)
19 return getCookieVal (j);
20 i = document.cookie.indexOf(" ", i) + 1;
21 if (i == 0)
22 break;
23 }
24 return "";
25}
26function SetCookie(cookieName,cookieValue,nDays) {
27 var today = new Date();
28 var expire = new Date();
29 if (nDays==null || nDays==0) nDays=1;
30 expire.setTime(today.getTime() + 3600000*24*nDays);
31 document.cookie = cookieName+"="+escape(cookieValue) + ";path=/;domain=.163.com;expires="+expire.toGMTString();
32}
33function getCityWeatherID(cityname){
34 for(i=0;i<city.length;i++){
35 if(city
==cityname){
36 return weaths;
37 }
38 }
39 return "54511";
40}
41
42var NTES_WeatherAddr = GetCookie("NTES_WeatherAddr"
;
43if (!NTES_WeatherAddr){
44 var loc = GetCookie("theaddr"
;
45 if(!loc){
46 document.write("<script type='text/javascript' src='http://202.108.39.152/ipquery'><" + "/script>");
47 }
48}
49</script>
50<script>
51if (!NTES_WeatherAddr){
52 NTES_WeatherAddr=getCityWeatherID(loc);
53}
54window.location.;
55</script>
56
57
上面的這段js實(shí)現(xiàn)了對(duì)來(lái)訪者IP判斷并給出了天氣預(yù)報(bào)結(jié)果的鏈接。Js里的此鏈接: http://202.108.39.152/ipquery,起到的是判斷用戶所在地的作用,返回的是來(lái)訪者所在地省份。分析到此,想要的結(jié)果差不多就出來(lái)了…
在客戶端調(diào)用這段js獲得天氣預(yù)報(bào)結(jié)果的鏈接地址,然后交給服務(wù)端來(lái)處理。(為什么要交給后臺(tái)處理,而不是直接顯示呢?)因?yàn)橹苯拥贸龅逆溄禹?yè)面上,
有多余的鏈接,還應(yīng)用了樣式(如圖一),不便為自己所用,所以得處理掉。客戶端調(diào)用服務(wù)端的方法很多,最初使用了Ajax框架Anthem,實(shí)現(xiàn)了過(guò)后,
覺(jué)得有點(diǎn)殺雞用牛刀的感覺(jué)。。無(wú)聊之余。。就又用CallBack實(shí)現(xiàn)了一次。。感覺(jué)恰到好處。。后來(lái)又發(fā)現(xiàn)。。__doPostBack也可以實(shí)現(xiàn)客戶
端調(diào)用服務(wù)端方法。。看來(lái)實(shí)現(xiàn)這么一個(gè)功能還真是簡(jiǎn)單。。。
前臺(tái)頁(yè)面代碼Defaul.aspx:
以下是引用片段:
1<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="Default.aspx.cs"
Inherits="_Default" ResponseEncoding="GB2312" %>
2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3<html xmlns="http://www.w3.org/1999/xhtml">
4<head runat="server">
5<title></title>
6<script>
7var city = new
Array("安徽","黑龍江","山東","北京","湖北","山西","福建","湖南","陜西","甘肅","吉林","上海","廣
東","江蘇","四川","廣西","江西","天津","貴州","遼寧","西藏","海南","內(nèi)蒙古","新疆","河北","寧夏","云
南","河南","青海","浙江","重慶");
8var weaths = new
Array('58321','50953','54823','54511','57494','53772','59134','57679','57036','52889','54172','58367','59287','58238','56294','59431','58606','54527','57816','54342','55591','52856','53463','51463','53698','53614','56778','57083','52866','58457','57516');
9
10var NTES_WeatherAddr = GetCookie("NTES_WeatherAddr");
11if (!NTES_WeatherAddr){
12 var loc = GetCookie("theaddr");
13 if(!loc){
14 document.write("<script type='text/javascript' src='http://202.108.39.152/ipquery'><" + "/script>");
15 }
16}
17
18function getCookieVal (offset) {
19 var endstr = document.cookie.indexOf (";", offset);
20 if (endstr == -1)
21 endstr = document.cookie.length;
22 return unescape(document.cookie.substring(offset, endstr));
23}
24
25function GetCookie (name) {
26 var arg = name + "=";
27 var alen = arg.length;
28 var clen = document.cookie.length;
29 var i = 0;
30 while (i < clen) {
31 var j = i + alen;
32 if (document.cookie.substring(i, j) == arg)
33 return getCookieVal (j);
34 i = document.cookie.indexOf(" ", i) + 1;
35 if (i == 0)
36 break;
37 }
38 return "";
39}
40
41function SetCookie(cookieName,cookieValue,nDays) {
42 var today = new Date();
43 var expire = new Date();
44 if (nDays==null || nDays==0) nDays=1;
45 expire.setTime(today.getTime() + 3600000*24*nDays);
46 document.cookie = cookieName+"="+escape(cookieValue) + ";path=/;domain=.163.com;expires="+expire.toGMTString();
47}
48
49//根據(jù)Ip服務(wù)器返回的省份名稱獲取對(duì)應(yīng)的編號(hào)
50function getCityWeatherID(cityname){
51 for(i=0;i<city.length;i++){
52 if(city
==cityname){
53 return weaths;
54 }
55 }
56 return "57816";
57}
58
59//獲取所在地天氣預(yù)報(bào)結(jié)果的鏈接
60function getWeatherUrl(){
61if (!NTES_WeatherAddr){
62 NTES_WeatherAddr=getCityWeatherID(loc);
63
64}
65var addr="http://news.163.com/weather/news/qx1/"+NTES_WeatherAddr+".html";
66document.form1.Text1.value=addr;
67}
68
69//客戶端調(diào)用服務(wù)端方法實(shí)現(xiàn)對(duì)天氣預(yù)報(bào)結(jié)果鏈接的頁(yè)面內(nèi)容進(jìn)行解析,Anthem實(shí)現(xiàn)方式
70function showWeatherByAnthem() {
71 Anthem_InvokePageMethod("ShowWeatherByAnthem", [], getServerResult);
72}
73
74function getServerResult(result) {
75 document.getElementById("result").innerHTML = result.value;
76}
77
78//客戶端調(diào)用服務(wù)端方法實(shí)現(xiàn)對(duì)天氣預(yù)報(bào)結(jié)果鏈接的頁(yè)面內(nèi)容進(jìn)行解析,_doPostBack實(shí)現(xiàn)方式
79function showWeatherBylink()
80{
81 __doPostBack('LinkButton1','');
82}
83
84//客戶端調(diào)用服務(wù)端方法實(shí)現(xiàn)對(duì)天氣預(yù)報(bào)結(jié)果鏈接的頁(yè)面內(nèi)容進(jìn)行解析,CallBack實(shí)現(xiàn)方式
85function showWeatherByCallBack()
86{
87 var context=document.getElementById("result");
88 var weatherUrl=document.getElementById("Text1");
89 var arg="ShowWeatherByCall|" + weatherUrl.value;
90 <%= ClientScript.GetCallbackEventReference(this,"arg","outPutResult","context")%>;
91}
92function outPutResult(result)
93{
94 document.getElementById("result").innerHTML = result;
95
96}
97</script>
98</head>
99<body onload="getWeatherUrl(),showWeatherByCallBack()">
100 <form id="form1" runat="server">
101 <span id="result"></span>
102 <input id="Text1" type="hidden" runat="server" />
103 </form>
104</body>
105</html>
106
后臺(tái)代碼Default.cs:
以下是引用片段:
1using System;
2using System.Data;
3using System.Configuration;
4using System.Web;
5using System.Web.Security;
6using System.Web.UI;
7using System.Web.UI.WebControls;
8using System.IO;
9using System.Net;
10using Anthem;
11
12public partial class _Default : System.Web.UI.Page, ICallbackEventHandler
13{
14 protected void Page_Load(object sender, EventArgs e)
15 {
16 Anthem.Manager.Register(this);
17
18 }
19
20 回調(diào)的固定格式#region 回調(diào)的固定格式
21 public string str_content;
22
23 public void RaiseCallbackEvent(string the_string)
24 {
25 str_content = the_string;
26 }
27
28 /**//// <summary>
29 /// 回調(diào),解析客戶端的參數(shù)
30 /// </summary>
31 /// <returns></returns>
32 public string GetCallbackResult()
33 {
34
35 string[] parts = str_content.Split('|');
36 object[] theArgList = new object[parts.Length - 1];
37 for (int int_index = 1; int_index < parts.Length; int_index++)
38 theArgList[int_index - 1] = parts[int_index];
39 return (string)GetType().GetMethod(parts[0]).Invoke(this, theArgList);
40 }
41 #endregion
42
43 解析url的頁(yè)面內(nèi)容的方法體#region 解析url的頁(yè)面內(nèi)容的方法體
44 /**//// <summary>
45 /// Anthem方式,解析獲取的url的頁(yè)面內(nèi)容
46 /// </summary>
47 /// <param name="url">url</param>
48 /// <returns>解析結(jié)果</returns>
49 [Anthem.Method]
50 public string ShowWeatherByAnthem()
51 {
52
53 WebRequest request = WebRequest.Create(Text1.Value);
54 request.Credentials = CredentialCache.DefaultCredentials;
55 HttpWebResponse response = (HttpWebResponse)request.GetResponse();
56 Stream dataStream = response.GetResponseStream();
57 StreamReader reader = new StreamReader(dataStream, System.Text.Encoding.Default);
58 string str = reader.ReadToEnd();
59 return str.Substring(220);
60
61 }
62 //<summary>
63 //回調(diào)方式,解析獲取的url的頁(yè)面內(nèi)容
64 //</summary>
65 //<param name="url"></param>
66 //<returns></returns>
67 public string ShowWeatherByCall(string url)
68 {
69 WebRequest request = WebRequest.Create(url);
70 request.Credentials = CredentialCache.DefaultCredentials;
71 HttpWebResponse response = (HttpWebResponse)request.GetResponse();
72 Stream dataStream = response.GetResponseStream();
73 StreamReader reader = new StreamReader(dataStream, System.Text.Encoding.Default);
74 string str = reader.ReadToEnd();
75 return str.Substring(220);
76
77 }
78 #endregion
79}
80