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


Posted in Python onDecember 28, 2020

先看下效果图:

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

以上就是python获取天气接口给指定微信好友发天气预报的详细内容,更多关于python获取天气接口的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
深入理解python中函数传递参数是值传递还是引用传递
Nov 07 Python
Python实现按特定格式对文件进行读写的方法示例
Nov 30 Python
mac下给python3安装requests库和scrapy库的实例
Jun 13 Python
Python中的random.uniform()函数教程与实例解析
Mar 02 Python
如何在python中实现随机选择
Nov 02 Python
Python JSON编解码方式原理详解
Jan 20 Python
Python调用接口合并Excel表代码实例
Mar 31 Python
Django中文件上传和文件访问微项目的方法
Apr 27 Python
Python 如何实现访问者模式
Jul 28 Python
Python insert() / append() 用法 Leetcode实战演示
Mar 31 Python
浅谈Python数学建模之整数规划
Jun 23 Python
分享python函数常见关键字
Apr 26 Python
详解python 条件语句和while循环的实例代码
Dec 28 #Python
一个非常简单好用的Python图形界面库(PysimpleGUI)
Dec 28 #Python
python函数超时自动退出的实操方法
Dec 28 #Python
Python 利用argparse模块实现脚本命令行参数解析
Dec 28 #Python
python中str内置函数用法总结
Dec 27 #Python
python中温度单位转换的实例方法
Dec 27 #Python
Python新建项目自动添加介绍和utf-8编码的方法
Dec 26 #Python
You might like
PHP开发中常用的三个表单验证函数使用小结
2010/03/03 PHP
PHP遍历数组的几种方法
2012/03/22 PHP
Linux下php5.4启动脚本
2014/08/03 PHP
浅谈php的优缺点
2015/07/14 PHP
详解PHP防止直接访问.php 文件的实现方法
2017/07/28 PHP
Laravel中正确地返回HTTP状态码方法示例
2019/09/10 PHP
TP5多入口设置实例讲解
2020/12/15 PHP
CL vs ForZe BO5 第三场 2.13
2021/03/10 DOTA
TFDN图片播放器 不错自动播放
2006/10/03 Javascript
javascript 读取XML数据,在页面中展现、编辑、保存的实现
2009/10/27 Javascript
jQuery实现自定义事件的方法
2015/04/17 Javascript
jQuery实现按钮的点击 全选/反选 单选框/复选框 文本框 表单验证
2015/06/25 Javascript
JAVASCRIPT代码编写俄罗斯方块网页版
2015/11/26 Javascript
Node.js实用代码段之获取Buffer对象字节长度
2016/03/17 Javascript
node.js操作mongodb简单示例分享
2017/05/25 Javascript
基于three.js编写的一个项目类示例代码
2018/01/05 Javascript
[原创]js实现保存文本框内容为本地文件兼容IE,chrome,火狐浏览器
2018/02/14 Javascript
vue打包使用Nginx代理解决跨域问题
2018/08/27 Javascript
基于Vue实现平滑过渡的拖拽排序功能
2019/06/12 Javascript
js 执行上下文和作用域的相关总结
2021/02/08 Javascript
Python中urllib2模块的8个使用细节分享
2015/01/01 Python
Python的Twisted框架上手前所必须了解的异步编程思想
2016/05/25 Python
Python中规范定义命名空间的一些建议
2016/06/04 Python
pycharm通过ssh连接远程服务器教程
2020/02/12 Python
Python解释器以及PyCharm的安装教程图文详解
2020/02/26 Python
Python MySQL 日期时间格式化作为参数的操作
2020/03/02 Python
python同时遍历两个list用法说明
2020/05/02 Python
Python 制作查询商品历史价格的小工具
2020/10/20 Python
pandas实现导出数据的四种方式
2020/12/13 Python
html5的新玩法——语音搜索
2013/01/03 HTML / CSS
十岁生日父母答谢词
2014/01/18 职场文书
宿舍保安职务说明书
2014/02/25 职场文书
学习雷锋演讲稿
2014/05/10 职场文书
2015小学音乐教师个人工作总结
2015/07/21 职场文书
中学生国庆节演讲稿2015
2015/07/30 职场文书
参加招聘会后的感想
2015/08/10 职场文书