在数字化时代,及时获取信息至关重要。而微信则是当下最重要的信息获取渠道。解锁微信消息推送服务,将给我们带来极大的便利。
本文将给大家解锁一款微信消息推送工具 ShowdDoc。
ShowDoc 推送服务作为一款强大工具,能轻松实现从服务器向手机推送消息,为服务器告警、程序监控通知等场景提供便利。本文将深入介绍其使用方法,并分享多个实用示例。
ShowDoc 推送服务是 ShowDoc 旗下独立工具,它最大的优势在于使用简单、开箱可用,无需复杂配置。而且,它承诺长期维护且持续免费,不限制消息数量和请求数,还极具编程拓展性,能满足多样化需求。
打开推送服务首页 https://push.showdoc.com.cn (建议电脑端访问),切换到右上角“推送”导航菜单,就能看到专属推送地址。这个地址是后续推送消息的关键入口。
{"error_code": 0,"error_message": "ok"}
,其中error_code
为0表示请求成功。{"error_code": 10103,"error_message": "url或token不正确"}
,根据error_message
提示的错误信息,可排查问题。手动推送适用于即时性、临时性的消息通知。例如,在开发过程中,想要快速告知团队成员某个功能模块完成测试。
[你的专属推送地址]?title=功能模块测试完成&content=用户登录模块已完成测试,目前运行稳定
。回车后,绑定的微信就能收到消息。借助Python和相关天气API,可实现自动推送天气信息。这里以requests
库获取天气数据、Markdown
格式组织内容为例。
import requests
import time
# 获取专属推送地址
push_url = "[你的专属推送地址]"
# 天气API,以和风天气为例
weather_api = "https://devapi.qweather.com/v7/weather/now?location=101010100&key=[你的和风天气API key]"
whileTrue:
try:
# 获取天气数据
weather_response = requests.get(weather_api)
weather_data = weather_response.json()
if weather_response.status_code == 200:
temperature = weather_data['now']['temp']
weather_desc = weather_data['now']['text']
# 构造Markdown格式消息内容
content = f"# 今日天气\n当前温度:{temperature}℃\n天气状况:{weather_desc}"
# 构造请求参数
params = {
"title": "今日天气 Markdown",
"content": content
}
# 发送推送请求
push_response = requests.get(push_url, params=params)
print(push_response.json())
else:
print("获取天气数据失败")
except Exception as e:
print(f"发生错误:{e}")
time.sleep(3600) # 每小时推送一次
同样以Python为例,这次用HTML格式组织天气信息。
import requests
import time
# 获取专属推送地址
push_url = "[你的专属推送地址]"
# 天气API,以和风天气为例
weather_api = "https://devapi.qweather.com/v7/weather/now?location=101010100&key=[你的和风天气API key]"
whileTrue:
try:
# 获取天气数据
weather_response = requests.get(weather_api)
weather_data = weather_response.json()
if weather_response.status_code == 200:
temperature = weather_data['now']['temp']
weather_desc = weather_data['now']['text']
# 构造HTML格式消息内容
content = f"""
<html>
<head><title>今日天气</title></head>
<body>
<h1>今日天气</h1>
<p>当前温度:{temperature}℃</p>
<p>天气状况:{weather_desc}</p>
</body>
</html>
"""
# 构造请求参数
params = {
"title": "今日天气 HTML",
"content": content
}
# 发送推送请求
push_response = requests.get(push_url, params=params)
print(push_response.json())
else:
print("获取天气数据失败")
except Exception as e:
print(f"发生错误:{e}")
time.sleep(3600) # 每小时推送一次
使用腾讯财经API获取股票实时价格,并推送信息。
push.config.json
用于存储配置信息,格式如下:
{
"showdoc_api": "[你的专属推送地址]",
"input_file": "stock_list.csv",
"update_interval": 300
}
stock_list.csv
用于存储股票列表信息,格式如下:
code
sh600000
sz000001
完整程序代码如下:
import pandas as pd
import requests
from datetime import datetime
import time
import json
import os
def load_config(config_file='push.config.json'):
"""读取JSON格式的配置文件"""
ifnot os.path.exists(config_file):
print(f"配置文件 {config_file} 不存在!")
returnNone
try:
with open(config_file, 'r', encoding='utf-8') as f:
return json.load(f)
except Exception as e:
print(f"读取配置文件出错: {e}")
returnNone
def read_stock_list(file_path):
"""读取股票列表文件"""
try:
# 尝试读取CSV文件
if file_path.endswith('.csv'):
df = pd.read_csv(file_path)
# 假设CSV文件中有'code'列,存储股票代码
return df['code'].tolist()
# 尝试读取文本文件
else:
with open(file_path, 'r', encoding='utf-8') as f:
return [line.strip() for line in f if line.strip()]
except Exception as e:
print(f"读取股票列表文件出错: {e}")
return []
def get_stock_price_qq(stock_code):
"""使用腾讯财经API获取股票实时价格"""
# 转换股票代码格式
if stock_code.startswith('sh') or stock_code.startswith('sz'):
code = stock_code
else:
# 根据股票代码判断市场
code = f"sh{stock_code}"if stock_code.startswith('6') elsef"sz{stock_code}"
url = f"https://qt.gtimg.cn/q={code}"
try:
response = requests.get(url)
response.encoding = 'gbk'
data = response.text.split('~')
if len(data) < 2:
returnNone
stock_info = {
"代码": code,
"名称": data[1],
"现价": float(data[3]),
"涨跌幅": float(data[32]),
"今开": float(data[5]),
"最高": float(data[33]),
"最低": float(data[34]),
"昨收": float(data[4]),
"成交量": float(data[6]) / 10000, # 转换为手
"成交额": float(data[37]) , #/ 10000, # 转换为万元
"时间": datetime.now().strftime('%Y-%m-%d %H:%M:%S')
}
return stock_info
except Exception as e:
print(f"获取股票 {code} 数据时出错: {e}")
returnNone
def format_stock_message(stock_data_list):
"""将股票数据格式化为适合手机显示的Markdown格式"""
ifnot stock_data_list:
return"没有获取到股票数据"
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# 计算涨跌家数
up_count = sum(1for stock in stock_data_list if stock['涨跌幅'] > 0)
down_count = sum(1for stock in stock_data_list if stock['涨跌幅'] < 0)
flat_count = sum(1for stock in stock_data_list if stock['涨跌幅'] == 0)
# 计算整体涨跌情况
total_change = sum(stock['涨跌幅'] for stock in stock_data_list) / len(stock_data_list)
market_trend = "📈"if total_change > 0else"📉"if total_change < 0else"➡️"
content = f"""## 股市行情速览 {market_trend}
**更新时间:** {current_time}
### 市场概况
`上涨 {up_count}` 🔴 | `下跌 {down_count}` 🟢 | `平盘 {flat_count}` ⚪
平均涨跌:{total_change:+.2f}%
### 行情 TOP {min(len(stock_data_list), 10)}
"""
# 按涨跌幅排序
sorted_stocks = sorted(stock_data_list, key=lambda x: x['涨跌幅'], reverse=True)
# 只显示前10只股票的详细信息
for stock in sorted_stocks[:10]:
# 设置涨跌颜色和箭头
if stock['涨跌幅'] > 0:
trend_icon = "📈"
trend_color = "🔴"
elif stock['涨跌幅'] < 0:
trend_icon = "📉"
trend_color = "🟢"
else:
trend_icon = "➡️"
trend_color = "⚪"
content += f"""
**{stock['名称']}** ({stock['代码']}) {trend_color}
价格:`{stock['现价']:.2f}` | 涨跌:`{stock['涨跌幅']:+.2f}%`
最高:`{stock['最高']:.2f}` | 最低:`{stock['最低']:.2f}`
成交:`{stock['成交量']:.2f}手` / `{stock['成交额']:.0f}万`
---"""
# 如果还有更多股票,显示简要信息
if len(sorted_stocks) > 10:
content += "\n### 其他股票简况\n"
for stock in sorted_stocks[10:]:
if stock['涨跌幅'] > 0:
trend_color = "🔴"
elif stock['涨跌幅'] < 0:
trend_color = "🟢"
else:
trend_color = "⚪"
content += f"`{stock['名称']}` {trend_color}`{stock['涨跌幅']:+.2f}%` "
# content += """
# ### 说明
# - 🔴 上涨 | 🟢 下跌 | ⚪ 平盘
# - 数据来源:腾讯财经
# - 仅供参考,实际交易以交易所数据为准
# """
return content
def push_to_showdoc(title, content, api_url):
"""推送消息到showdoc"""
try:
data = {
"title": title,
"content": content
}
response = requests.post(api_url, json=data)
response.raise_for_status()
return response.json()
except Exception as e:
print(f"推送消息时出错: {e}")
returnNone
if __name__ == "__main__":
# 读取配置
config = load_config()
ifnot config:
print("加载配置失败,程序退出")
exit()
# 读取股票列表
stock_codes = read_stock_list(config['input_file'])
ifnot stock_codes:
print("没有找到股票列表或列表为空")
exit()
print(f"共读取到 {len(stock_codes)} 只股票")
whileTrue:
try:
# 获取股票数据
stock_data_list = []
for code in stock_codes:
stock_info = get_stock_price_qq(code)
if stock_info:
stock_data_list.append(stock_info)
print(f"已获取: {stock_info['名称']} ({stock_info['代码']})")
time.sleep(0.5)
if stock_data_list:
# 格式化消息
title = f"股票实时行情 {datetime.now().strftime('%H:%M')}"
content = format_stock_message(stock_data_list)
# 推送到ShowDoc
result = push_to_showdoc(title, content, config['showdoc_api'])
if result:
print(f"[{datetime.now()}] 数据推送成功!")
else:
print(f"[{datetime.now()}] 数据推送失败!")
else:
print(f"[{datetime.now()}] 没有获取到任何股票数据")
# 等待下次更新
print(f"等待 {config['update_interval']} 秒后更新...")
time.sleep(config['update_interval'])
except KeyboardInterrupt:
print("\n程序已停止运行")
break
except Exception as e:
print(f"运行出错: {e}")
time.sleep(60) # 出错后等待1分钟再重试
ShowDoc 推送服务功能强大且灵活,无论是手动推送简单消息,还是通过编程实现自动推送复杂信息,都能轻松应对。希望这些使用方法和示例能帮助你更好地利用该服务,提升信息获取和传递的效率。