使用python獲取天氣接口給指定微信好友發天氣預報

先看下效果圖:python

用到的模塊:mysql

  • PyMySQL
  • requests
  • threading
  • wxpy

要實現上面的示例,首先是有兩大塊地方sql

  • 獲取天氣信息
  • 經過微信將天氣信息發送出去

而獲取天氣信息又包括幾個小的須要注意的地方數據庫

  • 獲取天氣信息
    • 獲取天氣信息的接口
    • 獲取天氣信息的城市
    • 獲取所在城市的城市碼

假如咱們給多我的發送天氣狀況,這幾我的來自不一樣的城市,那麼咱們不可能每次都要輸入城市名,而後查找城市碼,而後再訪問接口,獲取天氣狀況,這樣會很是的麻煩,因此咱們須要考慮將城市名跟城市碼一一對應起來,說到一一對應,首先想到的數據結構即是字典,因此咱們能夠將這些信息存入一個字典裏,而後持久化到一個文件中,這樣便方便不少json

首先咱們獲取最新的 city 表,這個表是一個 list 類型,大致格式以下:api

[
  {
    "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 類型。markdown

這是把 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 程序就能夠將文件中的城市名跟城市碼存到庫中,固然咱們也能夠直接獲取到城市名和城市碼,而後跳過文件持久化這一步,直接把這兩個字段取出存進去,可是考慮着代碼要多練多寫,就畫蛇添足了一下。app

下面是輸入城市名就能獲得城市碼的代碼塊:

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()
複製代碼

歡迎各位朋友關注個人公衆號,來一塊兒學習進步哦
images

本文由博客羣發一文多發等運營工具平臺 OpenWrite 發佈

相關文章
相關標籤/搜索