python获取天气接口给指定微信好友发天气预报
作者:dogfei 发布时间:2023-08-11 18:13:06
先看下效果图:
用到的模块:
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


猜你喜欢
- 我们可以通过mysql命令查看mysql的安装路径:# 以下两个sql任意一个可查询select @@basedir as basePath
- 在分析python的参数传递是如何进行的之前,我们需要先来了解一下,python变量和赋值的基本原理,这样有助于我们更好的理解参数传递。py
- 关于Jmeter性能测试工具不再过多介绍。如果你要学习软件性能测试,那么多少应该会对它有所耳闻。强烈建议阅读官方文档学习:http://jm
- 反射反射机制就是在运行时,动态的确定对象的类型,并可以通过字符串调用对象属性、方法、导入模块,是一种基于字符串的事件驱动。解释型语言:程序不
- 当用户关闭cookie时,通过asp程序提示访客打开,源代码如下: Dim strCookie, strT
- 编码问题response = requests.get(URL, params=params, he
- 作为设计师,我们都知道,一个极简的设计可以实现漂亮的效果。然而,很多设计师在实现上有些麻烦:要么是没有时间让使用如此少的元素制作的页面看起来
- 远程登陆SQLServer (2014)数据库,供大家参考,具体内容如下两台电脑,同一个局域网内,IP同一网段配置:Computer1: W
- PSUtil是一个跨平台的Python库,用于检索有关正在运行的进程和系统利用率(CPU,内存,磁盘,网络,传感器)的信息。它可以跨平台使用
- 方法1: X:\oracle\ora81\bin\wrap iname=XXX oname=XXX 方法2:9i在win2000下使用wra
- 今天给vscode配置git的时候,差点没把我送走,我在配置git项目的时候会,看了一个博客文章的教学,其中配置路径的方法如下1. 在git
- 本文实例讲述了python实现文件快照加密保护的方法。分享给大家供大家参考。具体如下:这段代码可以对指定的目录进行扫描,包含子目录,对指定扩
- php面试题的题目: $a = '/a/b/c/d/e.php'; $b = '/a/b/12/34/c.php
- 目录一、使用JDBC连接数据库1.使用JDBC-ODBC桥驱动程序连接数据库2.下面进行代码演示3.注意点二、源码:一、使用JDBC连接数据
- os/exec包可用于调用外部命令,可以使用管道连接输入输出,并支持阻塞与非阻塞方式执行命令。os/exec包中关键的类型为Cmd,以下介绍
- 声明,本文中所称CSS雪碧即为CSS Sprites,这个词组一直没有一个固定或者约定俗成的中文翻译,一些人开始称之为CSS雪碧,我们且当作
- 不过,如果您需要查找文档中的一个特定的元素,最有效的方法是 getElementById()。 不过要注意的是使用getElementByI
- 工作中偶尔需要做客流分析,用pyplot 库绘图。一般情况下, x 轴刻度默认显示为数字。例如:我希望x 轴刻度显示为星期日期。查询pypl
- 示例代码,用到了函数substr与iconv_substr,mb_substr<html><head><met
- Internet的规模每一百天就会增长一倍,客户希望获得7天×24小时的不间断可用性及较快的系统反应时间,而不愿屡次看到某个站点“Serve