先看下效果图:

用到的模块:

  • PyMySQL
  • requests
  • threading
  • wxpy

要实现下面的示例,首先是有两大块中央

  • 获取天气信息
  • 通过微信将天气信息发送进来

而获取天气信息又包含几个小的须要留神的中央

  • 获取天气信息

    • 获取天气信息的接口
    • 获取天气信息的城市
    • 获取所在城市的城市码

如果咱们给多集体发送天气情况,这几个人来自不同的城市,那么咱们不可能每次都要输出城市名,而后查找城市码,而后再拜访接口,获取天气情况,这样会十分的麻烦,所以咱们须要思考将城市名跟城市码一一对应起来,说到一一对应,首先想到的数据结构便是字典,所以咱们能够将这些信息存入一个字典里,而后长久化到一个文件中,这样便不便很多

首先咱们获取最新的 city 表,这个表是一个 list 类型,大体格局如下:

[  {    "id": 1,    "pid": 0,    "city_code": "101010100",    "city_name": "北京",    "post_code": "100000",    "area_code": "010",    "ctime": "2019-07-11 17:30:06"  },  {    "id": 2,    "pid": 0,    "city_code": "",    "city_name": "安徽",    "post_code": null,    "area_code": null,    "ctime": null  }]

咱们就简略的粘贴复制,放到一个空的列表中,如下所示,将所有的城市信息放到列表 citycode 中

citycode = [  {    "id": 1,    "pid": 0,    "city_code": "101010100",    "city_name": "北京",    "post_code": "100000",    "area_code": "010",    "ctime": "2019-07-11 17:30:06"  },..................  {    "id": 2,    "pid": 0,    "city_code": "None",    "city_name": "安徽",    "post_code": "null",    "area_code": "null",    "ctime": "null"  }]cityinfo = {}#将城市名和城市代码写入json文件中with open('city_for_code.json','w',encoding='utf-8') as f:    for i in citycode:        name = i["city_name"]        code = i["city_code"]        cityinfo[name] = code    f.write(str(cityinfo))#测试是否能读取with open('city_for_code.json','r+',encoding='utf-8') as file:    data_dst = file.readlines()    d = eval(data_dst[0])

而后就是一顿解决,只把咱们所需的 city_name 和 city_code 这俩字段取出即可,随后写入文件中。如果读取的话就依照下面办法去读取,须要留神的是,应用 open()办法读取文件,失去的内容是一个列表,咱们须要通过 eval()办法转化成 dict 类型。

这是把 city_name 和 city_code 放到一个文件中的办法,另外咱们也能够放到数据库中,这里以 MySQL 为例,装置 PyMySQL 模块

import pymysqldb_parames = {    'host': 'localhost',    'user': 'root',    'password': '123456',    'database': 'city_code_info'}#连贯数据库conn = pymysql.connect(**db_parames)#创立游标对象,增删改查都在游标上进行cursor = conn.cursor()#表存在,就删除cursor.execute("DROP TABLE IF EXISTS city_code")#建表语句create_table_sql = """CREATE TABLE `city_code` (  `city_name` varchar(20) DEFAULT NULL,  `city_code` varchar(25) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"""#建表cursor.execute(create_table_sql)#插入数据with open('city_for_code.json','r+',encoding='utf-8') as f:    origin_data = f.readlines()    current_data = eval(origin_data[0])   #读取的内容是一个列表,且只蕴含一个元素    #print(current_data.get('北京','Not Exists.'))    for name, code in current_data.items():        sql = """INSERT INTO city_code(city_name, city_code) VALUES ('%s', '%s')""" % (name, code)        try:            cursor.execute(sql)        except:            conn.rollback()    conn.commit()    conn.close()

执行这个 python 程序就能够将文件中的城市名跟城市码存到库中,当然咱们也能够间接获取到城市名和城市码,而后跳过文件长久化这一步,间接把这两个字段取出存进去,然而思考着代码要多练多写,就多此一举了一下。

上面是输出城市名就能失去城市码的代码块:

import pymysqldef get_city_code(city_name):    db_parames = {    'host': 'localhost',    'user': 'root',    'password': '123456',    'database': 'city_code_info'    }    #连贯数据库    conn = pymysql.connect(**db_parames)    #创立游标对象,增删改查都在游标上进行    cursor = conn.cursor()    #创立查问语句    select_sql = "SELECT * FROM city_code where city_name='%s'"%(city_name)    try:        cursor.execute(select_sql)        result = cursor.fetchall()        for row in result:            city_code = row[1]        return city_code    except:        return "Error: unable fetch data!"

而后是依据输出的城市码来获取天气情况:

import requestsdef get_weather(city_name,get_date_time=3):    city_code = get_city_code(city_name)    url = 'http://t.weather.sojson.com/api/weather/city/%s'%(city_code)    header = {    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'    }    response = requests.get(url,header)    response.encoding = 'utf-8'    weather = response.json()    day = {1: '今天', 2: '先天', 3: '大后天'}    weather_lst = []    for num in range(get_date_time):        City = weather["cityInfo"]["city"]        Weatherganmao = weather["data"]["ganmao"]        Weatherquality = weather["data"]["quality"]        Weathershidu = weather["data"]["shidu"]        Weatherwendu = weather["data"]["wendu"]        Weatherpm25 = str(weather["data"]["pm25"])        Weatherpm10 = str(weather["data"]["pm10"])        Dateymd = weather["data"]["forecast"][num]["ymd"]        Dateweek = weather["data"]["forecast"][num]["week"]        Sunrise = weather["data"]["forecast"][num]["sunrise"]        Sunset = weather["data"]["forecast"][num]["sunset"]        Windfx = weather["data"]["forecast"][num]["fx"]        Windf1 = weather["data"]["forecast"][num]["fl"]        Weathertype = weather["data"]["forecast"][num]["type"]        Weathernotice = weather["data"]["forecast"][num]["notice"]        Weatherhigh = weather["data"]["forecast"][num]["high"]        Weatherlow = weather["data"]["forecast"][num]["low"]        if num == 0:            result = '今日天气预报' + '\n' \                + '日期: ' + Dateymd + ' ' + Dateweek + ' ' + City + '\n' \                + '天气: ' + Weathertype + ' ' + Windfx + ' ' + Windf1 + ' ' + Weathernotice + '\n' \                + '以后温度: ' + Weatherwendu + '℃' + '\n' \                + '空气湿度: ' + Weathershidu + '\n' \                + '温度范畴: ' + Weatherlow + '' + '~' + '' + Weatherhigh + '\n' \                + '净化指数: ' + 'PM2.5: ' + Weatherpm25 + ' ' + 'PM10: ' + Weatherpm10 + '\n' \                + '空气质量: ' + Weatherquality + '\n' \                + '日出工夫: ' + Sunrise + '\n' \                + '日落工夫: ' + Sunset + '\n' \                + '舒适提醒: ' + Weatherganmao        else:            which_day = day.get(num,'超出范围')            result = '\n' + which_day + ' ' + '天气预报' + '\n' \                + '日期: ' + Dateymd + ' ' + Dateweek + ' ' + City + '\n' \                + '天气: ' + Weathertype + ' ' + Windfx + ' ' + Windf1 + ' ' + Weathernotice + '\n' \                + '温度范畴: ' + Weatherlow + '' + '~' + '' + Weatherhigh + '\n' \                + '日出工夫: ' + Sunrise + '\n' \                + '日落工夫: ' + Sunset + '\n' \                + '舒适提醒: ' + Weatherganmao        weather_lst.append(result)        weather_str = ''     #因为默认要输入三天的天气情况,所以咱们须要创立一个空字符串,而后每迭代一次,就将天气情况拼接到空字符串中。        for msg in weather_lst:            weather_str += msg + '\n'    return weather_str

上面是发送微信音讯

from wxpy import *def send_wx(city_name, who):    bot = Bot(cache_path=True)    #bot = Bot(console_qr=2, cache_path='botoo.pkl')    my_friend = bot.friends().search(who)[0]    msg = get_weather(city_name)    try:        my_friend.send(msg)    except:        my_friend = bot.friends().search('fei')[0]        my_friend.send(u"发送失败")

而后咱们还须要写一个定时器,每隔一段时间便要发送一次

from threading import Timerdef auto_send():    city_name = '设置要发送的城市'    friend_list = ['要发送的人']    for who in friend_list:        send_wx(city_name,who)    global timer    timer = Timer(1,auto_send)    timer.start()

最初执行程序

if __name__ == '__main__':    timer = Timer(1,auto_send)    timer.start()

欢送各位朋友关注我的公众号,来一起学习提高哦

本文由博客群发一文多发等经营工具平台 OpenWrite 公布