使用高德地图API创建一个属于自己的天气闹钟

前言

本着是使用树莓派做一个个人天气预报的,通过百度也看到很多大神使用各种各样的方法来实现,本着简单、免费的想法,我去弄了个高德的开发者账号(ps:其实就是懒,哈哈哈哈哈),这个账号认证后每天有 300000次,其实也够我们自己去使用了,哈哈哈哈!后面关于文本合成语音的部分,打算接入阿里、讯飞的api的,emmm有点贵,算了,使用第三方库讲究着用吧(ps:声音确实是好僵硬)!

准备

  1. 在这里,我们需要提前安装好requests库、pyttsx3库。
    pip3 install requests
    pip3 install pyttsx3
  2. 进入高德开发者平台,注册账号,按照流程创建一个应用(是web服务的api),此时就可以获取到一个key值,这个值在后面会用到,记得保存一下。
  3. 打开高德的api使用文档,好了,开始撸代码…

    开始撸代码

    这里我们有三个任务
  • 获取当前地理位置
  • 根据当前的地理位置来获取天气情况
  • 将得到的文本数据使用语音合成出来
  1. 首先我们来看如何获取地理位置信息
  • 这里我们可以使用web服务的api中的IP查询来获取到对应的城市名和城市的adcode编码

  • 这里我们可以看下这张表

    参数名

    含义

    规则说明

    是否必须

    缺省值

    key

    请求服务权限标识

    用户在高德地图官网申请Web服务API类型KEY

    必填

    ip

    ip地址

    需要搜索的IP地址(仅支持国内)

    若用户不填写IP,则取客户http之中的请求来进行定位

    可选

    sig

    签名

    选择数字签名认证的付费用户必填

    可选

    output

    返回格式

    可选值:JSON,XML

    可选

    JSON


    名称

    含义

    规则说明

    status

    返回结果状态值

    值为0或1,0表示失败;1表示成功

    info

    返回状态说明

    返回状态说明,status为0时,info返回错误原因,否则返回“OK”。

    infocode

    状态码

    返回状态说明,10000代表正确,详情参阅info状态表

    province

    省份名称

    若为直辖市则显示直辖市名称;

    如果在局域网 IP网段内,则返回“局域网”;

    非法IP以及国外IP则返回空

    city

    城市名称

    若为直辖市则显示直辖市名称;

    如果为局域网网段内IP或者非法IP或国外IP,则返回空

    adcode

    城市的adcode编码


    rectangle

    所在城市矩形区域范围

    所在城市范围的左下右上对标对

    我们可以在使用时直接请求,此时可以获取到城市的adcode,那么我们直接调用返回结果即可。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def get_citycode():
    # 获取当前位置编码
    url = 'https://restapi.amap.com/v3/ip?'
    word = None
    try:
    r = requests.get(url, params=set_params(word))
    text = r.json()
    adcode = text['adcode']
    finally:
    return adcode
  1. 获取地区天气情况
  • 这里我们可以使用web服务的api中的天气查询来获取到对应的城市的天气,在api使用说明中明确表示,需要传入的参数至少有adcode哦!!好在我们之前已经获取到了。
  • 开始请求数据,并处理返回的数据,这里我就取几项数据,具体可以自定义。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    def get_weather():
    # 获取当前位置天气
    url = 'https://restapi.amap.com/v3/weather/weatherInfo?'
    word = get_citycode()
    weather_dict = {}
    try:
    r = requests.get(url, params=set_params(word))
    text = r.json()
    if text['info'] == 'OK':
    weather_dict['-'] = text['lives'][0]['city']
    weather_dict['天气'] = text['lives'][0]['weather']
    weather_dict['温度'] = text['lives'][0]['temperature']
    weather_dict['空气湿度'] = text['lives'][0]['humidity']
    weather_dict['风向'] = text['lives'][0]['winddirection']
    weather_dict['风力级别'] = text['lives'][0]['windpower']
    finally:
    return weather_dict
  1. 开始语音合成处理
    在这一步,需要使用到pyttsx3,查阅技术文档后,直接使用即可(ps:反正语音不是很好听,也就不做过多解释了,直接上代码)
    1
    2
    3
    4
    5
    6
    7
    8
    def read_data():
    # 阅读获取的文本
    weather = get_weather()
    engine = pyttsx3.init()
    rate = engine.getProperty('rate')
    engine.setProperty('rate', rate-10)
    engine.say(weather)
    engine.runAndWait()
  2. 补充,关于代码中set_params函数部分,可以这样写就行
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def set_params(word):
    # 设置请求表单
    if word == None:
    params = {
    'key':你自己的key,
    }
    else:
    params = {
    'key':你自己的key,
    'city':word,
    # base是获取当前天气,而all可以返回预报天气,哈哈哈自己慢慢玩。
    'extensions':'base',
    }
    return params

    结语

    想不到吧,这么快就结束了!!嘿嘿嘿嘿嘿,将代码移植到树莓派上,再写一个自动化脚本,就完事啦。