当前位置:首页 > 网络编程 > WEB编程 > ASP.net >  根据IP获取当地天气预报的实现

 根据IP获取当地天气预报的实现

点击次数:32 次 发布日期:2008-11-26 10:48:06 作者:源代码网
源代码网推荐      访问www.163.com,首页的栏目里有当地的天气预报。可以猜想,这里的天气预报,应该是根据来访者的ip判断其所在地给出当地的天气情况。问了一些朋友,也证实了这一点。项目里也需要天气预报这个小栏目,同事做过一个(从其他站点抓取的),不过实现不了根据IP显示当地的天气情况,需要用户自行选择,而且抓取的站点属于小站….其可靠性值得怀疑。。所以就萌生了抓取网易的天气预报的想法。。。对页面进行分析。。发现显示天气预报的区域是一个IFrame,IFrame里嵌入了如下链接http://news.163.com/util/position1.html, 对这个地址访问直接跳转到另外一个链接http://news.163.com/weather/news/qx1/56294.html,此链接显示了天气情况,如图:
源代码网推荐  
源代码网推荐  
源代码网推荐  由此可以推测http://news.163.com/util/position1.html,是在根据来访者的IP判断所属区域,然后返回一个该地区所对应的区位码,如: 56294代表成都。如何让网易来帮我们的站点来访者判断所属区域,并给出天气情况,并显示在自己的站点页面上呢?还得继续分析。。因为http://news.163.com/util/position1.html,此链接一访问就转向到天气情况的链接,而无法查看源码。便猜想。。此页面肯定有些东西。。无奈之下。。WebRequest一下,出现了如下代码:
源代码网推荐  
源代码网推荐  以下是引用片段:
源代码网推荐   1<script language="Javascript">
源代码网推荐   2var city = new Array("安徽","黑龙江","山东","北京","湖北","山西","福建","湖南","陕西","甘肃","吉林","上海","广东","江苏","四川","广西","江西","天津","贵州","辽宁","西藏","海南","内蒙古","新疆","河北","宁夏","云南","河南","青海","浙江","重庆");
源代码网推荐   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[i]==cityname){
源代码网推荐  36 return weaths[i];
源代码网推荐  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.href="http://news.163.com/weather/news/qx1/"+NTES_WeatherAddr+".html";
源代码网推荐  55</script>
源代码网推荐  56
源代码网推荐  57
源代码网推荐  
源代码网推荐  
源代码网推荐    上面的这段js实现了对来访者IP判断并给出了天气预报结果的链接。Js里的此链接: http://202.108.39.152/ipquery,起到的是判断用户所在地的作用,返回的是来访者所在地省份。分析到此,想要的结果差不多就出来了…
源代码网推荐  
源代码网推荐    在客户端调用这段js获得天气预报结果的链接地址,然后交给服务端来处理。(为什么要交给后台处理,而不是直接显示呢?)因为直接得出的链接页面上,有多余的链接,还应用了样式(如图一),不便为自己所用,所以得处理掉。客户端调用服务端的方法很多,最初使用了Ajax框架Anthem,实现了过后,觉得有点杀鸡用牛刀的感觉。。无聊之余。。就又用CallBack实现了一次。。感觉恰到好处。。后来又发现。。__doPostBack也可以实现客户端调用服务端方法。。看来实现这么一个功能还真是简单。。。
源代码网推荐  
源代码网推荐    好了到此就实现了,自己想要的结果:(感觉有点遗憾的是只给出了省会城市的天气预报)
源代码网推荐  
源代码网推荐  
源代码网推荐  前台页面代码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("安徽","黑龙江","山东","北京","湖北","山西","福建","湖南","陕西","甘肃","吉林","上海","广东","江苏","四川","广西","江西","天津","贵州","辽宁","西藏","海南","内蒙古","新疆","河北","宁夏","云南","河南","青海","浙江","重庆");
源代码网推荐   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//根据Ip服务器返回的省份名称获取对应的编号
源代码网推荐   50function getCityWeatherID(cityname){
源代码网推荐   51 for(i=0;i<city.length;i++){
源代码网推荐   52 if(city[i]==cityname){
源代码网推荐   53 return weaths[i];
源代码网推荐   54 }
源代码网推荐   55 }
源代码网推荐   56 return "57816";
源代码网推荐   57}
源代码网推荐   58
源代码网推荐   59//获取所在地天气预报结果的链接
源代码网推荐   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//客户端调用服务端方法实现对天气预报结果链接的页面内容进行解析,Anthem实现方式
源代码网推荐   70function showWeatherByAnthem() {
源代码网推荐   71 Anthem_InvokePageMethod("ShowWeatherByAnthem", [], getServerResult);
源代码网推荐   72}
源代码网推荐   73
源代码网推荐   74function getServerResult(result) {
源代码网推荐   75 document.getElementById("result").innerHTML = result.value;
源代码网推荐   76}
源代码网推荐   77
源代码网推荐   78//客户端调用服务端方法实现对天气预报结果链接的页面内容进行解析,_doPostBack实现方式
源代码网推荐   79function showWeatherBylink()
源代码网推荐   80{
源代码网推荐   81 __doPostBack("LinkButton1","");
源代码网推荐   82}
源代码网推荐   83
源代码网推荐   84//客户端调用服务端方法实现对天气预报结果链接的页面内容进行解析,CallBack实现方式
源代码网推荐   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
源代码网推荐  
源代码网推荐  
源代码网推荐    后台代码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 回调的固定格式#region 回调的固定格式
源代码网推荐  21 public string str_content;
源代码网推荐  22
源代码网推荐  23 public void RaiseCallbackEvent(string the_string)
源代码网推荐  24 {
源代码网推荐  25 str_content = the_string;
源代码网推荐  26 }
源代码网推荐  27
源代码网推荐  28 /**//// <summary>
源代码网推荐  29 /// 回调,解析客户端的参数
源代码网推荐  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的页面内容的方法体#region 解析url的页面内容的方法体
源代码网推荐  44 /**//// <summary>
源代码网推荐  45 /// Anthem方式,解析获取的url的页面内容
源代码网推荐  46 /// </summary>
源代码网推荐  47 /// <param name="url">url</param>
源代码网推荐  48 /// <returns>解析结果</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 //回调方式,解析获取的url的页面内容
源代码网推荐  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
源代码网推荐  
源代码网推荐  
源代码网推荐  
源代码网推荐  
源代码网推荐    做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。
源代码网推荐


源代码网供稿.
网友评论 (0)
会员中心
网络编程
本站推荐
网络编程之精华