揭开邮局EMS快递单查询原理

现在都是流行网上购物了,大家一定关心自己购买东西快递现在已经发到什么地方了,现在想查一查。当然现在有很多提供这种服务,我今天就给大家实现一个无需打开浏览器就可以实现EMS快递查询,简单讲述其原理。以下是我简单画的流程图(随便用office画,很山賽,哈哈):

(1)EMS网站

(2)流程图

(3)结果图:

 好了,我们开始源码吧:

/**
 * 查询EMS快递状态
 * @author  luodongfu

*  我把我实现的代码全部贴出来,哈哈。
 */

public class GetEms
{
 public static void main(String[] args)
 {

//我这里使用WebClient 来抓去
  WebClient webClient = new WebClient(BrowserVersion.INTERNET_EXPLORER_7);
  webClient.setActiveXNative(true);
  webClient.setJavaScriptEnabled(true);
  HtmlPage loginPage = null;
  try
  {

//打开ems邮局网站
   loginPage = webClient
     .getPage("http://www.ems.com.cn/qcgzOutQueryAction.do?reqCode=gotoSearch");
  } catch (Exception e1)
  {
   e1.printStackTrace();
  }
  if (loginPage == null)
  {
   return;
  }

//找到查询页面的表单以及其中的
  HtmlForm loginForm = loginPage.getFormByName("form1");

//找到快递单输入框
  HtmlTextInput mailNum = loginForm.getInputByName("mailNum");

//找到快递单验证码输入框,这个ems很狡诈,每天这个F346F82440A3AAC78473802都会变,

所以最好加一个判断如果出错的话就直接抓去页面这个值。我这里就写死了,呵呵
  HtmlTextInput codestr = loginForm.getInputByName("F346F82440A3AAC78473802");
  HtmlImage p = null;

//找到验证码图片
  DomNodeList<HtmlElement> ps = loginPage.getElementsByTagName("img");
  boolean success = false;
  File f = null;

//遍历查询图片,如果找到该图片则保存到D盘111.png文件
  for (HtmlElement ht : ps)
  {
   if (ht instanceof HtmlImage)
   {
    HtmlImage img = (HtmlImage) ht;
    String alt = img.getAltAttribute();
    if (alt != null && alt.contains("不清?点击换图"))
    {
     f = new File("D://111.png");
     if (f.isFile() && f.exists())
     {
      f.delete();
     }

//保存图片
     try
     {
      img.saveAs(f);
      success = true;
     } catch (Exception e)
     {
      e.printStackTrace();
     }
     System.out.println("识别码图片文件写入磁盘OK");
     if (success)
     {
      break;
     }
    }
   }
  }

//如果图片保存成功,则弹出图片显示

if (success)
  {
   try
   {
    Runtime.getRuntime().exec(
      "cmd.exe   /c   start   " + f.getCanonicalPath());
   } catch (IOException e2)
   {
    e2.printStackTrace();
   }

//提示输入验证码

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
   String str = null;
   System.out.println("请将你看到的识别码输入:");
   try
   {
    str = br.readLine();
   } catch (IOException e)
   {
    e.printStackTrace();
   }
   if (str != null && !str.trim().equals(""))
   {
    str = str.trim();
    codestr.setValueAttribute(str);

//这里是邮局EMS快递单,我这里写死,你可以做一个提示用户输入
    mailNum.setValueAttribute("EF706866075CS");

System.out.println("你输入的识别码是:" + str);
    HtmlImageInput button = (HtmlImageInput) loginForm.getInputByName("optijiaot");
    try
    {
     Page rsp = button.click();//模拟用户点击提交数据
     if (rsp instanceof HtmlPage)
     {
      loginPage = (HtmlPage) rsp;
      success = true;
     }
    } catch (Exception e)
    {
     success = false;
     e.printStackTrace();
    }

//如果查询成功,则开始解析结果
    if (success)
    {

//解析返回的结果,ems这个表格table 做的很垃圾,一个table 里面包含一个table 很多,而且table.

// id 一个都没有,他娘的什么鸟人编html的程序。这里我解析部分省略了,呵呵
     parseTable(loginPage.asXml());
   
  }

}

//删除空格

public static String replaceBlank(String tt)
 {
    Pattern p = Pattern.compile("//s*|/t|/r|/n");
    Matcher m = p.matcher(tt);
    if(m.find())
    {
     String after = m.replaceAll("");
     return after;
    }
    return null;

}
}

好了结果出来了:

识别码图片文件写入磁盘OK
请将你看到的识别码输入:
R72C
你输入的识别码是:R72C

2010-05-06   10:11:34   武义县    到达处理中心,来自武义县邮政局速递公司  
    2010-05-06   12:15:48   武义县    离开处理中心,发往金华市邮政局分拣分局  
    2010-05-06   13:57:36   金华市    到达处理中心,来自武义县  
    2010-05-06   18:55:07   金华市    离开处理中心,发往北京市  
    2010-05-10   12:57:15   北京邮政陆路速递邮件处理中心    到达处理中心,来自金华市  
    2010-05-10   16:54:08   北京邮政陆路速递邮件处理中心    离开处理中心,发往北京邮政速递世纪城分公司香山营投部  
    2010-05-11   07:15:35   北京邮政速递世纪城分公司香山营投部    到达处理中心,来自北京市  
    2010-05-11   07:45:59   北京邮政速递世纪城分公司香山营投部    安排投递  
    2010-05-11   09:20:00   北京邮政速递世纪城分公司香山营投部    妥投  
 您的邮件于2010-05-11 09:20:00(北京邮政速递世纪城分公司香山营投部)已妥投投递结果:董波代收

最后注意以下的F346F82440A3AAC78473802东东:

最好从其页面抓去,不然为出错,哈哈。我懒,所以我就写死了。

HtmlTextInput codestr = loginForm.getInputByName("F346F82440A3AAC78473802");

揭开邮局EMS快递单查询原理相关推荐

  1. 【C#+SQL Server+打印组件】实现电商快递单打印系统 六:快递单查询模块设计(附源码和资源)

    需要源码和资源请点赞关注收藏后评论区留言私信~~~ 一.快递单查询模块概述 打印后的快递单记录被保存到数据库中,快递单查询窗体提供了查询打印记录,修改打印记录,删除打印记录以及重新打印单据的功能 实现 ...

  2. EMS快递单号也能批量查询?怎么操作呢

    很多电商平台的商家应该都会为如何批量查询快递单号的问题所困扰吧,今天我们以EMS快递为例子,分享一招教你轻松快速批量查询大量EMS快递的方法,利用一款小工具:"固乔快递查询助手"就 ...

  3. EMS | 快递单号查询API

    电商平台及ISV商家对物流api接口的需求有很多,最常见的场景就是电商网站用户打开"我的订单"时调用此API显示物流信息详情,电商管理后台的物流系统,客服在对账前查询所有运单的签收 ...

  4. 一次性查询大量EMS快递单号的方法介绍

    我们都知道,想要做好电商运营,售后这一块是非常重要的,如果卖家因为售后没有及时跟踪到位,很容易造成快递丢失,从而引起的不必要的投诉还有赔付等问题.那有什么办法可以帮助我们批量查询单号,集中管理快递售后 ...

  5. 批量查询EMS快递单号的方法,求分享

    想要及时跟踪快递,批量查询快递单号,时刻关注快递的动态,需要怎么操作呢?其实方法并不难,今天小编就来分享一下我平时是如何批量查询快递单号的,一起来看看吧. 打开"固乔快递查询助手" ...

  6. 快递单查询助手,不需要输入验证码

    自己写的软件,因为每次都要打开网站去查询快递单到达地点,太麻烦,保函所有快递公司,输入快递公司拼音自动提示,直接看图. 下载地址:文件

  7. Web APIs:事件高级--键盘事件,京东按键输入及模拟京东快递单查询案例

    常用的键盘事件 keydown和keypress的区别是keypress不识别功能键 例如ctrl,shift 执行顺序keydown>keypress>keyup keyCode判断用户 ...

  8. ECSHOP和SHOPEX快递单号查询EMS插件V8.6专版

    发布ECSHOP说明: ECSHOP快递物流单号查询插件特色 本ECSHOP快递物流单号跟踪插件提供国内外近2000家快递物流订单单号查询服务例如申通快递.顺丰快递.圆通快递.EMS快递.汇通快递.宅 ...

  9. ECSHOP和SHOPEX快递单号查询国际EMS插件V8.6专版

    发布ECSHOP说明: ECSHOP快递物流单号查询插件特色 本ECSHOP快递物流单号跟踪插件提供国内外近2000家快递物流订单单号查询服务例如申通快递.顺丰快递.圆通快递.EMS快递.汇通快递.宅 ...

最新文章

  1. 求表达式 f(n)的结果
  2. 结合Android去水印APP谈谈分区存储
  3. 报名 | 挑战极限,参加2天清华数据Hackathon,赢得4万元奖金
  4. 024_html列表
  5. linux 使用 touch 修改文件的修改时间
  6. 帝国php使用系统变量,帝国cms常用变量汇总
  7. PyQt4打包exe文件
  8. Android实现两台手机屏幕共享和远程控制
  9. 转:施炜:铁军组织是怎样炼成的?高能组织=人×管理体系×数字标准
  10. 资源池、虚拟机、集群的关系
  11. 大数据开发比赛echarts所有要学习的主要图表 简单化 得分点
  12. Power Query零基础入门(Excel2021专业加强版)
  13. Thinkpad预装win10硬盘分区
  14. linux+新浪行情接口,新浪天气API接口
  15. 2021-05-07:set,hashmap,collisions, map 242 1 15 18
  16. MIT推出3D全息图生成新方法,可在智能手机上实时运行
  17. atto软件测试速度,评测平台介绍及HD Tune、ATTO性能测试
  18. 高校计算机房设计过程,高校计算机房建设中的一些注意事项.pdf
  19. LEDMAN雷曼家庭巨幕成都首店正式开业
  20. [emerg] 30766#0: unknown directive rtmp in /usr/local/etc/nginx/nginx.conf:16

热门文章

  1. oracle中的split用法,oracle中split的使用
  2. 文件权限管理 ugo
  3. c++中extern用法-个人理解
  4. JQ 导出easyui中datagrid中的数据到excel表格中
  5. 前端-初级工程师掌握技术点
  6. 1458: C语言实验题――数组逆序2
  7. 第三战:商鞅变法(变法始末修订版)秦并天下的战争机器,开动起来了
  8. 网页设计html 笔记
  9. C++ istringstream、ostringstream、stringstream类用法详解
  10. 多传感器融合定位:基于滤波的融合方法