基于网页api(接口)实现查快递

  之前在网上找到一款下载某慕课网站的java版软件,我想知道他是怎么实现:对于视频的下载的,毕竟网页源码中大都不会直接放视频的地址,但是没有公布源码,我就反编译,等到了部分“源码”,逻辑上还是有些问题,所以还要自己修改一下。最终代码还是能和原程序一样跑,但是部分代码无法理解,他是怎么实现的,或者说他是怎么得到的。

jsonDoc=Jsoup.connect("http://www.imooc.com/course/ajaxmediainfo/?mid=" + videoNo + "&mode=flash").timeout(10000).get();

代码展现的不多,重要的不是代码,重要的是我怎么解决了这个问题。周五忙碌了一下午,看网页源码,找getpost请求,都没看到相关的网址,直到周五晚上,跟老师反映了问题,得到了解答。终于是理解了,但疑惑还是没解决,原程序作者是怎么得到这个接口(网页api)的。

  疑惑虽然没有解决,但我还是对这接口感兴趣,所以今天打算写一个关于查快递的程序。(ps:这样的功能网页、app上有的是,遭室友吐槽。)写这个程序的目的是感受一下接口是怎么样的,相比较直接重网页中爬取自己想要的信息有什么区别。

直入正题:

1、百度搜索免费的网页api,找到的不多,所以挑选了一个感觉相对有用的查快递的接口。

这是网址:http://www.bejson.com/knownjson/webInterface/

2、代码实现

需要json,jsoup第三方库的支持。下载地址:链接:http://pan.baidu.com/s/1slayVzZ 密码:pppe ,过期不补,网上有。

我认为这程序实现的关键在于对json的解析,之前学习爬虫涉及到一些。

对于接口返回的数据可以用正则表达式解决,但是我感觉用json更fashion一点。

首先jsoup建立链接得到返回值

 Document jsondoc;
jsondoc= Jsoup.connect("http://www.kuaidi100.com/query?type="+CompanyNumber+"&postid="+OrderNumber).timeout(10000).get();
String jsonData=jsondoc.text();

然后对返回数据的解析,json的数据结构由对象,数组,对象数组混合这么几种。可以通过http://www.bejson.com/整理数据,方便观察数据结构。

JSONObject jsonObject=new JSONObject(jsonData);
JSONArray data=jsonObject.getJSONArray("data");

System.out.println("查询结果:"+jsonObject.getString("message"));
if (jsonObject.getString("message").equals("ok")){
    System.out.println("快递公司:"+jsonObject.getString("com"));
    System.out.println("快递单号:"+jsonObject.getString("nu"));

     //具体信息
    for (int i=data.length()-1;i>0;i--){
        JSONObject object=data.getJSONObject(i);
        System.out.print(object.getString("time"));
        System.out.println(" "+object.getString("context"));
    }
}    

最后,时间关系,不详细讲解,直接上全部代码。

  1 package com;
  2
  3 import org.json.JSONArray;
  4 import org.json.JSONObject;
  5 import org.jsoup.Jsoup;
  6 import org.jsoup.nodes.Document;
  7 import java.io.IOException;
  8 import java.util.Scanner;
  9
 10 public class Main {
 11
 12     public static void main(String[] args) {
 13
 14         Document jsondoc;
 15         Scanner input=new Scanner(System.in);
 16         boolean yesNo;
 17         while (true) {
 18
 19             yesNo=true;
 20             System.out.println("快递公司编码:申通=\"st\" EMS=\"ems\" 顺丰=\"sf\" 圆通=\"yt\" 中通=\"zt\" 韵达=\"yd\" " +
 21                     "天天=\"tt\" 汇通=\"ht\" 全峰=\"qf\" 德邦=\"db\" 宅急送=\"zjs\"");
 22             System.out.println("请输入快递公司编号和快递单号,中间用逗号或空格隔开,如(sf,123456789;sf,123456789;sf 123456789)");
 23             try {
 24                 String string=input.nextLine();
 25                 int num=string.indexOf(‘,‘);
 26                 if (num==-1){
 27                     num=string.indexOf(‘,‘);
 28                     if (num==-1){
 29                         num=string.indexOf(‘ ‘);
 30                     }
 31                 }
 32
 33                 String  CompanyNumber=string.substring(0,num);
 34                 String OrderNumber=string.substring(num+1);
 35
 36
 37                 switch (CompanyNumber){
 38                     case "st":
 39                         CompanyNumber="shentong";
 40                         break;
 41                     case "ems":
 42                         break;
 43                     case "sf":
 44                         CompanyNumber="shunfeng";
 45                         break;
 46                     case "yt":
 47                         CompanyNumber="yuantong";
 48                         break;
 49                     case "zt":
 50                         CompanyNumber="zhongtong";
 51                         break;
 52                     case "yd":
 53                         CompanyNumber="yunda";
 54                         break;
 55                     case "tt":
 56                         CompanyNumber="tiantian";
 57                         break;
 58                     case "ht":
 59                         CompanyNumber="huitongkuaidi";
 60                         break;
 61                     case "qf":
 62                         CompanyNumber="quanfengkuaidi";
 63                         break;
 64                     case "db":
 65                         CompanyNumber="debangwuliu";
 66                         break;
 67                     case "zjs":
 68                         CompanyNumber="zhaijisong";
 69                         break;
 70                     default:
 71                         System.out.println("编号错误或暂不支持该快递公司的查询");
 72                         yesNo=false;
 73                         break;
 74                 }
 75
 76                 if (yesNo){
 77
 78                     jsondoc= Jsoup.connect("http://www.kuaidi100.com/query?type="+CompanyNumber+"&postid="+OrderNumber).timeout(10000).get();
 79                     String jsonData=jsondoc.text();
 80                     JSONObject jsonObject=new JSONObject(jsonData);
 81                     JSONArray data=jsonObject.getJSONArray("data");
 82
 83                     System.out.println("查询结果:"+jsonObject.getString("message"));
 84                     if (jsonObject.getString("message").equals("ok")){
 85                         System.out.println("快递公司:"+jsonObject.getString("com"));
 86                         System.out.println("快递单号:"+jsonObject.getString("nu"));
 87
 88                         //具体信息
 89                         for (int i=data.length()-1;i>0;i--){
 90                             JSONObject object=data.getJSONObject(i);
 91                             System.out.print(object.getString("time"));
 92                             System.out.println(" "+object.getString("context"));
 93                         }
 94                     }
 95
 96                 }
 97
 98             } catch (IOException e) {
 99                 e.printStackTrace();
100             }
101
102             System.out.print("按回车键继续!");
103             input.nextLine();
104         }
105     }
106 }

运行结果展示:

本人刚接触java不久,语法结构不是很标准,严谨,希望大家谅解。如有问题可以相互交流。

谢谢阅读

时间: 2024-10-27 13:13:15

基于网页api(接口)实现查快递的相关文章

免费顺丰快递单号查询电子面单api接口对接【快递鸟API】

顺丰速运快递查询接口API和电子面单接口怎么对接?除了通过顺丰自己的接口对接外,用的最多的就是第三方通过快递鸟对接了,通过顺丰单号和手机号后四位查询轨迹信息,如果是通过快递鸟下单获得的顺丰单号,可通过单号直接查询,具体下载快递鸟接口技术文档查看接口说明.ShipperCode为SF,且快递单号非快递鸟渠道返回时,必填,对应收件人/寄件人手机号后四位:ShipperCode为SF,且快递单号为快递鸟渠道返回时,不填. 一.接入前准备(TO商家业务人员) 1.申请快递鸟用户ID和API key1.1

各种快递查询Api接口(快递鸟)

前提 应用场景 可实现需求 申请Key 快递查询Api接口 接口文档及各开发语言Demo 查询Api接口定义 系统级输入参数 应用级输入参数 返回结果参数 请求JSON参数 响应JSON参数 查询Api接口使用 温馨提示 前提 项目开发中,有些需求难免会用到关于快递的一些Api接口:本篇主要介绍的是快递的查询Api及与其他各家的不同之处: 常用的提供快递Api接口的有: 快递鸟 快递100 爱查快递 等等 如大家使用过,快递100和爱查快递等等网站提供的快递查询等接口时,你会发现,你所申请的账号

国内主流快递物流查询API接口测评对比

? 快递物流查询API接口 快递查询接口是指快递查询网对外开放的应用程序接口,开发人员能够通过调用该接口与快递查询网进行交互,并基于该接口开发自己的快递查询应用程序. ? 应用场景 ① 买家物流查询:轨迹跟踪.包裹进度.预计送达时间.派送人联系方式等.② 卖家物流跟踪:是否超区.转件.多次派送.拒收③ 平台监控管理:假交易监控.匹配卖家发货与顾客确认收货时间.目前常用的快递物流查询接口供应平台有阿里云.用友APILink.京东万象.华为云.聚合数据.本文从用户体验角度对这5个平台上提供的快递物流

快递查询API接口调用代码示例

快递查询接口是指快递查询网对外开放的应用程序接口,开发人员能够通过调用该接口与快递查询网进行交互,并基于该接口开发自己的快递查询应用程序.目前比较常用的接口有快递鸟.快递100.快递网等. 应用场景 (1)电商网站用户打开"我的订单"时调用此API显示物流信息详情.  (2)电商管理后台的物流系统,客服在对账前查询所有运单的签收状态,并追踪问题. 物流轨迹查询接口有即时查询和订阅查询两种,即时是请求即返回数据,订阅则是订阅快递单号到接口,有物流轨迹更新则全量返回数据. 快递鸟即时接口可

基于http协议的api接口对于客户端的身份认证方式以及安全措施[转]

基于http协议的api接口对于客户端的身份认证方式以及安全措施 由于http是无状态的,所以正常情况下在浏览器浏览网页,服务器都是通过访问者的cookie(cookie中存储的jsessionid)来辨别客户端的身份的,当客户端进行登录服务器也会将登录信息存放在服务器并与客户端的cookie中的jsessionid关联起来,这样客户端再次访问我们就可以识别用户身份了. 但是对于api服务器,我们不能让访问者先登录再进行访问这样不安全,也不友好.所以一般情况我们都是需要客户端提供一个key(每个

微信小程序+OLAMI(欧拉蜜)自然语言API接口制作智能查询工具--快递、聊天、日历等

微信小程序最近比较热门,再加上自然语义理解也越来越被人关注,于是我想赶赶潮流,做一个小程序试试.想来想去快递查询应该是一种比较普遍的需求. 如果你也在通过自然语言接口做点什么,希望我的这篇博客能帮到你.我建了一个QQ群656580961,感兴趣的朋友可以加入互通有无.或者你也可以直接下载代码试一试. 用微信扫描下面的二维码可以直接测试小程序 也可以通过关注下面的公众号,点解工具使用小程序 ----------------功能介绍: 我的小程序名字叫"智能生活宝"------------

快递鸟物流查询API接口对接案例

下面是以快递鸟提供的开发者接口进行展开,如有错误,请指正并及时修改. 首先,申请一个快递鸟的账号: 然后进入http://www.kdniao.com/reg界面点击免费申请,免费申请的接口每天接口的请求次数都是没有限制的,超过3000次/每天需接入订阅推送接口. 按照申请流程一步步做完后,即可对接. 注册信息必须填写正确,如果有误可能导致接口无法正常使用.   使用 案例分为3个 使用的是Chrome的postman插件进行Api测试调用 使用JAVA环境进行快递查询 使用.net环境进行快递

php 快递查询api接口笔记

1 <?php 2 include_once("../includes/global.php"); 3 @include_once("../config/logistics_config.php"); 4 5 $api_id = $logistics_config['logistic_app_id']?$logistics_config['logistic_app_id']:""; 6 $api_sceret = $logistics_co

Yii2 基于RESTful架构的 advanced版API接口开发 配置、实现、测试

环境配置: 开启服务器伪静态 本处以apache为例,查看apache的conf目录下httpd.conf,找到下面的代码 LoadModule rewrite_module modules/mod_rewrite.so 将其前面的#去掉,如果没有找到则添加进去. 找到一下代码 <Directory "C:/phpStudy/Apache/cgi-bin"> AllowOverride All Options None Require all granted </Di