专栏首页菜鸟小白的学习分享想做一个天气推送程序,却被和风天气API的示例代码调试得快吐了

想做一个天气推送程序,却被和风天气API的示例代码调试得快吐了

最近各地好像都被暴雨袭击了,菜鸟小白就在想能不能通过python实现实时天气的定时推送呢?其实不用想,肯定是可以的。菜鸟小白百度到了一个和风API接口,可以实现天气的获取。

和风天气API获取

前面的调用百度AI开放平台的API进行动漫照片处理时一直都有同学反馈API该如何获取,那这一次菜鸟小白就学聪明了,直接给出API的获取方式,机智如我,哈哈~~

和风天气网址:https://console.heweather.com

首先我们需要注册一个和风天气的账号,然后新建一个应用

选择web API的key类型

最后新建完成是这样的

编码调试

说到编码,菜鸟小白首先就去看和风的开发文档嘛,一看发现这个还不错,还提供的python编码的示例,那菜鸟小白就想着自己直接拿过来用不就好了嘛,这一用可就入了一个大坑了。它代码库里面的源码是这样的

# coding=utf-8

import requests
import re

KEY = "&key=2d849c62d67a4b9e94607d0f1c744561"
CITY = "city=深圳"
APIURL = "https://free-api.heweather.com/v5/"
USERNAME = "Acring"
s = requests.session()


class HeWeather(object):
    now_text = ""
    now_raw = []
    city_text = ""
    city_raw = []

    def __init__(self):
        self.city()

    # 利用获取IP地址的网页,获取本地城市名
    @staticmethod
    def getcity():
        inf = s.get("http://ip.lockview.cn/ShowIP.aspx").text
        cityname = re.findall(r"省(.*?)市", inf)[0]
        return cityname

    # 实况天气
    def now(self):
        api_type = "now?"
        # url = https://free-api.heweather.com/v5/now?city=深圳&key=2d849c62d67a4b9e94607d0f1c744561
        url = APIURL + api_type + CITY + KEY
        raw_json = s.get(url).json()
        if raw_json["HeWeather5"][0]["status"] != "ok":
            return
        self.now_raw = raw_json
        now_basic = raw_json["HeWeather5"][0]["basic"]
        now_now = raw_json["HeWeather5"][0]["now"]
        basic_city = now_basic["city"]  # 城市
        basic_cnty = now_basic["cnty"]  # 国家
        basic_id = now_basic["id"]  # 城市代码
        basic_lat = now_basic["lat"]  # 城市纬度
        basic_lon = now_basic["lon"]  # 城市经度
        basic_loc = now_basic["update"]["loc"]  # 当地时间
        now_tmp = now_now["tmp"]  # 实时气温
        now_cond = now_now["cond"]["txt"]  # 天气描述
        now_vis = now_now["vis"]  # 能见度
        now_hum = now_now["hum"]  # 相对湿度
        now_fl = now_now["fl"]  # 体感温度
        now_pcpn = now_now["pcpn"]  # 降雨量
        now_pres = now_now["pres"]  # 气压
        now_deg = now_now["wind"]["deg"]  # 风向(360度)
        now_dir = now_now["wind"]["dir"]  # 风向
        now_sc = now_now["wind"]["sc"]  # 风力
        now_spd = now_now["wind"]["spd"]  # 风速(kmph)

        text = """
实时天气:
亲爱的 {},您所在的地区为 {} ,
现在{}的天气是 {}天,
气温为 {}°
体感气温为 {}°
风向 {},
风速 {}
                """.format(USERNAME, basic_city, basic_loc, now_cond, now_tmp, now_fl, now_dir, now_spd)
        self.now_text = text
        return text

    def city(self):
        cityname = self.getcity()
        apitype = "search?city="
        # url = https://free-api.heweather.com/v5/search?city=host&key=2d849c62d67a4b9e94607d0f1c744561
        url = APIURL + apitype + cityname + KEY

        raw_json = s.get(url).json()
        if raw_json["HeWeather5"][0]["status"] != "ok":
            return "获取天气失败:", raw_json["HeWeather5"][0]["status"]

        basic = raw_json["HeWeather5"][0]["basic"]
        self.city_raw = basic
        basic_city = basic["city"]
        basic_cnty = basic["cnty"]
        basic_id = basic["id"]
        basic_prov = basic["prov"]  # 所属省会

        city = "&city=" + basic_city

        global CITY
        CITY = city
        city = "国家:{} 城市:{} 所属省会:{} 城市代码:{}".format(basic_cnty, basic_city, basic_prov, basic_id)
        self.city_text = city
        return


if __name__ == '__main__':
    heWeather = HeWeather()
    now = heWeather.now()
    print(now)

看着还挺清晰不是,一运行起来可就不行了,上来先报了一个这个错误

那我就分析呗是吧,我将inf信息打印出来看看是不是正则不对啊。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1"><title>
  IP地址 | IP查询
</title><meta name="robots" content="all" /><meta name="Keywords" content="IP, IP地址, IP查询" /><meta name="Description" content="实时查询国内,国外最新IP,LockviewIP库收录了全球最全的IP信息" /></head>
<body><form method="post" action="./ShowIP.aspx" id="form1">
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="m0RyFd5IYrWl72CZJ/hR5y1ds+p16Io1XrLSegsLFTzTjkv4BIXlhKHOA5ypWBeZEwHMh8qB6eWtPtevuPI75OnlU6bnW2saAzaQRiDqmbU=" />

<input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="1BC9C283" />
    <div id="menu"><b>ip.lockview.cn IP查询及更新系统</b>&nbsp;&nbsp;&nbsp;<a target="_top" class="t1" href="javascript:window.external.AddFavorite('http://ip.lockview.cn','IP查询')">加入收藏</a><a target="_top" class="t1" href="mailto:info@lockview.cn">提建议</a></div>
    <div id="content" style="text-align:center">
        <div style="float:left"><a href="/">首页</a> > IP地址</div><hr />
        <div class="lighttext" style="float:left">如果结果您不满意,请及时让我们知道,您也可以 
        <a target="_blank" href="/SumbitIP.aspx">IP地址更正</a></div>
    </div>
    <div style="clear:both;margin-top:70px;width:100%">
        <div id="left" style="width:65%">您的IP地址是:112.31.*.*&nbsp;&nbsp;安徽省, 移动<br /><br /><a href='/Default.aspx'>查询更多IP</a><div id="divIPResult" class="left_3"></div>
    </div>
    <div id="right"><div id="divMap"><iframe src='BaiduMap.aspx?ip=&address=%e5%ae%89%e5%be%bd%e7%9c%81%2c+%e7%a7%bb%e5%8a%a8' width='420px' height='380px' scrolling='no' frameborder='0' allowTransparency='true'></iframe></div></div></div>
    <script type="text/javascript">
            if (screen.width < 1050) { document.getElementById("left").style.width = "56%"; }
</script>
    </form>
<script type="text/javascript">
    var dwstat_Host="cn01.dwstat.cn";
    document.write(unescape("%3Cscript src='http://" + dwstat_Host + "/Js/dwstat.js' type='text/javascript'%3E%3C/script%3E")); </script>
<script type="text/javascript">
    try { dwstat_Uid = "DT0181379"; dwstat_Tracker(); } catch (dwstat) { } </script>
<noscript><img alt="" src="http://cn01.dwstat.cn/Analytics/dwstat.aspx?uid=DT0181379" /></noscript>
</body>
</html>

果然,打印出来一看这也完全匹配不上啊,而且里面根本就没有我们需要的城市信息啊,那算了吧,我们不要获取城市信息了,直接返回菜鸟小白所在的城市名称——合肥算了。

OK,改过之后这一个算是先过去了,再次执行后又出错了

这次一看是请求报错了,结果仔细研究API文档发现这个API请求接口都变了,然后菜鸟小白把默认的API url、APItype和key全部改成现在的之后再次执行,还是报错了

这次看好像是返回处理出错了,再次去看看API接口文档吧,我太难受了,原来整理返回接口也全部都变了。再次重新调整吧。

此处省略N多的调整,最终我把代码调通了。返回结果是这样的。

实时天气:
亲爱的 菜鸟小白的学习分享,您所在的地区为 合肥 ,
现在2020-07-07T21:32+08:00的天气是 多云天,
气温为 25°
体感气温为 28°
风向 东南风,
风速 8

今天的事情让我尝试到,错误的API范例还不如不提供呢。和风天气的范例应该还是N年前的了吧,早点去更新啊。

本文分享自微信公众号 - 菜鸟小白的学习分享(cainiao-xiaobai),作者:菜鸟小白的学习分享

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 我们一起学一学渗透测试——黑客应该掌握的HTML基础知识(二)

    将文本设置为标题显示的标签对。设定标题字体大小,n=1(大)~6(小),标题大小一共有6种,也就是从<h1>……</h1>到<h6>……</h6>

    菜鸟小白的学习分享
  • 太实用了!自己动手写软件——密码验证器的界面实现

    我们今天的目标很简单,就是先把软件的界面设计和写出来,并不关心每一个按钮和输入框之后的功能实现。我设计一个这样的界面(极其简单,只是实现功能)

    菜鸟小白的学习分享
  • 我们一起学一学渗透测试——黑客应该掌握的HTML基础知识(一)

    HTML语言是一种标签语言,它不需要编译,可以直接由浏览器执行。在标准网页设计中HTML负责填充网页的内容,HTML编写的超文本文档(文件)称之为HTML文档...

    菜鸟小白的学习分享
  • javascript_data

    机器学习和大数据挖掘
  • P1996 约瑟夫问题

    题目背景 约瑟夫是一个无聊的人!!! 题目描述 n个人(n<=100)围成一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数,数到m的人再出...

    attack
  • 1512 转向游戏

    1512 转向游戏 时间限制: 1 s 空间限制: 1000 KB 题目等级 : 白银 Silver 题目描述 Description 小明自认为...

    attack
  • 洛谷P1731 [NOI1999]生日蛋糕(爆搜)

    设从下往上数第i(1<=i<=M)层蛋糕是半径为Ri, 高度为Hi的圆柱。当i<M时,要求 R_i>R_{i+1}Ri​>Ri+1​ 且 H_i>H_{i+1}...

    attack
  • Oracle常用函数

    Create Table Test6( id varchar2(30), name varchar2(30), age...

    郑小超.
  • python爬虫学习笔记之pyquery模块基本用法详解

    本文实例讲述了python爬虫学习笔记之pyquery模块基本用法。分享给大家供大家参考,具体如下:

    砸漏
  • Android build文件的删除的方法

    本文介绍了Android 删除所有build编译文件,翻译磁盘空间,分享给大家,也给自己留个笔记,具体如下:

    砸漏

扫码关注云+社区

领取腾讯云代金券