获取天气预报代码修改

  由于最近比较忙,暂时只提供asp.net的代码更新,aspphp版本更新等闲下来了再修改。其实也就是修改了下正则表达式,大家有兴趣也可以自己研究下ashx文件中的正则表达式自己修改。


根据访问用户IP地址自动获取天气预报简易天气预报查询 代码修改如下
+展开
-C#
<%@ WebHandler Language="C#" Class="weather" %>

using System;
using System.Web;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;
using System.Net;
public class weather : IHttpHandler {
    /// <summary>
    /// 获取客户ip地址
    /// </summary>
    /// <returns></returns>
    private  string GetIP()
    {
        string ip = HttpContext.Current.Request.ServerVariables["http_x_forwarded_for"];
        if (!UserCheck.IsNotNull(ip)) ip = HttpContext.Current.Request.ServerVariables["remote_addr"];
        return ip;
    }
    private string RemoveHTML(string v)
    {
        if (string.IsNullOrEmpty(v)) return "";
        return Regex.Replace(v, "<[^>]+>""", RegexOptions.Compiled).Trim();
    }
    public void ProcessRequest(HttpContext context)
    {
        string Ip = GetIP(), area = "", json = "var weather={success:false};";

        if (Ip != null && !string.IsNullOrEmpty(Ip))
        {
            string[] arr = Ip.Split('.');
            double ipNum = 0, pow = 256;
            ipNum = double.Parse(arr[0]) * Math.Pow(pow, 3) + double.Parse(arr[1]) * Math.Pow(pow, 2)
                + double.Parse(arr[2]) * pow + double.Parse(arr[3]);
            DBHelper db = new DBHelper();
            object addr = DBHelper.ExecScalar("select addr from ipdb where ipe>=" + ipNum.ToString() + " and ipb<=" + ipNum.ToString(), db.CN);
            db.CloseDB();
            if (addr == null || addr.ToString() == "对方和您在同一内部网") addr = "桂林";           
            try
            {
                HttpWebRequest wr = (HttpWebRequest)HttpWebRequest.Create("http://php.weather.sina.com.cn/search.php?city=" + addr.ToString());
                string htmlBody = "";
                using (StreamReader sr = new StreamReader(wr.GetResponse().GetResponseStream(), Encoding.GetEncoding(936)))
                {
                    htmlBody = sr.ReadToEnd();
                }
                //桂林,多云转阴,16℃~7℃,风力:≤3级   ==>今天
                Regex r = new Regex(addr.ToString() + ",([^,]+),([^,]+),风力:([^']+)", RegexOptions.IgnoreCase | RegexOptions.Compiled)
                    // <li>风向:北风</li>
                    , dir = new Regex("<li>\\s*风向:([^<]+)</li>", RegexOptions.IgnoreCase | RegexOptions.Compiled)
                    //<div class="box_c weather_date">
                    , dsrx = new Regex("<div\\s+class=\"box_c\\s*weather_date\"\\s*>([\\s\\S]+?)</div>", RegexOptions.IgnoreCase | RegexOptions.Compiled)
                    , tbrx = new Regex("<table\\s+class=\"cell\"[^>]*>([\\s\\S]+?)</table>", RegexOptions.IgnoreCase | RegexOptions.Compiled)
                    , tdrx = new Regex("<td>([\\s\\S]+?)</td>", RegexOptions.Compiled | RegexOptions.IgnoreCase);
               
                if (r.IsMatch(htmlBody))
                {
                    DateTime dt = DateTime.Now;
                    Match m = r.Match(htmlBody);
                    json = "var weather={success:true,addr:'" + Format.Js(addr.ToString()) + "',weathers:[{d:'" + dt.ToString("yyyy-MM-dd") + "'"
                        + ",weather:'" + m.Groups[1].Value + "',tmp:'" + m.Groups[2].Value + "',dir:'" + dir.Match(htmlBody).Groups[1].Value + "',strong:'" + m.Groups[3].Value + "'}";

                    if (dsrx.IsMatch(htmlBody))
                    {
                        htmlBody = dsrx.Match(htmlBody).Groups[1].Value;
                        MatchCollection mcTB = tbrx.Matches(htmlBody), mcTD;
                        string dweather = "", nweather = "", dtmp = "", ntmp = "", ndir = "", ddir = "";
                        for (int i = 0; i < 2 && i < mcTB.Count; i++)
                        {
                            mcTD = tdrx.Matches(mcTB[i].Groups[1].Value);
                            dweather = mcTD[4].Groups[1].Value; nweather = mcTD[5].Groups[1].Value;
                            if (dweather != nweather) dweather = dweather + " 转 " + nweather;
                            dtmp = RemoveHTML(mcTD[6].Groups[1].Value); ntmp = RemoveHTML(mcTD[7].Groups[1].Value);
                            ddir = mcTD[8].Groups[1].Value; ndir = mcTD[9].Groups[1].Value;
                            if (ddir != ndir) ddir = ddir + " 转 " + ndir;
                            dt = dt.AddDays(1);
                            json += ",{d:'" + dt.ToString("yyyy-MM-dd") + "',weather:'" + dweather + "',tmp:'" + dtmp + "~" + ntmp + "',dir:'" + ddir + "'}";
                        }
                    }
                    json += "]};";
                }
            }
            catch { }
        }

        context.Response.Write(json);
    }
 
    public bool IsReusable {
        get {
            return false;
        }
    }

}




加支付宝好友偷能量挖...


原创文章,转载请注明出处:获取天气预报代码修改

评论(0)Web开发网
阅读(206)喜欢(0)Asp.Net/C#/WCF