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错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法
Aug 22 Python
python处理Excel xlrd的简单使用
Sep 12 Python
Python通过Django实现用户注册和邮箱验证功能代码
Dec 11 Python
python使用udp实现聊天器功能
Dec 10 Python
计算机二级python学习教程(3) python语言基本数据类型
May 16 Python
Django如何将URL映射到视图
Jul 29 Python
python模块hashlib(加密服务)知识点讲解
Nov 25 Python
使用python动态生成波形曲线的实现
Dec 04 Python
Python GUI库PyQt5图形和特效样式QSS介绍
Feb 25 Python
Python描述符descriptor使用原理解析
Mar 21 Python
Python 将 QQ 好友头像生成祝福语的实现代码
May 03 Python
Python使用tkinter实现摇骰子小游戏功能的代码
Jul 02 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 面向对象实现代码
2009/11/11 PHP
php url路由入门实例
2014/04/23 PHP
微信公众号开发之微信公共平台消息回复类实例
2014/11/14 PHP
ThinkPHP采用原生query实现关联查询left join实例
2014/12/02 PHP
PHP实现微信发红包程序
2015/08/24 PHP
详解php 使用Callable Closure强制指定回调类型
2017/10/26 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
2017/11/16 PHP
passwordStrength 基于jquery的密码强度检测代码使用介绍
2011/10/08 Javascript
JS.getTextContent(element,preformatted)使用介绍
2013/09/21 Javascript
jQuery中Dom的基本操作小结
2014/01/23 Javascript
jquery提交form表单简单示例分享
2014/03/03 Javascript
使用JS或jQuery模拟鼠标点击a标签事件代码
2014/03/10 Javascript
jQuery 中$(this).index与$.each的使用指南
2014/11/20 Javascript
javascript中字体浮动效果的简单实例演示
2015/11/18 Javascript
JavaScript入门系列之知识点总结
2016/03/24 Javascript
javascript实现一个网页加载进度loading
2017/01/04 Javascript
详谈jQuery中使用attr(), prop(), val()获取value的异同
2017/04/25 jQuery
js图片放大镜实例讲解(必看篇)
2017/07/17 Javascript
JS实现移动端整屏滑动的实例代码
2017/11/10 Javascript
JavaScript插件Tab选项卡效果
2017/11/14 Javascript
解析vue中的$mount
2017/12/21 Javascript
vue.js给动态绑定的radio列表做批量编辑的方法
2018/02/28 Javascript
JS常见面试试题总结【去重、遍历、闭包、继承等】
2019/08/27 Javascript
bootstrap-table后端分页功能完整实例
2020/06/01 Javascript
关于vue 结合原生js 解决echarts resize问题
2020/07/26 Javascript
python中将阿拉伯数字转换成中文的实现代码
2011/05/19 Python
python读写ini配置文件方法实例分析
2015/06/30 Python
Python 提取dict转换为xml/json/table并输出的实现代码
2016/08/28 Python
python tkinter界面居中显示的方法
2018/10/11 Python
图文详解Django使用Pycharm连接MySQL数据库
2019/08/09 Python
html5 利用重力感应实现摇一摇换颜色可用来做抽奖等等
2014/05/07 HTML / CSS
Nike澳大利亚官网:Nike.com (AU)
2019/06/03 全球购物
公务员群众路线专题民主生活会发言材料
2014/09/17 职场文书
煤矿安全学习心得体会
2016/01/18 职场文书
Redis数据结构之链表与字典的使用
2021/05/11 Redis
numpy array找出符合条件的数并赋值的示例代码
2022/06/01 Python