更新时间:2022-07-15 GMT+08:00
分享

创建query_weather函数

  1. 在对话机器人服务管理控制台中配置意图时,单击“调用函数回复”项右侧的“创建新函数”
    图1 创建新函数
  2. 进入函数工作流服务,在“函数 > 函数列表”页面右上角单击“创建函数”。
    图2 创建函数
  3. 在创建函数页面选择“创建空白函数”,填写以下参数,然后单击“创建函数”。
    • FunctionGraph版本:FunctionGraph v2
    • 函数类型:事件函数
    • 函数名称:query_weather
    • 委托名称:未使用任何委托
    • 运行时:Python 3.6
      图3 创建函数query_weather
  4. 跳转至代码配置页面,单击“文件”,选择“新建文件”,自动新建untitled.py。鼠标放置在左侧untitled.py文件名称上,右键选择“重命名”,命名为index.py。
    代码示例复制全部代码,并将“{用户替换自己的key}”替换为用户自己申请的key,请在天气查询页面中单击“申请key”进行申请。
    图4 代码编辑
  5. 代码编辑完成后,单击“部署”,query_weather函数创建完成。

代码示例

代码示例中使用的是天气查询API接口,代码示例中的“{用户替换自己的key}”需要替换为用户自己申请的key,请在天气查询页面中单击“申请key”进行申请。

# -*- coding:utf-8 -*-
import json
import requests
import datetime
import logging
import time as time_fun
import os

def handler(event, context):
    city_code = {'北京': '110000', '天津': '120000', '滨海新区': '120116', '河北': '130000', '石家庄': '130100', '赵县': '130133', '辛集': '130181', '晋州': '130183', '新乐': '130184', '唐山': '130200', '遵化': '130281', '迁安': '130283', '秦皇岛': '130300', '邯郸': '130400', '涉县': '130426', '磁县': '130427', '邱县': '130430', '魏县': '130434', '武安': '130481', '邢台': '130500', '任县': '130526', '威县': '130533', '南宫': '130581', '沙河': '130582', '保定': '130600', '唐县': '130627', '易县': '130633', '蠡县': '130635', '雄县': '130638', '涿州': '130681', '定州': '130682', '安国': '130683', '高碑店': '130684', '张家口': '130700', '蔚县': '130726', '承德': '130800', '承德县': '130821', '平泉': '130881', '沧州': '130900', '沧县': '130921', '青县': '130922', '献县': '130929', '泊头': '130981', '任丘': '130982', '黄骅': '130983', '河间': '130984', '廊坊': '131000', '霸州': '131081', '三河': '131082', '衡水': '131100', '景县': '131127', '深州': '131182', '山西': '140000', '太原': '140100', '大同': '140200', '阳泉': '140300', '盂县': '140322', '长治': '140400', '沁县': '140430', '晋城': '140500', '高平': '140581', '朔州': '140600', '应县': '140622', '怀仁': '140681', '晋中': '140700', '祁县': '140727', '介休': '140781', '运城': '140800', '绛县': '140826', '夏县': '140828', '永济': '140881', '河津': '140882', '忻州': '140900', '代县': '140923', '原平': '140981', '临汾': '141000', '古县': '141025', '吉县': '141028', '隰县': '141031', '蒲县': '141033', '侯马': '141081', '霍州': '141082', '吕梁': '141100', '兴县': '141123', '临县': '141124', '岚县': '141127', '孝义': '141181', '汾阳': '141182', '呼和浩特': '150100', '包头': '150200', '乌海': '150300', '赤峰': '150400', '巴林左旗': '150422', '巴林右旗': '150423', '通辽': '150500', '霍林郭勒': '150581', '鄂尔多斯': '150600', '杭锦旗': '150625', '乌审旗': '150626', '阿荣旗': '150721', '满洲里': '150781', '牙克石': '150782', '扎兰屯': '150783', '额尔古纳': '150784', '根河': '150785', '杭锦后旗': '150826', '四子王旗': '150929', '丰镇': '150981', '乌兰浩特': '152201', '阿尔山': '152202', '二连浩特': '152501', '锡林浩特': '152502', '镶黄旗': '152528', '正镶白旗': '152529', '正蓝旗': '152530', '辽宁': '210000', '沈阳': '210100', '新民': '210181', '大连': '210200', '瓦房店': '210281', '庄河': '210283', '鞍山': '210300', '海城': '210381', '抚顺': '210400', '本溪': '210500', '丹东': '210600', '东港': '210681', '凤城': '210682', '锦州': '210700', '义县': '210727', '凌海': '210781', '北镇': '210782', '营口': '210800', '盖州': '210881', '大石桥': '210882', '阜新': '210900', '辽阳': '211000', '辽阳县': '211021', '灯塔': '211081', '盘锦': '211100', '铁岭': '211200', '调兵山': '211281', '开原': '211282', '朝阳': '211300', '建平县': '211322', '北票': '211381', '凌源': '211382', '葫芦岛': '211400', '兴城': '211481', '吉林': '220200', '长春': '220100', '榆树': '220182', '德惠': '220183', '蛟河': '220281', '桦甸': '220282', '舒兰': '220283', '磐石': '220284', '四平': '220300', '公主岭': '220381', '双辽': '220382', '辽源': '220400', '通化': '220500', '通化县': '220521', '梅河口': '220581', '集安': '220582', '白山': '220600', '临江': '220681', '松原': '220700', '扶余': '220781', '白城': '220800', '洮南': '220881', '大安': '220882', '延吉': '222401', '图们': '222402', '敦化': '222403', '珲春': '222404', '龙井': '222405', '和龙': '222406', '黑龙江': '230000', '哈尔滨': '230100', '宾县': '230125', '尚志': '230183', '五常': '230184', '齐齐哈尔': '230200', '讷河': '230281', '鸡西': '230300', '虎林': '230381', '密山': '230382', '鹤岗': '230400', '双鸭山': '230500', '大庆': '230600', '伊春': '230700', '铁力': '230781', '佳木斯': '230800', '同江': '230881', '富锦': '230882', '抚远': '230883', '七台河': '230900', '牡丹江': '231000', '绥芬河': '231081', '海林': '231083', '宁安': '231084', '穆棱': '231085', '东宁': '231086', '黑河': '231100', '嫩江': '231183', '北安': '231181', '五大连池': '231182', '绥化': '231200', '安达': '231281', '肇东': '231282', '海伦': '231283', '漠河': '232701', '上海': '310000', '浦东新区': '310115', '江苏': '320000', '南京': '320100', '无锡': '320200', '江阴': '320281', '宜兴': '320282', '徐州': '320300', '丰县': '320321', '沛县': '320322', '新沂': '320381', '邳州': '320382', '常州': '320400', '溧阳': '320481', '苏州': '320500', '常熟': '320581', '张家港': '320582', '昆山': '320583', '太仓': '320585', '南通': '320600', '海安': '320685', '启东': '320681', '如皋': '320682', '海门': '320684', '连云港': '320700', '淮安': '320800', '淮安区': '320803', '盐城': '320900', '东台': '320981', '扬州': '321000', '仪征': '321081', '高邮': '321084', '镇江': '321100', '丹阳': '321181', '扬中': '321182', '句容': '321183', '泰州': '321200', '兴化': '321281', '靖江': '321282', '泰兴': '321283', '宿迁': '321300', '浙江': '330000', '杭州': '330100', '建德': '330182', '宁波': '330200', '余姚': '330281', '慈溪': '330282', '温州': '330300', '瑞安': '330381', '乐清': '330382', '嘉兴': '330400', '海宁': '330481', '平湖': '330482', '桐乡': '330483', '湖州': '330500', '诸暨': '330681', '嵊州': '330683', '金华': '330700', '兰溪': '330781', '义乌': '330782', '东阳': '330783', '永康': '330784', '衢州': '330800', '江山': '330881', '舟山': '330900', '台州': '331000', '温岭': '331081', '临海': '331082', '玉环': '331083', '丽水': '331100', '龙泉': '331181', '安徽': '340000', '合肥': '340100', '巢湖': '340181', '芜湖': '340200', '芜湖县': '340221', '无为': '340281', '蚌埠': '340300', '淮南': '340400', '寿县': '340422', '马鞍山': '340500', '和县': '340523', '淮北': '340600', '铜陵': '340700', '安庆': '340800', '潜山': '340882', '桐城': '340881', '黄山区': '341003', '歙县': '341021', '黟县': '341023', '滁州': '341100', '天长': '341181', '明光': '341182', '阜阳': '341200', '界首': '341282', '宿州': '341300', '萧县': '341322', '泗县': '341324', '六安': '341500', '亳州': '341600', '池州': '341700', '宣城': '341800', '广德': '341822', '泾县': '341823', '宁国': '341881', '福建': '350000', '福州': '350100', '福清': '350181', '厦门': '350200', '莆田': '350300', '三明': '350400', '沙县': '350427', '永安': '350481', '泉州': '350500', '石狮': '350581', '晋江': '350582', '南安': '350583', '漳州': '350600', '龙海': '350681', '南平': '350700', '邵武': '350781', '武夷山': '350782', '建瓯': '350783', '龙岩': '350800', '漳平': '350881', '宁德': '350900', '福安': '350981', '福鼎': '350982', '江西': '360000', '南昌': '360100', '南昌县': '360121', '景德镇': '360200', '乐平': '360281', '萍乡': '360300', '九江': '360400', '瑞昌': '360481', '庐山': '360483', '新余': '360500', '鹰潭': '360600', '贵溪': '360681', '赣州': '360700', '瑞金': '360781', '吉安': '360800', '吉安县': '360821', '井冈山': '360881', '宜春': '360900', '丰城': '360981', '樟树': '360982', '高安': '360983', '抚州': '361000', '上饶': '361100', '德兴': '361181', '山东': '370000', '济南': '370100', '青岛': '370200', '胶州': '370281', '平度': '370283', '莱西': '370285', '淄博': '370300', '枣庄': '370400', '滕州': '370481', '东营': '370500', '烟台': '370600', '龙口': '370681', '莱阳': '370682', '莱州': '370683', '蓬莱': '370684', '招远': '370685', '栖霞': '370686', '海阳': '370687', '潍坊': '370700', '青州': '370781', '诸城': '370782', '寿光': '370783', '安丘': '370784', '高密': '370785', '昌邑': '370786', '济宁': '370800', '曲阜': '370881', '邹城': '370883', '泰安': '370900', '新泰': '370982', '肥城': '370983', '威海': '371000', '荣成': '371082', '乳山': '371083', '日照': '371100', '莒县': '371122', '临沂': '371300', '费县': '371325', '德州': '371400', '乐陵': '371481', '禹城': '371482', '聊城': '371500', '莘县': '371522', '冠县': '371525', '临清': '371581', '滨州': '371600', '邹平': '371681', '菏泽': '371700', '曹县': '371721', '单县': '371722', '河南': '410000', '郑州': '410100', '巩义': '410181', '荥阳': '410182', '新密': '410183', '新郑': '410184', '登封': '410185', '开封': '410200', '杞县': '410221', '洛阳': '410300', '嵩县': '410325', '偃师': '410381', '平顶山': '410400', '叶县': '410422', '郏县': '410425', '舞钢': '410481', '汝州': '410482', '安阳': '410500', '滑县': '410526', '林州': '410581', '鹤壁': '410600', '浚县': '410621', '淇县': '410622', '新乡': '410700', '长垣': '410783', '卫辉': '410781', '辉县': '410782', '焦作': '410800', '温县': '410825', '沁阳': '410882', '孟州': '410883', '濮阳': '410900', '范县': '410926', '许昌': '411000', '禹州': '411081', '长葛': '411082', '漯河': '411100', '三门峡': '411200', '义马': '411281', '灵宝': '411282', '南阳': '411300', '邓州': '411381', '商丘': '411400', '睢县': '411422', '永城': '411481', '信阳': '411500', '新县': '411523', '息县': '411528', '周口': '411600', '项城': '411681', '驻马店': '411700', '济源': '419001', '湖北': '420000', '武汉': '420100', '黄石': '420200', '大冶': '420281', '十堰': '420300', '房县': '420325', '丹江口': '420381', '宜昌': '420500', '宜都': '420581', '当阳': '420582', '枝江': '420583', '襄阳': '420600', '老河口': '420682', '枣阳': '420683', '宜城': '420684', '鄂州': '420700', '荆门': '420800', '京山': '420882', '钟祥': '420881', '孝感': '420900', '应城': '420981', '安陆': '420982', '汉川': '420984', '荆州': '421000', '石首': '421081', '洪湖': '421083', '松滋': '421087', '黄冈': '421100', '麻城': '421181', '武穴': '421182', '咸宁': '421200', '赤壁': '421281', '随州': '421300', '广水': '421381', '恩施': '422801', '利川': '422802', '仙桃': '429004', '潜江': '429005', '天门': '429006', '湖南': '430000', '长沙': '430100', '浏阳': '430181', '宁乡': '430182', '株洲': '430200', '攸县': '430223', '醴陵': '430281', '湘潭': '430300', '湘乡': '430381', '韶山': '430382', '衡阳': '430400', '衡阳县': '430421', '耒阳': '430481', '常宁': '430482', '邵阳': '430500', '邵东': '430582', '邵阳县': '430523', '武冈': '430581', '岳阳': '430600', '汨罗': '430681', '临湘': '430682', '常德': '430700', '澧县': '430723', '张家界': '430800', '益阳': '430900', '赫山区': '430903', '南县': '430921', '沅江': '430981', '郴州': '431000', '资兴': '431081', '永州': '431100', '道县': '431124', '怀化': '431200', '洪江': '431281', '娄底': '431300', '冷水江': '431381', '涟源': '431382', '吉首': '433101', '广东': '440000', '广州': '440100', '韶关': '440200', '乐昌': '440281', '南雄': '440282', '深圳': '440300', '珠海': '440400', '汕头': '440500', '佛山': '440600', '江门': '440700', '台山': '440781', '开平': '440783', '鹤山': '440784', '恩平': '440785', '湛江': '440800', '廉江': '440881', '雷州': '440882', '吴川': '440883', '茂名': '440900', '高州': '440981', '化州': '440982', '信宜': '440983', '肇庆': '441200', '四会': '441284', '惠州': '441300', '梅州': '441400', '兴宁': '441481', '汕尾': '441500', '陆丰': '441581', '河源': '441600', '阳江': '441700', '阳春': '441781', '清远': '441800', '英德': '441881', '连州': '441882', '东莞': '441900', '中山': '442000', '潮州': '445100', '揭阳': '445200', '普宁': '445281', '云浮': '445300', '罗定': '445381', '南宁': '450100', '横县': '450127', '柳州': '450200', '桂林': '450300', '荔浦': '450381', '梧州': '450400', '藤县': '450422', '岑溪': '450481', '北海': '450500', '防城港': '450600', '东兴': '450681', '钦州': '450700', '贵港': '450800', '桂平': '450881', '玉林': '450900', '容县': '450921', '北流': '450981', '百色': '451000', '平果': '451082', '靖西': '451081', '贺州': '451100', '河池': '451200', '来宾': '451300', '合山': '451381', '崇左': '451400', '凭祥': '451481', '海南': '460000', '海口': '460100', '三亚': '460200', '儋州': '460400', '五指山': '469001', '琼海': '469002', '文昌': '469005', '万宁': '469006', '东方': '469007', '重庆': '500000', '忠县': '500233', '四川': '510000', '成都': '510100', '都江堰': '510181', '彭州': '510182', '邛崃': '510183', '崇州': '510184', '简阳': '510185', '自贡': '510300', '荣县': '510321', '攀枝花': '510400', '泸州': '510500', '泸县': '510521', '德阳': '510600', '广汉': '510681', '什邡': '510682', '绵竹': '510683', '绵阳': '510700', '江油': '510781', '广元': '510800', '遂宁': '510900', '射洪': '510981', '内江': '511000', '隆昌': '511083', '乐山': '511100', '峨眉山': '511181', '南充': '511300', '阆中': '511381', '眉山': '511400', '宜宾': '511500', '高县': '511525', '珙县': '511526', '广安': '511600', '达州': '511700', '渠县': '511725', '万源': '511781', '雅安': '511800', '巴中': '511900', '资阳': '512000', '马尔康': '513201', '理县': '513222', '茂县': '513223', '康定': '513301', '西昌': '513401', '贵州': '520000', '贵阳': '520100', '清镇': '520181', '遵义': '520300', '赤水': '520381', '仁怀': '520382', '安顺': '520400', '毕节': '520500', '铜仁': '520600', '兴义': '522301', '兴仁': '522302', '凯里': '522601', '都匀': '522701', '福泉': '522702', '云南': '530000', '昆明': '530100', '安宁': '530181', '曲靖': '530300', '宣威': '530381', '玉溪': '530400', '澄江': '530481', '保山': '530500', '腾冲': '530581', '昭通': '530600', '水富': '530681', '丽江': '530700', '普洱': '530800', '临沧': '530900', '云县': '530922', '楚雄': '532301', '个旧': '532501', '开远': '532502', '蒙自': '532503', '弥勒': '532504', '文山': '532601', '景洪': '532801', '大理': '532901', '瑞丽': '533102', '泸水': '533301', '香格里拉': '533401', '拉萨': '540100', '日喀则': '540200', '昌都': '540300', '林芝': '540400', '朗县': '540426', '山南': '540500', '那曲': '540600', '索县': '540626', '陕西': '610000', '西安': '610100', '铜川': '610200', '宝鸡': '610300', '眉县': '610326', '陇县': '610327', '凤县': '610330', '咸阳': '610400', '乾县': '610424', '兴平': '610481', '渭南': '610500', '韩城': '610581', '华阴': '610582', '延安': '610600', '子长': '610681', '富县': '610628', '汉中': '610700', '洋县': '610723', '勉县': '610725', '榆林': '610800', '佳县': '610828', '神木': '610881', '安康': '610900', '商洛': '611000', '甘肃': '620000', '兰州': '620100', '嘉峪关': '620200', '金昌': '620300', '白银': '620400', '天水': '620500', '武威': '620600', '张掖': '620700', '平凉': '620800', '华亭': '620881', '酒泉': '620900', '玉门': '620981', '敦煌': '620982', '庆阳': '621000', '环县': '621022', '宁县': '621026', '定西': '621100', '漳县': '621125', '岷县': '621126', '成县': '621221', '文县': '621222', '康县': '621224', '礼县': '621226', '徽县': '621227', '临夏': '622901', '合作': '623001', '青海': '630000', '西宁': '630100', '玉树': '632701', '格尔木': '632801', '德令哈': '632802', '茫崖': '632803', '银川': '640100', '灵武': '640181', '石嘴山': '640200', '吴忠': '640300', '青铜峡': '640381', '固原': '640400', '中卫': '640500', '乌鲁木齐': '650100', '克拉玛依': '650200', '吐鲁番': '650400', '哈密': '650500', '昌吉': '652301', '阜康': '652302', '博乐': '652701', '阿拉山口': '652702', '库尔勒': '652801', '阿克苏': '652901', '库车': '652902', '阿图什': '653001', '喀什': '653101', '和田': '653201', '伊宁': '654002', '奎屯': '654003', '霍尔果斯': '654004', '伊宁县': '654021', '塔城': '654201', '乌苏': '654202', '阿勒泰': '654301', '石河子': '659001', '阿拉尔': '659002', '台湾': '710000'}
    format_input = json.dumps(event, ensure_ascii=False)
    logging.info("input param is : " + format_input)
    params = json.loads(format_input)
    # 获取槽位信息
    slots = params.get("slots")
    # 获取意图信息
    intention = params.get("intentionName")
    # 获取槽位对应内容
    cities = slots.get("地点")
    # 只取日期 yyyy-mm-dd
    times = slots.get("时间")
    week_time = list()
    for i in range(4):
        week_time.append((datetime.datetime.today()+datetime.timedelta(days=i)).strftime('%Y-%m-%d'))
    if times is None or len(times) == 0:
        # 明天
        time = datetime.datetime.today().strftime('%Y-%m-%d')
        # time = time_fun.strftime("%Y-%m-%d", time_fun.localtime())
    else:
        time = slots.get("时间")[0][:10]
        if time not in week_time:
            return "暂不支持查询3日后的天气"
    base_url = "https://restapi.amap.com/v3/weather/weatherInfo?key={用户替换自己的key}&extensions=all&city={}"
    output = []
    for city in cities:
        if city not in city_code.keys():
            return "暂时不支持查询" + city + "的天气"
        print(base_url.format(city_code[city]))
        response = requests.get(base_url.format(city_code[city]), verify=False)
        status = response.status_code
        content = response.content.decode()
        if status != 200:
            logging.error("query weather failed, %s" % content)
            return "这会天气预报出问题了,你待会再试一下吧"

        result = json.loads(content).get("forecasts")[0]
        if result is None:
            return "现在天气预报有点问题,还查不了"

        switch = {"PM25_query": query_weather(city, time, result),
                  "ultraviolet_rays": query_uv(city, time, result),
                  "temperature_query": query_temperature(city, time, result),
                  "weather_query": query_weather(city, time, result),
                  "humidity_query": query_humidity(city, time, result),
                  "pressure_query": query_pressure(city, time, result),
                  "wind_query": query_wind(city, time, result),
                  "affirmWeather": query_weather(city, time, result)}
        output.append(switch[intention])
    return "<br>".join(output)


def query_pm(city, time, result):
    aqi = result.get("realtime").get("aqi")
    return __contact_result(time, "当前{}空气质量指数为{}。".format(city, aqi), "空气质量暂不支持查询其他日期。")


def query_uv(city, time, result):
    return "暂不支持紫外线查询功能。"


def query_temperature(city, time, result):
    future = __find_future(result, time)
    future_temperature = "{}温度未能查询。".format(time)
    if future is not None:
        min_temper, max_temper = __get_temperatures(future)
        future_temperature = "{}最高{}摄氏度,最低{}摄氏度。".format(time, max_temper, min_temper)

    today = result.get("casts")[0]
    today_temperature = "当前{}最高{}摄氏度,最低{}摄氏度。".format(city, today.get("daytemp"), today.get("nighttemp"))
    return __contact_result(time, today_temperature, future_temperature)


def query_weather(city, time, result):
    real_time = result.get("casts")[0]
    real_time_weather = "当前{}天气{},最高{}摄氏度,最低{}摄氏度,日间{}风{}级,夜间{}风{}级。".format(city, \
                    real_time.get("dayweather"), real_time.get("daytemp"),real_time.get("nighttemp"),
                    real_time.get("daywind"),real_time.get("daypower"),real_time.get("nightwind"),
                    real_time.get("nightpower"))

    future = __find_future(result, time)
    future_weather = "{}天气情况未能查询。".format(time)
    if future is not None:
        future_weather = "{}天气{},最高{}摄氏度,最低{}摄氏度,日间{}风{}级,夜间{}风{}级。".format(time, \
            future.get("dayweather"), future.get("daytemp"),future.get("nighttemp"),
            future.get("daywind"),future.get("daypower"),future.get("nightwind"),
            future.get("nightpower"))
    return __contact_result(time, real_time_weather, future_weather)


def query_humidity(city, time, result):
    humidity = result.get("shidu")
    return __contact_result(time, "当前{}空气湿度为{}。".format(city, humidity), "湿度暂不支持查询其他日期。")


def query_pressure(city, time, result):
    return "暂不支持气压查询功能。"


def query_wind(city, time, result):
    future = __find_future(result, time)
    future_wind = "{}风力未能查询。".format(time)
    if future is not None:
        daywind = future.get("daywind")
        daypower = future.get("daypower")
        nightwind = future.get("nightwind")
        nightpower = future.get("nightpower")
        future_wind = "{}日间{}风{}级,夜间{}风{}级。".format(time, daywind, daypower, nightwind, nightpower)

    real_time = result.get("casts")[0]
    real_time_daywind = real_time.get("daywind")
    real_time_daypower = real_time.get("daypower")
    real_time_nightwind = real_time.get("nightwind")
    real_time_nightpower = real_time.get("nightpower")
    real_time_wind = "当前{}日间{}风{}级,夜间{}风{}级。".format(city, real_time_daywind, real_time_daypower,
                                                    real_time_nightwind, real_time_nightpower)
    return __contact_result(time, real_time_wind, future_wind)


def __find_future(result, time):
    futures = result.get("casts")[1:]
    for future in futures:
        if future.get("date") == time:
            return future
    return None


def __get_temperatures(future):
    # 去除 ℃ 符号
    low = future.get("nighttemp")
    high = future.get("daytemp")
    return low, high


def __contact_result(time, today_result, future_result):
    today = datetime.date.today()
    if str(today) == str(time):
        return today_result
    return future_result
分享:

    相关文档

    相关产品