吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 657|回复: 16
收起左侧

[Python 原创] 免费使用腾讯云函数定时推送天气信息

[复制链接]
RenJiu 发表于 2024-12-13 00:24

使用腾讯云函数定时推送天气信息

  • 准备材料

    • 钉钉机器人Webhook地址
    • 钉钉机器人的加签
    • 高德开放平台API Key
    • 城市编码(默认330109_萧山区)
  • 必须设置以下环境变量:

    • CITY_CODE: 城市编码(默认值:330109)
    • AMAP_API_KEY: 高德开放平台 API Key
    • DINGTALK_WEBHOOK: 钉钉机器人 Webhook 地址
    • DINGTALK_SECRET: 钉钉机器人的加签秘钥
  • 部署步骤

      • index.py上传到腾讯云函数
      • 设置环境变量
      • 定时触发每天上午 8 点 45 分执行一次
    • -示例:45 8 * * *
  • 特点

    • 使用标准库,无额外依赖
    • 这就是最大的优点!!!
# 部署图片示例下载
https://wwmd.lanzouv.com/i8qCo2hz5y1a  密码:52pj

代码如下

# index.py
import os
import json
import time
import hmac
import hashlib
import base64
import urllib.request
import urllib.parse
from datetime import datetime, timedelta

def get_weather_forecast(city_code, api_key):
    """获取3天天气预报信息"""
    url = f"https://restapi.amap.com/v3/weather/weatherInfo?key={api_key}&city={city_code}&extensions=all"

    try:
        with urllib.request.urlopen(url) as response:
            data = json.loads(response.read().decode('utf-8'))

            if data['status'] == '1' and data['count'] == '1':
                forecast = data['forecasts'][0]
                return {
                    'city': forecast['city'],
                    'forecast': forecast['casts']
                }
            else:
                return None
    except Exception as e:
        print(f"获取天气预报失败: {e}")
        return None

def dingtalk_sign(secret):
    """钉钉机器人签名"""
    timestamp = str(round(time.time() * 1000))
    secret_enc = secret.encode('utf-8')
    string_to_sign = f'{timestamp}\n{secret}'
    string_to_sign_enc = string_to_sign.encode('utf-8')
    hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
    sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
    return timestamp, sign

def send_dingtalk_message(webhook, secret, message):
    """发送钉钉机器人消息"""
    timestamp, sign = dingtalk_sign(secret)

    headers = {
        'Content-Type': 'application/json'
    }

    data = {
        "msgtype": "text",
        "text": {
            "content": message
        },
        "timestamp": timestamp,
        "sign": sign
    }

    req = urllib.request.Request(
        url=f"{webhook}×tamp={timestamp}&sign={sign}", 
        data=json.dumps(data).encode('utf-8'), 
        headers=headers,
        method='POST'
    )

    try:
        with urllib.request.urlopen(req) as response:
            return json.loads(response.read().decode('utf-8'))
    except Exception as e:
        print(f"发送消息失败: {e}")
        return None

def get_chinese_weekday(date_str):
    """根据日期字符串获取中文星期"""
    weekdays = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]
    date_obj = datetime.strptime(date_str, "%Y-%m-%d")
    return weekdays[date_obj.weekday()]

def main_handler(event, context):
    """主处理函数"""
    # 从环境变量读取配置
    city_code = os.environ.get('CITY_CODE', '330109')  # 默认萧山区
    amap_key = os.environ.get('AMAP_API_KEY')
    dingtalk_webhook = os.environ.get('DINGTALK_WEBHOOK')
    dingtalk_secret = os.environ.get('DINGTALK_SECRET')

    if not all([amap_key, dingtalk_webhook, dingtalk_secret]):
        print("环境变量配置不完整")
        return

    # 获取当前时间
    now = datetime.now() + timedelta(hours=8)  # 转换为北京时间
    date_str = now.strftime("%Y年%m月%d日")
    time_str = now.strftime("%H:%M")

    # 获取天气预报信息
    weather_forecast = get_weather_forecast(city_code, amap_key)

    if weather_forecast:
        # 构建消息
        message = f"天气预报\n" \
                  f"日期:{date_str}\n" \
                  f"时间:{time_str}\n" \
                  f"城市:{weather_forecast['city']}\n\n"

        # 添加3天天气预报
        for index, day in enumerate(weather_forecast['forecast'][:3], 1):
            weekday = get_chinese_weekday(day['date'])
            message += f"第{index}天 {day['date']} {weekday}\n" \
                       f"白天:{day['dayweather']}\n" \
                       f"夜间:{day['nightweather']}\n" \
                       f"温度:{day['daytemp']}°C / {day['nighttemp']}°C\n" \
                       f"风向:{day['daywind']} {day['daypower']} 级\n\n"

        # 去除最后的换行
        message = message.rstrip()

        # 发送钉钉消息
        send_dingtalk_message(dingtalk_webhook, dingtalk_secret, message)

    return {"statusCode": 200, "body": "Weather forecast sent"}
1.png
2.png
3.png

免费评分

参与人数 3吾爱币 +8 热心值 +2 收起 理由
moonlight2046 + 1 谢谢@Thanks!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
dabiaoge144 + 1 鼓励转贴优秀软件安全工具和文档!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| RenJiu 发表于 2024-12-13 00:27
高德开放平台 API Key,需要创建应用,在创建key
14b45b9bcb3ce6ee9953536366aad4f.png
WePojie 发表于 2024-12-14 16:38
 楼主| RenJiu 发表于 2024-12-14 17:29
submit 发表于 2024-12-15 17:44
不错不错  很牛逼
头像被屏蔽
pomxion 发表于 2024-12-15 22:06
提示: 作者被禁止或删除 内容自动屏蔽
lzy12001 发表于 2024-12-18 20:47
感谢分享,很牛逼
ziyuejun 发表于 2024-12-19 11:47
请教下,执行成功了,但是没有收到机器人推送的消息,是怎么回事啊?
2909.jpg
10318.jpg
 楼主| RenJiu 发表于 2024-12-19 17:22
ziyuejun 发表于 2024-12-19 11:47
请教下,执行成功了,但是没有收到机器人推送的消息,是怎么回事啊?

有日志吗?环境变量要填写对应的加签
ziyuejun 发表于 2024-12-21 15:47
RenJiu 发表于 2024-12-19 17:22
有日志吗?环境变量要填写对应的加签

填写了加签的SECRET和webhook也不行 无标题.png
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-6 06:18

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表