吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1898|回复: 30
收起左侧

[Python 原创] Python写的一个钉钉机器人城市天气脚本

  [复制链接]
by12 发表于 2024-5-28 17:08
本帖最后由 by12 于 2024-5-29 11:55 编辑

由于该脚本是存放在服务器上,所以想得知本地天气这个问题肯定不能从获取本机IP来实现,所以我使用的是获取城市名。
将城市名保存到city.txt里,例如我这里写的是杭州。
image.png
那么每次运行脚本,钉钉机器人就会获取杭州这个名字加天气情况反馈到群聊中。
用到的是心知天气的api,需要直接注册一个就行。反正免费的。
image.png
钉钉的机器人hook跟加签获取到后直接替换到链接上就行了。
我用的是宝塔的计划任务,定得每天早上8点执行, image.png
看效果。 image.png
脚本下载就放下面啦,求点CB~
-----------------------
二次修改;
经过反馈有时候会出现无法获取城市的问题提示:
未能获取到天气信息,请检查城市名称。
经过排查发现是API里面没有城市天气信息导致的。应该是吧。
image.png
如果修改一个具体的就没问题了。
image.png
现在代码支持直接查看调试内容了。
image.png
image.png
-,-上面泄露的展示的key地址已经改了,所以大家需要还是去申请自己的吧。
最新下载地址:

https://www.lanzouw.com/id9RP202i2id
求CB来一波

免费评分

参与人数 8吾爱币 +10 热心值 +8 收起 理由
Yangzaipython + 1 用心讨论,共获提升!
sishuiliunian1 + 1 谢谢@Thanks!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
bskhk + 1 用心讨论,共获提升!
racham123 + 1 谢谢@Thanks!
Bob5230 + 1 + 1 我很赞同!
MQ19781011 + 1 + 1 虽然用不到,但是支持一下
yzmb8456 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

本帖被以下淘专辑推荐:

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

hack78 发表于 2024-5-30 09:10
换成企业微信版本
[Python] 纯文本查看 复制代码
import requests
import time
import hmac
import hashlib
import base64
import json

def get_weather(city):
    api_key = 'xxxxxxxx'  # 替换为您的心知天气 API 密钥
    url = f'https://api.seniverse.com/v3/weather/now.json?key={api_key}&location={city}&language=zh-Hans'
    response = requests.get(url)
    print(f"Requesting weather data with URL: {url}")

    if response.status_code != 200:
        print(f"Failed to get weather data: {response.status_code} - {response.text}")
        return None
    
    data = response.json()
    if 'results' in data and data['results']:
        weather_info = data['results'][0]['now']
        weather_desc = weather_info['text']
        weather_icon = get_weather_icon(weather_desc)
        temperature = weather_info['temperature']
        return weather_desc, weather_icon, temperature
    else:
        print("No results found in weather data")
        return None

def get_weather_forecast(city):
    api_key = 'xxxxxxx'  # 替换为您的心知天气 API 密钥
    url = f'https://api.seniverse.com/v3/weather/daily.json?key={api_key}&location={city}&language=zh-Hans&days=3'
    response = requests.get(url)
    print(f"Requesting weather forecast data with URL: {url}")

    if response.status_code != 200:
        print(f"Failed to get weather forecast data: {response.status_code} - {response.text}")
        return None
    
    data = response.json()
    if 'results' in data and data['results']:
        forecasts = data['results'][0]['daily']
        return forecasts
    else:
        print("No results found in weather forecast data")
        return None

def get_weather_icon(weather_desc):
    if '晴' in weather_desc:
        return '☀️'
    elif '多云' in weather_desc:
        return '☁️'
    elif '雨' in weather_desc:
        return '🌧️'
    else:
        return ''

def send_to_wechat(message, webhook_url):
    headers = {'Content-Type': 'application/json'}
    data = {
        'msgtype': 'markdown',
        'markdown': {
            'content': message
        }
    }
    response = requests.post(webhook_url, data=json.dumps(data), headers=headers)
    if response.status_code == 200:
        print("Message sent successfully to WeChat!")
    else:
        print(f"Failed to send message to WeChat: {response.status_code}")

# 直接指定城市名称
city = '北京'

# 从环境变量中获取企业微信机器人的 Webhook URL
webhook_url = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxxx'  # 替换为您的企业微信机器人的 Webhook URL

# 获取天气信息
weather_data = get_weather(city)
forecasts = get_weather_forecast(city)

# 构建消息内容
if weather_data and forecasts:
    weather_desc, weather_icon, temperature = weather_data
    message = f"### 今日天气提醒\n\n城市:{city}\n天气:{weather_icon} {weather_desc}\n温度:{temperature}°C\n\n【未来3天天气预报】\n\n"
    for forecast in forecasts:
        date = forecast['date']
        weather_desc = forecast['text_day']
        temperature_high = forecast['high']
        temperature_low = forecast['low']
        message += f"{date}: {weather_desc}, 温度:{temperature_low}°C ~ {temperature_high}°C\n\n"
else:
    message = "未能获取到天气信息,请检查城市名称。"

# 发送消息到企业微信机器人
send_to_wechat(message, webhook_url)
ForMuou 发表于 2024-11-25 15:08

改成了单个py文件 不需要单独的城市列表 用AI缩短了一下代码的长度

本帖最后由 ForMuou 于 2024-11-25 15:12 编辑

[Python] 纯文本查看 复制代码
# -*- coding: utf-8 -*-
import requests
import time
import hmac
import hashlib
import base64


def get_weather(city, api_key):
    """
    获取城市当前的天气信息

    :param city: 城市名称
    :param api_key: API 密钥
    :return: 成功时返回天气描述、天气图标和温度,失败时返回None
    """
    url = f'https://api.seniverse.com/v3/weather/now.json?key={api_key}&location={city}&language=zh-Hans'
    print(f"Requesting weather data for {city}")
    response = requests.get(url)
    if response.status_code != 200:
        print(f"Failed to get weather data for {city}: {response.status_code} - {response.text}")
        return None
    weather_info = response.json().get('results', [{}])[0].get('now', {})
    return weather_info.get('text'), get_weather_icon(weather_info.get('text', '')), weather_info.get('temperature', '')


def get_weather_forecast(city, api_key):
    """
    获取城市未来3天的天气预报

    :param city: 城市名称
    :param api_key: API 密钥
    :return: 成功时返回未来3天的天气预报列表,失败时返回None
    """
    url = f'https://api.seniverse.com/v3/weather/daily.json?key={api_key}&location={city}&language=zh-Hans&days=3'
    print(f"Requesting weather forecast data for {city}")
    response = requests.get(url)
    if response.status_code != 200:
        print(f"Failed to get weather forecast data for {city}: {response.status_code} - {response.text}")
        return None
    return response.json().get('results', [{}])[0].get('daily', [])


def get_weather_icon(weather_desc):
    """
    根据天气描述返回对应的天气图标

    :param weather_desc: 天气描述
    :return: 对应的天气图标
    """
    return '☀️' if '晴' in weather_desc else '☁️' if '多云' in weather_desc else '🌧️' if '雨' in weather_desc else ''


def send_to_dingtalk(message, webhook_url, secret):
    """
    发送消息到DingTalk机器人

    :param message: 消息内容
    :param webhook_url: Webhook URL
    :param secret: 机器人密钥
    :return: 无返回值
    """
    timestamp = str(round(time.time() * 1000))
    sign = base64.b64encode(
        hmac.new(secret.encode(), f"{timestamp}\n{secret}".encode(), hashlib.sha256).digest()).decode()
    final_url = f"{webhook_url}×tamp={timestamp}&sign={sign}"
    response = requests.post(final_url,
                             json={'msgtype': 'markdown', 'markdown': {'title': '天气提醒', 'text': message}},
                             headers={'Content-Type': 'application/json'})
    print(
        "Message sent successfully to DingTalk!" if response.status_code == 200 else f"Failed to send message to DingTalk: {response.status_code} - {response.text}")


# 多个城市名称
cities = ['北京', '上海', '广州', '深圳']

# 直接写死的API密钥 DingTalk的WebhookURL和密钥
api_key = '天气API秘钥'
webhook_url = 'WebhookURL'
secret = '签'

# 构建消息内容
message = "### 今日天气提醒\n\n"
for city in cities:
    weather_data = get_weather(city, api_key)
    forecasts = get_weather_forecast(city, api_key)
    if weather_data and forecasts:
        weather_desc, weather_icon, temperature = weather_data
        message += f"**城市:{city}**\n天气:{weather_icon} {weather_desc}\n温度:{temperature}°C\n\n【未来3天天气预报】\n\n"
        message += ''.join(
            f"{forecast['date']}: {forecast['text_day']}, 温度:{forecast['low']}°C ~ {forecast['high']}°C\n\n" for
            forecast in forecasts)
    else:
        message += f"未能获取到{city}的天气信息,请检查城市名称。\n\n"

# 发送消息到钉钉机器人
send_to_dingtalk(message, webhook_url, secret)
kun5815 发表于 2024-5-28 19:48
yzmb8456 发表于 2024-5-28 19:55
感谢楼主分享
laustar 发表于 2024-5-28 21:02
感谢楼主分享
yuzilin 发表于 2024-5-28 21:57
感谢分享!
meder 发表于 2024-5-28 22:36
感谢楼主分享
头像被屏蔽
hjsen 发表于 2024-5-28 23:16
提示: 作者被禁止或删除 内容自动屏蔽
icode_isky 发表于 2024-5-29 08:51
楼主你好,今天早上发现钉钉机器人无法获取正确的天气信息,昨天晚上手动执行的时候还有天气信息。

xiaofu666 发表于 2024-5-29 09:10
支持顶一下
 楼主| by12 发表于 2024-5-29 11:14
icode_isky 发表于 2024-5-29 08:51
楼主你好,今天早上发现钉钉机器人无法获取正确的天气信息,昨天晚上手动执行的时候还有天气信息。

那需要你检查一下计划任务是否设置正确。设置完你先执行一下看看效果。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-12-16 05:01

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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