LINE BOT聊天机器人-查询天气资讯

遮是一篇超级没有语言技术性质的文章!请三思慎入!!

今天要来做查询天气的功能。
一样有事前作业:
1.要先到气象局注册会员
2.到会员资讯中API授权码的地方取得我们的Token
如此一来,就可以使用中央气象局的API,然後在程序码中使用Python内的requests套件做查询


if (msg.find(keyWord_Weather) >= 0): # 台北市天气 如果在关键字开头,有找到视为0,即是索引位置

    # 把县市拿出来放到getWeather()做搜寻
    user_city = message[:3]
    # 找到该城市的天气资料
    weather = getWeather(user_city)
    # 如果没有找到资料
    if (weather == 'no data'):

        msg_error = '查询天气状况,使用方式: [县市名称][天气]。例如:台北市天气'
        line_bot_api.reply_message(
            replyToken, TextMessage(text=msg_error))
        print('getWeather: no data')

    else:
        # 将取得的城市天气资料处理成我需要的资讯
        msg_weaterInfo = transferWeatherData(weather)
        line_bot_api.reply_message(
            replyToken, TextSendMessage(text=msg_weaterInfo))
        print('transferWeatherData: success')
 

def getWeather(city):
# 取气象局的授权与资料--天气

# 开放查询
res = requests.get(
    'https://opendata.cwb.gov.tw/api/v1/rest/datastore/F-C0032-001?Authorization=你的TOKEN')

# 处理台跟台
if(city[0] == '台'):
    city = city.replace("台", "台")

weather_Josn = json.loads(res.text)  # 读取json 物件型态
locations = weather_Josn["records"]["location"]
# FIND CITY
try:
    i = 0
    while (i <= (len(locations))):
        if (locations[i]["locationName"] == city):
            item = locations[i]
            break
        i += 1
    return item

except IndexError:
    print('you get IndexError: list index out of range')
    return 'no data'

将取得的城市天气资料处理成我需要的资讯

def transferWeatherData(item):

cityName = item["locationName"]
weatherElement = item["weatherElement"]  # 取得该县市的天气资料

# 天气现象
if (weatherElement[0]["elementName"] == 'Wx'):
    timeDicts = weatherElement[0]["time"]  # 依时间区段设定早晚跟明天
    Wx_morning = timeDicts[0]["parameter"]["parameterName"]
    Wx_night = timeDicts[1]["parameter"]["parameterName"]
    Wx_tomorrow = timeDicts[2]["parameter"]["parameterName"]

# 降雨机率
if (weatherElement[1]["elementName"] == 'PoP'):
    timeDicts = weatherElement[1]["time"]  # 依时间区段设定早晚跟明天
    PoP_morning = str(timeDicts[0]["parameter"]["parameterName"]) + \
        timeDicts[0]["parameter"]["parameterUnit"]
    PoP_night = str(timeDicts[1]["parameter"]["parameterName"]) + \
        timeDicts[1]["parameter"]["parameterUnit"]
    PoP_tomorrow = str(timeDicts[2]["parameter"]["parameterName"]) + \
        timeDicts[2]["parameter"]["parameterUnit"]

# 低温
if (weatherElement[2]["elementName"] == 'MinT'):
    timeDicts = weatherElement[2]["time"]  # 依时间区段设定早晚跟明天
    MinT_morning = timeDicts[0]["parameter"]["parameterName"] + \
        timeDicts[0]["parameter"]["parameterUnit"]
    MinT_night = timeDicts[1]["parameter"]["parameterName"] + \
        timeDicts[1]["parameter"]["parameterUnit"]
    MinT_tomorrow = timeDicts[2]["parameter"]["parameterName"] + \
        timeDicts[2]["parameter"]["parameterUnit"]

# 舒适度
if (weatherElement[3]["elementName"] == 'CI'):
    timeDicts = weatherElement[3]["time"]  # 依时间区段设定早晚跟明天
    CI_morning = timeDicts[0]["parameter"]["parameterName"]
    CI_night = timeDicts[1]["parameter"]["parameterName"]
    CI_tomorrow = timeDicts[2]["parameter"]["parameterName"]

# 高温
if (weatherElement[4]["elementName"] == 'MaxT'):
    timeDicts = weatherElement[4]["time"]  # 依时间区段设定早晚跟明天
    MaxT_morning = timeDicts[0]["parameter"]["parameterName"] + \
        timeDicts[0]["parameter"]["parameterUnit"]
    MaxT_night = timeDicts[1]["parameter"]["parameterName"] + \
        timeDicts[1]["parameter"]["parameterUnit"]
    MaxT_tomorrow = timeDicts[2]["parameter"]["parameterName"] + \
        timeDicts[2]["parameter"]["parameterUnit"]

    today = timeDicts[0]["startTime"].split(
        ",")
    tomorrow = timeDicts[2]["endTime"].split(
        ",")

replyMsg = cityName + "今明两日天气预报:" + '\n' + \
    str(today[0][0:10]) + "," + Wx_morning + " " + CI_morning + '\n' + "白天高温: " + MaxT_morning + '\n' + "今白天低温: " + MinT_morning + '\n' + "白天下雨机率: " + PoP_morning + '\n' + "晚上高温: " + MaxT_night + '\n' + "晚上低温: " + \
    MinT_night + '\n' + "晚上下雨机率: " + PoP_night + '\n' + \
    str(tomorrow[0][0:10]) + "," + Wx_tomorrow + " " + CI_tomorrow + '\n' + "高温: " + \
    MaxT_tomorrow + '\n' + "低温: " + MinT_tomorrow + '\n' + "下雨机率: " + PoP_tomorrow

# 低温提醒
# notice_minT()
minT = min([weatherElement[2]["time"][0]["parameter"]["parameterName"], weatherElement[2]["time"]
            [1]["parameter"]["parameterName"], weatherElement[2]["time"][2]["parameter"]["parameterName"]])
# 高温提醒
maxT = max([weatherElement[4]["time"][0]["parameter"]["parameterName"], weatherElement[4]["time"]
            [1]["parameter"]["parameterName"], weatherElement[4]["time"][2]["parameter"]["parameterName"]])
pop = max([weatherElement[1]["time"][0]["parameter"]["parameterName"], weatherElement[1]["time"]
           [1]["parameter"]["parameterName"], weatherElement[1]["time"][2]["parameter"]["parameterName"]])

if (int(minT) < 10):
    replyMsg = replyMsg + "请注意低温"
    return str(replyMsg)

elif(int(maxT) > 36):
    replyMsg = replyMsg + "请注意高温"
    return str(replyMsg)

elif(int(pop) > 42):  # 降雨提醒 pop=12h/ pop6=6h
    replyMsg = replyMsg + '\n' + "请携待雨具"
    return str(replyMsg)

else:
    return replyMsg          

<<:  LINE BOT聊天机器人-第二步-建立回声机器人

>>:  浏览器向 Web 服务器提交用户密码最可行的方法-原始密码(Raw password )

Day29 :【TypeScript 学起来】React + TypeScript 实作简单 Todo App Part2

今天继续 todo app part2, 会纪录实作上遇到的问题。 若有错误,欢迎留言指教,感恩的...

Day 13 - Semigroup II & Monoid

yo, what's up Semigroup II 多组 Semigroup 进形合并 到目前为止...

CSS微动画 - 卡片简约动态效果,低调的小心机

Q: 剩下 5 篇来点实用也不实用的范例吧~~ A: 毕竟效果还是要看设计的美感,这是很看天份的(...

Day-25 事件机制(1)

在网页中的JavaScript程序码,必须经由事件触发(如:按下按钮,又称事件驱动event-dri...

Node.js安装

昨天介绍了Node.js,今天我们就要来实际安装Node.js啦 首先当然是到官网去下载Node.j...