前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >想做一个天气推送程序,却被和风天气API的示例代码调试得快吐了

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

作者头像
菜鸟小白的学习分享
发布2020-07-14 17:50:47
1.3K0
发布2020-07-14 17:50:47
举报

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

和风天气API获取

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

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

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

选择web API的key类型

最后新建完成是这样的

编码调试

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

代码语言:javascript
复制
# 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信息打印出来看看是不是正则不对啊。

代码语言:javascript
复制
<!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多的调整,最终我把代码调通了。返回结果是这样的。

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 菜鸟小白的学习分享 微信公众号,前往查看

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

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

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