C# Winform实现手机号码归属地查询工具
摘要:本文介绍使用C#开发基于Winform的手机号码归属地查询工具,并提供详细的示例代码供参考。
一、需求描述
输入正确的手机号码,查询该号码的归属地和其他相关信息。
二、需求分析
1、实现手机号码归属地查询的方法
01、本地数据库存储信息,查询本地库
02、调用WebService查询
03、通过Http请求Get方式从服务器上获取数据
2、方式分析:
01、采用本地数据库存储,可以断网查询,无需付费,但信息量较大占用本地资源
02、调用WebService必须连接网络,不占用本地资源,但公开的WebService大多数需要付费。
03、通过Http请求Get方式从服务器上获取数据的方式必须连接网络,不占用本地资源,无需付费。
通过以上分析,决定采用第3种方式实现
三、实现思路
寻找免费的手机号码归属地查询网址
通过一番寻找和对比,决定使用“手机号码归属地数据库API”这个网站上的查询接口。
首页地址:http://vip.showji.com/locating/help.htm
查询地址(返回结果页面):http://api.showji.com/Locating/query.aspx?m=手机号码
查询地址(返回xml数据):http://vip.showji.com/locating/?m=手机号码
通过跟踪调试网站的JS代码,发现返回结果页面是使用$("txtMobile").innerHTML=obj["Mobile"];的方式赋值的,这样的话页面是有值的,但查看源代码发现结果为空,所以无法通过抓取网页源码来提取结果值。
经过分析和反复试验发现,查询结果可以直接发回xml格式的数据,哈哈,亲,要的就是你。
有了xml数据就好办了,通过抓取网页Html代码,用一个string变量存储xml格式的数据,然后通过分析xml数据得到手机号码归属地信息。
四、实现方法(代码)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net; using System.IO; using System.Xml; namespace QueryLocating { public partial class formQueryLocating : Form { //Html网页代码 private string htmlCode = string.Empty; //运营商 private string corp = string.Empty; //手机卡类型 private string card = string.Empty; public formQueryLocating() { InitializeComponent(); } /// <summary> /// 查询 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnQuery_Click(object sender, EventArgs e) { if (txtm.Text.Trim().ToString() != "") { //抓取网页html代码 htmlCode = GetStringByUrl("http://vip.showji.com/locating/?m=" + txtm.Text.Trim().ToString()); //查询手机号码归属地 QueryLocating(htmlCode); } else { txtMobile.Text = ""; txtProvince.Text = ""; txtCity.Text = ""; txtAreaCode.Text = ""; txtPostCode.Text = ""; txtCard.Text = ""; MessageBox.Show("请输入手机号码!", "错误提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } } /// <summary> /// 查询手机号码归属地 /// </summary> /// <param name="htmlCode">网页Html代码</param> private void QueryLocating(string htmlCode) { //创建Xml实例 XmlDocument xmldoc = new XmlDocument(); //加载Xml文档 xmldoc.LoadXml(htmlCode); //获取Xml文档的根元素 XmlElement root = xmldoc.DocumentElement; //获取Xml文档的根元素下的所有子节点 XmlNodeList topNode = xmldoc.DocumentElement.ChildNodes; //子节点集合 XmlNodeList elemList; //遍历根元素下所有子节点 foreach (XmlElement element in topNode) { //根据节点名称获取节点元素值 elemList = root.GetElementsByTagName(element.Name); switch (element.Name) { //判断手机号码格式是否正确 case "QueryResult": if (elemList[0].InnerText.ToString() == "False") MessageBox.Show("您输入的手机号码格式有误,请重新输入!", "错误提示", MessageBoxButtons.OK, MessageBoxIcon.Information); continue; //手机号码 case "Mobile": txtMobile.Text = elemList[0].InnerText; break; //所属省份 case "Province": txtProvince.Text = elemList[0].InnerText; break; //所属城市 case "City": txtCity.Text = elemList[0].InnerText; break; //区号 case "AreaCode": txtAreaCode.Text = elemList[0].InnerText; break; //邮编 case "PostCode": txtPostCode.Text = elemList[0].InnerText; break; //运营商 case "Corp": corp = elemList[0].InnerText; break; //卡类型 case "Card": card = elemList[0].InnerText; //拼接字符串(运营商+卡类型) txtCard.Text = corp + card; break; } } } /// <summary> /// 抓取网页html代码 /// </summary> /// <param name="strUrl">URL</param> /// <returns></returns> private static string GetStringByUrl(string strUrl) { //与指定URL创建HTTP请求 WebRequest wrt = WebRequest.Create(strUrl); //获取对应HTTP请求的响应 WebResponse wrse = wrt.GetResponse(); //获取响应流 Stream strM = wrse.GetResponseStream(); //对接响应流(以"GBK"字符集) StreamReader SR = new StreamReader(strM, Encoding.GetEncoding("UTF-8")); //获取响应流的全部字符串 string strallstrm = SR.ReadToEnd(); //关闭读取流 SR.Close(); //返回网页html代码 return strallstrm; } } }
最终效果图:
源代码:https://files.cnblogs.com/jara/QueryLocating.rar
个人主要研究:金融系统、MIS系统、人力资源管理系统、数据采集系统、权限管理系统等等系统。主攻C#开发语言,Oracle、Sql Server,WCF和Remoting通信。
如需联系可加QQ:442389681 Email:lxc880615@163.com 手机:18922735098
QQ群交流:186841119 (请注明来自博客园)
博客园地址:http://www.cnblogs.com/jara/ http://www.cnblogs.com/luoyuhao/
提示:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如果觉得还有帮助的话,可以点一下右下角的【推荐】,希望能够持续的为大家带来好的技术文章!想跟我一起进步么?那就【关注】我吧。
如果对文章有任何问题,都可以在评论中留言,我会尽可能的答复您,谢谢您的阅读