crypto_quant/core/wechat.py

103 lines
2.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
微信群发功能
建议使用企业微信
但需要管理员提供企业id以及secret信息
通过wechatpy库实现
"""
import core.logger as logging
import requests
import base64
import hashlib
import json
logger = logging.logger
class Wechat:
def __init__(self, key: str):
# 虽然config在根目录但是取决于调用代码在哪
# 只要启动代码文件在根目录config就能找到
self.key = key
self.url = f"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key={self.key}"
def send_text(self, text: str):
"""
发送文本消息
"""
data = {
"msgtype": "text",
"text": {"content": text}
}
response = requests.post(self.url, json=data)
response.raise_for_status()
return response.json()
def send_markdown(self, text: str):
"""
发送markdown消息
"""
data = {
"msgtype": "markdown_v2",
"markdown_v2": {"content": text}
}
response = requests.post(self.url, json=data)
response.raise_for_status()
return response.json()
def send_image(self, image_url: str):
"""
发送图片消息
"""
# data = {
# "msgtype": "image",
# "image": {"url": image_url}
# }
# response = requests.post(self.url, json=data)
# return response.json()
image_bytes = self.download_image(image_url)
base64_str, md5_str = self.get_base64_and_md5(image_bytes)
data = {
"msgtype": "image",
"image": {
"base64": base64_str,
"md5": md5_str,
}
}
response = requests.post(self.url, json=data)
response.raise_for_status()
return response.json()
def download_image(self, image_url):
"""下载图片并返回 bytes"""
response = requests.get(image_url, timeout=10)
response.raise_for_status() # 抛出 HTTP 错误
return response.content
def get_base64_and_md5(self,image_bytes):
"""计算 Base64不带 data: 前缀)和 MD5"""
b64 = base64.b64encode(image_bytes).decode('utf-8')
md5 = hashlib.md5(image_bytes).hexdigest()
return b64, md5
def send_file(self, file_url: str):
"""
发送文件消息
"""
data = {
"msgtype": "file",
"file": {"url": file_url}
}
response = requests.post(self.url, json=data)
response.raise_for_status()
return response.json()
def send_news(self, news: list):
"""
发送图文消息
"""
data = {
"msgtype": "news",
"news": {"articles": news}
}
response = requests.post(self.url, json=data)
response.raise_for_status()
return response.json()