python获取天气接口给指定微信好友发天气预报

作者:dogfei 时间:2023-08-11 18:13:06 

先看下效果图:

python获取天气接口给指定微信好友发天气预报

用到的模块:

  • 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 pymysql

db_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 pymysql

def 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 requests

def 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 Timer

def 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()

来源:https://www.cnblogs.com/dogfei/archive/2020/12/28/14199672.html

标签:python,天气预报,获取接口,微信好友
0
投稿

猜你喜欢

  • pycharm通过anaconda安装pyqt5的教程

    2023-09-06 03:31:37
  • python编程webpy框架模板之def with学习

    2023-08-07 11:23:32
  • 一文带你搞懂JS中导入模块import和require的区别

    2023-07-21 03:24:18
  • 动态载入asp树源码

    2007-09-06 19:34:00
  • 如何用OpenCV -python3实现视频物体追踪

    2022-04-02 23:15:58
  • Vue使用Element-UI生成并展示表头序号的方法

    2024-06-05 10:04:27
  • MYSQL5.6.33数据库主从(Master/Slave)同步安装与配置详解(Master-Linux Slave-windows7)

    2024-01-17 00:23:34
  • Python标准库shutil用法实例详解

    2021-03-25 21:04:25
  • Python 时间戳之获取整点凌晨时间戳的操作方法

    2023-10-10 19:42:33
  • Python实现实时显示进度条的六种方法

    2022-03-27 02:09:35
  • 在Apache服务器上同时运行多个Django程序的方法

    2022-05-16 11:16:09
  • mysql中数据库覆盖导入的几种方式总结

    2024-01-19 22:26:33
  • Python发送http请求解析返回json的实例

    2022-04-11 03:38:28
  • Django如何实现内容缓存示例详解

    2022-02-23 15:33:01
  • asp如何制作一个文本文件编辑器?

    2010-07-07 12:26:00
  • 破解 屏蔽 防框架代码 top.location != self.location

    2008-11-27 12:59:00
  • 在Django的视图中使用数据库查询的方法

    2024-01-14 20:03:20
  • Python reques接口测试框架实现代码

    2023-10-07 12:47:08
  • Python Pandas知识点之缺失值处理详解

    2023-09-29 20:23:16
  • Python利用3D引擎做一个太阳系行星模拟器

    2022-02-03 11:00:58
  • asp之家 网络编程 m.aspxhome.com