Bootstrap

Python实现微信天气信息推送

1.前言

在日常生活中,天气信息对我们的出行、工作和生活规划至关重要。为了更方便地获取天气信息,我们可以通过微信推送的方式,将实时天气信息发送到手机上。本文将介绍如何使用Python实现一个简单的微信天气信息推送功能。

2.实现思路

  • 获取天气数据:通过调用天气API,获取指定城市的实时天气信息。
  •  格式化天气信息:将获取到的天气数据格式化为HTML字符串,方便在微信中展示。
  • 推送消息到微信:使用PushPlus服务将格式化后的天气信息推送到微信。

3.具体步骤

1.获取天气数据

我们使用聚合数据(Juhe)提供的天气API来获取天气信息。首先需要注册并获取一个API密钥(Key),然后通过HTTP请求获取天气数据。

import urllib.request

import urllib.parse

import json

 

def get_weather(city):

    """

    获取指定城市的天气信息

    :param city: 城市名称

    :return: 返回格式化后的天气信息HTML字符串,或错误信息

    """

    url = 'http://apis.juhe.cn/simpleWeather/query' # 天气API的URL

 

    params = {

        "city": city,

        "key": "your key", # 替换为你的实际API密钥

    }

 

    # 将参数编码为URL查询字符串

    query_string = urllib.parse.urlencode(params).encode('utf-8')

 

    try:

        # 创建请求对象

        request = urllib.request.Request(url, data=query_string)

        # 发送请求并获取响应

        response = urllib.request.urlopen(request)

        # 读取响应内容

        content = response.read()

 

        if content:

            try:

                # 将响应内容解析为JSON

                result = json.loads(content.decode('utf-8'))

                error_code = result['error_code']

                if error_code == 0:

                    # 提取天气信息

                    temperature = result['result']['realtime']['temperature']

                    humidity = result['result']['realtime']['humidity']

                    info = result['result']['realtime']['info']

                    wid = result['result']['realtime']['wid']

                    direct = result['result']['realtime']['direct']

                    power = result['result']['realtime']['power']

                    aqi = result['result']['realtime']['aqi']

                    # 返回格式化后的天气信息HTML字符串

                    return f"""

                        <div class="container mt-4">

                            <div class="row">

                                <div class="col-md-6 mb-3">

                                    <div class="card bg-light border-primary">

                                        <div class="card-header bg-primary text-white">

                                            <h5 class="card-title">城市:{city}</h5>

                                        </div>

                                        <div class="card-body">

                                            <p class="card-text">温度:{temperature}℃</p>

                                            <p class="card-text">湿度:{humidity}%</p>

                                        </div>

                                    </div>

                                </div>

                                <div class="col-md-6 mb-3">

                                    <div class="card bg-light border-success">

                                        <div class="card-header bg-success text-white">

                                            <h5 class="card-title">天气信息</h5>

                                        </div>

                                        <div class="card-body">

                                            <p class="card-text">天气:{info}</p>

                                            <p class="card-text">天气标识:{wid}</p>

                                            <p class="card-text">风向:{direct}</p>

                                            <p class="card-text">风力:{power}</p>

                                            <p class="card-text">空气质量:{aqi}</p>

                                        </div>

                                    </div>

                                </div>

                            </div>

                            <div class="text-center">

                                <a href='https://www.weaoo.com/guangzhou-181278.html' class='btn btn-primary' role='button'>点击查看广州天气网</a>

                            </div>

                        </div>

                    """

                else:

                    # 返回错误信息

                    return f"请求失败: {result['error_code']} {result['reason']}"

            except Exception as e:

                # 返回解析异常信息

                return f"解析结果异常:{e}"

        else:

            # 返回请求异常信息

            return "请求异常"

    except Exception as e:

        # 返回请求异常信息

        return f"An error occurred: {e}"

 2. 推送消息到微信

我们使用PushPlus服务将天气信息推送到微信。PushPlus是一个消息推送平台,支持通过API将消息推送到微信、钉钉等平台。

import requests

 

def send_pushplus_msg(content):

    """

    使用PushPlus发送消息

    :param content: 要发送的消息内容

    """

    token = 'pushplus token' # 替换为你的实际PushPlus Token

    title = '广州天气推送'

    template = 'html'

 

    # 构建PushPlus请求URL

    url = f"http://www.pushplus.plus/send?token={token}&title={title}&content={content}&template={template}&topic="

    

    # 发送请求并打印响应

    r = requests.get(url)

    print(r.text)

4.完整代码

import urllib.request
import urllib.parse
import json
import requests

def get_weather(city):
    url = 'http://apis.juhe.cn/simpleWeather/query'

    params = {
        "city": city,
        "key": "api key",  # Replace with your actual API key
    }

    query_string = urllib.parse.urlencode(params).encode('utf-8')

    try:
        request = urllib.request.Request(url, data=query_string)
        response = urllib.request.urlopen(request)
        content = response.read()

        if content:
            try:
                result = json.loads(content.decode('utf-8'))
                error_code = result['error_code']
                if error_code == 0:
                    temperature = result['result']['realtime']['temperature']
                    humidity = result['result']['realtime']['humidity']
                    info = result['result']['realtime']['info']
                    wid = result['result']['realtime']['wid']
                    direct = result['result']['realtime']['direct']
                    power = result['result']['realtime']['power']
                    aqi = result['result']['realtime']['aqi']
                    return f"""
                        <div class="container mt-4">
                            <div class="row">
                                <div class="col-md-6 mb-3">
                                    <div class="card bg-light border-primary">
                                        <div class="card-header bg-primary text-white">
                                            <h5 class="card-title">城市:{city}</h5>
                                        </div>
                                        <div class="card-body">
                                            <p class="card-text">温度:{temperature}℃</p>
                                            <p class="card-text">湿度:{humidity}%</p>
                                        </div>
                                    </div>
                                </div>
                                <div class="col-md-6 mb-3">
                                    <div class="card bg-light border-success">
                                        <div class="card-header bg-success text-white">
                                            <h5 class="card-title">天气信息</h5>
                                        </div>
                                        <div class="card-body">
                                            <p class="card-text">天气:{info}</p>
                                            <p class="card-text">天气标识:{wid}</p>
                                            <p class="card-text">风向:{direct}</p>
                                            <p class="card-text">风力:{power}</p>
                                            <p class="card-text">空气质量:{aqi}</p>
                                        </div>
                                    </div>
                                </div>
                            </div>
                            <div class="text-center">
                                <a href='https://www.weaoo.com/guangzhou-181278.html' class='btn btn-primary' role='button'>点击查看广州天气网</a>
                            </div>
                        </div>
                    """
                else:
                    return f"请求失败: {result['error_code']} {result['reason']}"
            except Exception as e:
                return f"解析结果异常:{e}"
        else:
            return "请求异常"
    except Exception as e:
        return f"An error occurred: {e}"


def send_pushplus_msg(content):
    token = 'pushplus token'  # Replace with your actual PushPlus Token
    title = '广州天气推送'
    template = 'html'

    url = f"http://www.pushplus.plus/send?token={token}&title={title}&content={content}&template={template}&topic="
    
    r = requests.get(url)
    print(r.text)

if __name__ == '__main__':
    city = "广州"  # 你想要获取天气的城市
    weather_info = get_weather(city)
    
    if "请求失败" in weather_info or "请求异常" in weather_info:
        print(weather_info)
    else:
        send_pushplus_msg(weather_info)
 

           

5.运行效果

 

 6.附接口地址

[聚合数据天气API]https://www.juhe.cn/docs/api/id/73

[PushPlus消息推送平台]http://www.pushplus.plus/

 

;