首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >节假日API调用失效,看我如何解决!

节假日API调用失效,看我如何解决!

作者头像
大数据梦想家
发布2021-01-27 16:10:27
发布2021-01-27 16:10:27
2.9K00
代码可运行
举报
运行总次数:0
代码可运行

写在前面: 博主是一名软件工程系大数据应用开发专业大二的学生,昵称来源于《爱丽丝梦游仙境》中的Alice和自己的昵称。作为一名互联网小白,写博客一方面是为了记录自己的学习历程,一方面是希望能够帮助到很多和自己一样处于起步阶段的萌新。由于水平有限,博客中难免会有一些错误,有纰漏之处恳请各位大佬不吝赐教!个人小站:http://alices.ibilibili.xyz/ , 博客主页:https://alice.blog.csdn.net/ 尽管当前水平可能不及各位大佬,但我还是希望自己能够做得更好,因为一天的生活就是一生的缩影。我希望在最美的年华,做最好的自己

上一篇博客为大家分享了Kettle的骚操作——生成年度节假日表,其中在JS代码中调用了节假日API。

关于节假日API,现在网上搜索到比较多的就是下面这种类型的

例如我在浏览器上的url上输入https://timor.tech/api/holiday/info/2019-01-01 然后就可以看到在页面上返回如下的结果:

这个页面返回的内容本身是没有的毛病的,但细心的朋友可能在访问过后已经发现了

现在页面上多加了一层用户认证,按照我个人理解就像是爬虫一样 如果检测到是非人为访问调用接口,直接不返回对应的内容

这一点如何验证呢?

我这里贡献一个Java代码,大伙可以试下

代码语言:javascript
代码运行次数:0
运行
复制
public class API {
    public static void main(String[] args) {

        String urlContent = getURLContent("https://timor.tech/api/holiday/info/2019-10-01");

        System.out.println(urlContent);
        
    }

    //parm:请求的url链接  返回的是json字符串
    public static String getURLContent(String urlStr) {

        //请求的url
        URL url = null;

        //建立的http链接
        HttpURLConnection httpConn = null;

        //请求的输入流
        BufferedReader in = null;

        //输入流的缓冲
        StringBuffer sb = new StringBuffer();

        try{
            url = new URL(urlStr);

            in = new BufferedReader(new InputStreamReader(url.openStream(),"UTF-8") );

            String str = null;

            //一行一行进行读入
            while((str = in.readLine()) != null) {
                sb.append( str );
            }
        } catch (Exception ex) {

        } finally{
            try{
                if(in!=null) {
                    in.close(); //关闭流
                }
            }catch(IOException ex) {

            }
        }
        String result =sb.toString();
        return result;
    }
}

这个Java程序可以访问指定url的数据接口,并将结果返回 就在昨天,我还用的好好的,程序运行也确实能返回结果

今天再跑,就直接返回黑屏

好吧,背景确实就是黑的,但不感觉结果没了吗?

行吧,那我试试昨天给大伙展示的Kettle程序

算了,那我试试能不能像爬虫一样,在请求的时候加入请求头啥的,模拟下浏览器啥的

然而现实证实还是不行的…

算了既然这个接口不好使,那咱就换一个

然后通过某度查询了一下,发现了新大陆

好吧,我承认是我之前没有深入去找

按照网站上面的要求,我注册了一个账号,获取到了一个专属的APIKEY

然后在这里可以在线测试

然后果然在网页下方看到了返回的结果

好吧,好像确实可以,那我拿Java程序试下

啥,Java代码能获取到返回的接口数据了!那还等啥,直接改JS代码

代码语言:javascript
代码运行次数:0
运行
复制
// 初始化日期
var initDate = "2019-01-01";

// 变量N 天(编号)
var add = 1;

// 设置日期的格式
var simpleDateFormat = new java.text.SimpleDateFormat("yyyy-MM-dd");

//将String转换为Date
var parseTime = simpleDateFormat.parse(initDate);

// 初始化一个日历对象
var calendar = java.util.Calendar.getInstance();

// 设置日历的初始值
calendar.setTime(parseTime);

// 输出日期数据 2000-01-01
//System.out.println(simpleDateFormat.format(calendar.getTime()));

// 日期+1
calendar.add(java.util.Calendar.DAY_OF_MONTH,DayNum);

// 最新的时间: 例如 2000-01-02
/*  2. 年月日  */
var date_value = simpleDateFormat.format(calendar.getTime());

/*  1. 代理键  */
var date_key = date_value.replace("-", "");

//System.out.println("word1:"+word1);
// 解析最新的时间  string-> date
parseTime = simpleDateFormat.parse(date_value);
// 设置给日历对象
calendar.setTime(parseTime);
// 调用方法获取到当前时间是一年的第几天
/* 3. 当年的第几天 */
var day_in_year = calendar.get(java.util.Calendar.DAY_OF_YEAR);
//System.out.println(day_in_year);

/* 4. 当月的第几天 */
var day_in_month = calendar.get(java.util.Calendar.DAY_OF_MONTH)+"";
//System.out.println(day_in_month);

/* 5. 是否月的第一天 */
var is_first_day_in_month = "";
if (day_in_month==1){

    is_first_day_in_month="y";
}else {
    is_first_day_in_month="n";
}

// 获取到当前月最大的天数   31
var lastDay = calendar.getActualMaximum(java.util.Calendar.DATE);

/* 6. 是否月的最后一天  */
var is_last_day_in_month = "";

if (day_in_month==lastDay){

    is_last_day_in_month = "y";
}else {
    is_last_day_in_month = "n";
}


/* 7. 星期数 */
var weekday = calendar.get(java.util.Calendar.DAY_OF_WEEK);

/* 8. 月的第几个星期  */
var week_in_month = calendar.get(java.util.Calendar.WEEK_OF_MONTH);

/* 9. 是否是周一,国外以周日作为一周的第一天,这里我们需要将判断的结果+1 */
var is_first_day_in_week = "";
if (weekday==2){
    is_first_day_in_week = "y";
}else {
    is_first_day_in_week = "n";
}

//请求的url
var url = null;
//输入流的缓冲
var tmpInfo = null;

// 开始调用API
// 因为调用有失败的风险,所以这里设置了循环,如果失败则重复执行
for (var i = 0; i < 5; i++) {
    //创建一个临时变量用来保存json
    tmpInfo = java.lang.StringBuffer();
    //读取文件
    var ins = null;
    //创建url
    var urlStr = "http://api.tianapi.com/txapi/jiejiari/index?key=这里换上你自己申请的KEYID&date=" + date_value;
    url = java.net.URL(urlStr);
    var str = null;
    try {
        //调用API
        ins = java.io.BufferedReader(java.io.InputStreamReader(url.openStream(), "UTF-8"));
        //一行一行进行读入
        while ((str = ins.readLine()) != null) {
            tmpInfo.append(str);
        }
        // 如果成功了,就结束循环
        // 否则就重新遍历
        break;
    } catch (err) {

    } finally {
        if (ins != null) {
            ins.close(); //关闭流
        }
    }
}

// 将数据转换为字符串String
var result = tmpInfo.toString();
// 利用JSON解析对象
var obj = JSON.parse(result);
// 获取到list集合
var lists = obj.newslist;

var news = lists[0];

/* 13. 提前定义一个变量,保存日期类型*/
var date_type = "";

/* 10. 是否休息日 */
var is_dayoff = "";
if (news.info == "双休日"){
    is_dayoff="y";
    date_type = "weekend"
}else {
    is_dayoff="n"
}

/* 11. 是否工作日 */
var is_workday = "";
if (news.info == "工作日"){
    is_workday="y"
    date_type = "workday"
}else {
    is_workday="n"
}

/* 12. 是否国家法定节假日 */
var is_holiday = "";

if (news.info == "节日") {
    is_holiday = "y";
    date_type = "holiday";

}else {
    is_holiday = "n";
}


/**/

/* 14. 月份 */
var month_number = calendar.get(java.util.Calendar.MONTH)+1;

/* 15. 年份 */
var year = calendar.get(java.util.Calendar.YEAR);

/* 16. 季度 */
var quarter_number = parseInt(calendar.get(java.util.Calendar.MONTH) / 3 + 1);

/* 17. 季度名称 */
var quarter_name = "Q"+parseInt(quarter_number);

/* 18. 年-季度 */
var year_quarter = year + "-"+quarter_name;

/* 19. 年-月份 */
var year_month_number = date_value.substring(0,7);

JS代码改好,我们直接运行~

目前看来暂时是ok的,让我们打开输出的文件

可以发现最后的结果与我们昨天展示的结果是一致的!

其实也在情理之中,毕竟也就换了个接口,然后对返回不同格式的JSON数据做了一些处理而已,逻辑都是一样的…


总结

好了,今天的嗑就唠到这里,但总结还是要有的。

就是要学会随机应变,你瞅瞅我在面对两天前还能用的接口"失效"的情况下,还不是想到其他办法应对了~

如果我不发这篇博客,看了我上一篇博客的粉丝按照本菌写的JS代码操作了,最后结果报错,没出来效果,你说这锅算谁的???

那肯定得算我的对吧,谁让博主这么宠粉对吧

最后:也是每次我都要再三强调的,非常重要!!!

如果以上过程中出现了任何的纰漏错误,烦请大佬们指正?

受益的朋友或对大数据技术感兴趣的伙伴记得点赞关注支持一波?

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/05/02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档