This commit is contained in:
Byseven 2024-05-15 09:08:01 +00:00 committed by GitHub
commit 1c63c8fb76
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 242 additions and 91 deletions

View File

@ -28,6 +28,38 @@
</div>
</div>
## 如何使用本仓库内容
在青龙创建一个订阅
拉库命令 `ql repo https://github.com/Fansirsqi/dailycheckin.git null null null main`
配置执行后运行的命令
`pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple && pip install requests pycrypto pycryptodome && cd /ql/data/repo/Fansirsqi_dailycheckin_main && python setup.py develop`
在脚本管理根目录创建`config.json`配置文件可以参考官方配置,这里只是增加了一段
[配置示例](https://gist.githubusercontent.com/Fansirsqi/9e238bb3e432fdb7bee1caa46da81519/raw/5a7d599b526564c68b0120e9a275ce6f414757df/config.json)
```
,
"TESTNOTICE": [
{
"test1": "test1mesg"
}
]
```
强烈建议您在`https://www.json.cn/`这个网站检查您的配置
最后在定时任务里创建一个测试任务
`task dailycheckin --include TESTNOTICE`运行并查看日志
![1715763862230.png](https://pic2.ziyuan.wang/user/fansir/2024/05/1715763862230_5344cb6724871.png)
![1715763931708.png](https://pic2.ziyuan.wang/user/fansir/2024/05/1715763931708_ec7c766df87c4.png)
## ✨ 特性
- 📦 支持 Pypi 包安装
@ -65,6 +97,27 @@
## 💬 通知列表
- [PushDeer](https://www.pushdeer.com/)
- [wxPusher](https://wxpusher.zjiecode.com/docs/#/)
> [PushDeer预览](https://pic2.ziyuan.wang/user/fansir/2024/05/1715593565981_39b4eff978354.png)
>
> [wxPusher预览](https://pic2.ziyuan.wang/user/fansir/2024/05/1715593114657_e53ec9acf7e1e.png)
>
> 新增以上渠道配置如下
```json
{
"PUSHKEY": "", //PushDeer 的 pushkey
"WXPUSHER_TK": "", //wxpusher_token
"WXPUSHER_UID": "", //wxpusher_uid
//以上是新增内容
"BARK_URL": "",
...
}
```
- dingtalk钉钉
- 企业微信群机器人(企业微信)
- 企业微信应用消息(企业微信)

View File

@ -16,6 +16,9 @@ def checkin_map():
checkin_map = checkin_map()
notice_map = {
"PUSHKEY": "",
"WXPUSHER_TK": "",
"WXPUSHER_UID": "",
"BARK_URL": "",
"COOLPUSHEMAIL": "",
"COOLPUSHQQ": "",

View File

@ -49,12 +49,8 @@ def check_config(task_list):
for one_check, _ in checkin_map.items():
if one_check in task_list:
if _check_info.get(one_check.lower()):
for _, check_item in enumerate(
_check_info.get(one_check.lower(), [])
):
if "xxxxxx" not in str(check_item) and "多账号" not in str(
check_item
):
for _, check_item in enumerate(_check_info.get(one_check.lower(), [])):
if "xxxxxx" not in str(check_item) and "多账号" not in str(check_item):
if one_check.lower() not in check_info.keys():
check_info[one_check.lower()] = []
check_info[one_check.lower()].append(check_item)
@ -63,16 +59,13 @@ def check_config(task_list):
print(e)
return False, False
else:
print(
"未找到 config.json 配置文件\n请在下方任意目录中添加「config.json」文件:\n"
+ "\n".join(config_path_list)
)
print("未找到 config.json 配置文件\n请在下方任意目录中添加「config.json」文件:\n" + "\n".join(config_path_list))
return False, False
def checkin():
start_time = time.time()
utc_time = (datetime.utcnow() + timedelta(hours=8)).strftime("%Y-%m-%d %H:%M:%S")
utc_time = (datetime.now() + timedelta(hours=8)).strftime("%Y-%m-%d %H:%M:%S") # update: Deprecated since version 3.12: Use datetime.now() with UTC instead.
print(f"当前时间: {utc_time}\n当前版本: {__version__}")
args = parse_arguments()
include = args.include
@ -88,12 +81,7 @@ def checkin():
task_list = list(set(include) - set(exclude))
notice_info, check_info = check_config(task_list)
if check_info:
task_name_str = "\n".join(
[
f"{checkin_map.get(one.upper())[0]}」账号数 : {len(value)}"
for one, value in check_info.items()
]
)
task_name_str = "\n".join([f"{checkin_map.get(one.upper())[0]}」账号数 : {len(value)}" for one, value in check_info.items()])
print(f"\n---------- 本次执行签到任务如下 ----------\n\n{task_name_str}\n\n")
content_list = []
for one_check, check_list in check_info.items():
@ -111,18 +99,13 @@ def checkin():
try:
url = "https://pypi.org/pypi/dailycheckin/json"
latest_version = requests.get(url=url, timeout=30).json()["info"]["version"]
except:
except: # noqa: E722
print("获取最新版本失败")
latest_version = "0.0.0"
content_list.append(
f"开始时间: {utc_time}\n"
f"任务用时: {int(time.time() - start_time)}\n"
f"当前版本: {__version__}\n"
f"最新版本: {latest_version}\n"
f"项目地址: https://github.com/Sitoi/dailycheckin"
)
content_list.append(f"开始时间: {utc_time}\n" f"任务用时: {int(time.time() - start_time)}\n" f"当前版本: {__version__}\n" f"最新版本: {latest_version}\n" f"项目地址: https://github.com/Sitoi/dailycheckin")
push_message(content_list=content_list, notice_info=notice_info)
return
# push_message(content_list=content_list, notice_info=notice_info)
if __name__ == "__main__":

View File

23
dailycheckin/test/main.py Normal file
View File

@ -0,0 +1,23 @@
from dailycheckin import CheckIn
import os
import json
class TestNotice(CheckIn):
name = "通知测试"
def __init__(self, check_item):
self.check_item = check_item
def main(self):
return f"测试内容{self.check_item}"
if __name__ == "__main__":
with open(
os.path.join(os.path.dirname(os.path.dirname(__file__)), "config.json"),
encoding="utf-8",
) as f:
datas = json.loads(f.read())
_check_item = datas.get("TestNotice", [])[0]
print(TestNotice(check_item=_check_item).main())

View File

@ -7,36 +7,57 @@ from urllib.parse import quote_plus
import requests
from pypushdeer import PushDeer
def message2pushdeer(pushkey: str, content: str): # 效果展示 https://pic2.ziyuan.wang/user/fansir/2024/05/1715593565981_39b4eff978354.png
print("PushDeer 推送开始")
pushdeer = PushDeer(pushkey=pushkey)
pushdeer.send_text(content, desp="dailycheckin 每日签到")
def message2wxpuser(wxpuser_tk: str, wxpusher_uid: str, content: str): # 效果展示 https://pic2.ziyuan.wang/user/fansir/2024/05/1715593114657_e53ec9acf7e1e.png
print("wxpuser 推送开始")
url = "https://wxpusher.zjiecode.com/api/send/message"
headers = {"Content-Type": "application/json"}
content = content.replace("\n", "<br/>")
data = f'<h1>每日签到</h1><br/><p style="color:black;">{content}</p><br/>'
_uid = [wxpusher_uid]
_body = {
"appToken": wxpuser_tk, # 必传
"content": data, # 必传
"summary": "dailycheckin 每日签到",
"contentType": 2,
"uids": _uid,
"verifyPayType": 0,
}
res = requests.post(url=url, headers=headers, json=_body).json()
print(res)
def message2server(sckey, content):
print("server 酱推送开始")
data = {"text": "每日签到", "desp": content.replace("\n", "\n\n")}
requests.post(url=f"https://sc.ftqq.com/{sckey}.send", data=data)
requests.post(url=f"https:#sc.ftqq.com/{sckey}.send", data=data)
return
def message2server_turbo(sendkey, content):
print("server 酱 Turbo 推送开始")
data = {"text": "每日签到", "desp": content.replace("\n", "\n\n")}
requests.post(url=f"https://sctapi.ftqq.com/{sendkey}.send", data=data)
requests.post(url=f"https:#sctapi.ftqq.com/{sendkey}.send", data=data)
return
def message2coolpush(
coolpushskey,
content,
coolpushqq: bool = True,
coolpushwx: bool = False,
coolpushemail: bool = False,
):
def message2coolpush(coolpushskey, content, coolpushqq: bool = True, coolpushwx: bool = False, coolpushemail: bool = False):
print("Cool Push 推送开始")
params = {"c": content, "t": "每日签到"}
if coolpushqq:
requests.post(url=f"https://push.xuthus.cc/send/{coolpushskey}", params=params)
requests.post(url=f"https:#push.xuthus.cc/send/{coolpushskey}", params=params)
if coolpushwx:
requests.post(url=f"https://push.xuthus.cc/wx/{coolpushskey}", params=params)
requests.post(url=f"https:#push.xuthus.cc/wx/{coolpushskey}", params=params)
if coolpushemail:
requests.post(url=f"https://push.xuthus.cc/email/{coolpushskey}", params=params)
requests.post(url=f"https:#push.xuthus.cc/email/{coolpushskey}", params=params)
return
@ -44,9 +65,9 @@ def message2qmsg(qmsg_key, qmsg_type, content):
print("qmsg 酱推送开始")
params = {"msg": content}
if qmsg_type == "group":
requests.get(url=f"https://qmsg.zendee.cn/group/{qmsg_key}", params=params)
requests.get(url=f"https:#qmsg.zendee.cn/group/{qmsg_key}", params=params)
else:
requests.get(url=f"https://qmsg.zendee.cn/send/{qmsg_key}", params=params)
requests.get(url=f"https:#qmsg.zendee.cn/send/{qmsg_key}", params=params)
return
@ -58,9 +79,9 @@ def message2telegram(tg_api_host, tg_proxy, tg_bot_token, tg_user_id, content):
"disable_web_page_preview": "true",
}
if tg_api_host:
url = f"https://{tg_api_host}/bot{tg_bot_token}/sendMessage"
url = f"https:#{tg_api_host}/bot{tg_bot_token}/sendMessage"
else:
url = f"https://api.telegram.org/bot{tg_bot_token}/sendMessage"
url = f"https:#api.telegram.org/bot{tg_bot_token}/sendMessage"
if tg_proxy:
proxies = {
"http": tg_proxy,
@ -75,9 +96,7 @@ def message2telegram(tg_api_host, tg_proxy, tg_bot_token, tg_user_id, content):
def message2feishu(fskey, content):
print("飞书 推送开始")
data = {"msg_type": "text", "content": {"text": content}}
requests.post(
url=f"https://open.feishu.cn/open-apis/bot/v2/hook/{fskey}", json=data
)
requests.post(url=f"https:#open.feishu.cn/open-apis/bot/v2/hook/{fskey}", json=data)
return
@ -87,15 +106,11 @@ def message2dingtalk(dingtalk_secret, dingtalk_access_token, content):
secret_enc = dingtalk_secret.encode("utf-8")
string_to_sign = f"{timestamp}\n{dingtalk_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()
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = quote_plus(base64.b64encode(hmac_code))
send_data = {"msgtype": "text", "text": {"content": content}}
requests.post(
url="https://oapi.dingtalk.com/robot/send?access_token={}&timestamp={}&sign={}".format(
dingtalk_access_token, timestamp, sign
),
url="https:#oapi.dingtalk.com/robot/send?access_token={}&timestamp={}&sign={}".format(dingtalk_access_token, timestamp, sign),
headers={"Content-Type": "application/json", "Charset": "UTF-8"},
data=json.dumps(send_data),
)
@ -116,28 +131,18 @@ def message2bark(bark_url: str, content):
def message2qywxrobot(qywx_key, content):
print("企业微信群机器人推送开始")
requests.post(
url=f"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key={qywx_key}",
url=f"https:#qyapi.weixin.qq.com/cgi-bin/webhook/send?key={qywx_key}",
data=json.dumps({"msgtype": "text", "text": {"content": content}}),
)
return
def message2qywxapp(
qywx_corpid,
qywx_agentid,
qywx_corpsecret,
qywx_touser,
qywx_media_id,
qywx_origin,
content,
):
def message2qywxapp(qywx_corpid, qywx_agentid, qywx_corpsecret, qywx_touser, qywx_media_id, qywx_origin, content):
print("企业微信应用消息推送开始")
base_url = "https://qyapi.weixin.qq.com"
base_url = "https:#qyapi.weixin.qq.com"
if qywx_origin:
base_url = qywx_origin
res = requests.get(
f"{base_url}/cgi-bin/gettoken?corpid={qywx_corpid}&corpsecret={qywx_corpsecret}"
)
res = requests.get(f"{base_url}/cgi-bin/gettoken?corpid={qywx_corpid}&corpsecret={qywx_corpsecret}")
token = res.json().get("access_token", False)
if qywx_media_id:
data = {
@ -150,7 +155,7 @@ def message2qywxapp(
"title": "Dailycheckin 签到通知",
"thumb_media_id": qywx_media_id,
"author": "Sitoi",
"content_source_url": "https://github.com/Sitoi/dailycheckin",
"content_source_url": "https:#github.com/Sitoi/dailycheckin",
"content": content.replace("\n", "<br>"),
"digest": content,
}
@ -165,7 +170,7 @@ def message2qywxapp(
"textcard": {
"title": "Dailycheckin 签到通知",
"description": content,
"url": "https://github.com/Sitoi/dailycheckin",
"url": "https:#github.com/Sitoi/dailycheckin",
"btntxt": "开源项目",
},
}
@ -186,14 +191,12 @@ def message2pushplus(pushplus_token, content, pushplus_topic=None):
}
if pushplus_topic:
data["topic"] = pushplus_topic
requests.post(url="http://www.pushplus.plus/send", data=json.dumps(data))
requests.post(url="http:#www.pushplus.plus/send", data=json.dumps(data))
return
def important_notice():
datas = requests.get(
url="https://api.github.com/repos/Sitoi/dailycheckin/issues?state=open&labels=通知"
).json()
datas = requests.get(url="https://api.github.com/repos/Sitoi/dailycheckin/issues?state=open&labels=通知").json()
if datas:
data = datas[0]
title = data.get("title")
@ -206,6 +209,9 @@ def important_notice():
def push_message(content_list: list, notice_info: dict):
pushkey = notice_info.get("pushkey")
wxpusher_tk = notice_info.get("wxpusher_tk")
wxpusher_uid = notice_info.get("wxpusher_uid")
dingtalk_secret = notice_info.get("dingtalk_secret")
dingtalk_access_token = notice_info.get("dingtalk_access_token")
fskey = notice_info.get("fskey")
@ -231,7 +237,7 @@ def push_message(content_list: list, notice_info: dict):
qywx_origin = notice_info.get("qywx_origin")
pushplus_token = notice_info.get("pushplus_token")
pushplus_topic = notice_info.get("pushplus_topic")
merge_push = notice_info.get("merge_push")
merge_push = notice_info.get("merge_push").lower() == "true" # 转成bool
content_str = "\n————————————\n\n".join(content_list)
message_list = [content_str]
try:
@ -242,27 +248,29 @@ def push_message(content_list: list, notice_info: dict):
except Exception as e:
print("获取重要通知失败:", e)
if merge_push is None:
if (
qmsg_key
or coolpushskey
or qywx_touser
or qywx_corpsecret
or qywx_agentid
or bark_url
or pushplus_token
):
if qmsg_key or coolpushskey or qywx_touser or qywx_corpsecret or qywx_agentid or bark_url or pushplus_token:
merge_push = False
else:
merge_push = True
if not merge_push:
message_list = content_list
for message in message_list:
if qmsg_key:
if pushkey:
try:
message2pushdeer(pushkey=pushkey, content=message)
except Exception as e:
print("PushDeer 推送失败", e)
elif wxpusher_tk and wxpusher_uid:
try:
message2wxpuser(wxpuser_tk=wxpusher_tk, wxpusher_uid=wxpusher_uid, content=message)
except Exception as e:
print("wxpuser 推送失败", e)
elif qmsg_key:
try:
message2qmsg(qmsg_key=qmsg_key, qmsg_type=qmsg_type, content=message)
except Exception as e:
print("qmsg 推送失败", e)
if coolpushskey:
elif coolpushskey:
try:
message2coolpush(
coolpushskey=coolpushskey,
@ -273,7 +281,7 @@ def push_message(content_list: list, notice_info: dict):
)
except Exception as e:
print("coolpush 推送失败", e)
if qywx_touser and qywx_corpid and qywx_corpsecret and qywx_agentid:
elif qywx_touser and qywx_corpid and qywx_corpsecret and qywx_agentid:
try:
message2qywxapp(
qywx_corpid=qywx_corpid,
@ -286,12 +294,12 @@ def push_message(content_list: list, notice_info: dict):
)
except Exception as e:
print("企业微信应用消息推送失败", e)
if bark_url:
elif bark_url:
try:
message2bark(bark_url=bark_url, content=message)
except Exception as e:
print("Bark 推送失败", e)
if dingtalk_access_token and dingtalk_secret:
elif dingtalk_access_token and dingtalk_secret:
try:
message2dingtalk(
dingtalk_secret=dingtalk_secret,
@ -300,27 +308,27 @@ def push_message(content_list: list, notice_info: dict):
)
except Exception as e:
print("钉钉推送失败", e)
if fskey:
elif fskey:
try:
message2feishu(fskey=fskey, content=message)
except Exception as e:
print("飞书推送失败", e)
if sckey:
elif sckey:
try:
message2server(sckey=sckey, content=message)
except Exception as e:
print("Server 推送失败", e)
if sendkey:
elif sendkey:
try:
message2server_turbo(sendkey=sendkey, content=message)
except Exception as e:
print("Server Turbo 推送失败", e)
if qywx_key:
elif qywx_key:
try:
message2qywxrobot(qywx_key=qywx_key, content=message)
except Exception as e:
print("企业微信群机器人推送失败", e)
if pushplus_token:
elif pushplus_token:
try:
message2pushplus(
pushplus_token=pushplus_token,
@ -329,7 +337,7 @@ def push_message(content_list: list, notice_info: dict):
)
except Exception as e:
print("Pushplus 推送失败", e)
if tg_user_id and tg_bot_token:
elif tg_user_id and tg_bot_token:
try:
message2telegram(
tg_api_host=tg_api_host,
@ -340,6 +348,8 @@ def push_message(content_list: list, notice_info: dict):
)
except Exception as e:
print("Telegram 推送失败", e)
else:
print("未配置任何推送渠道❌")
if __name__ == "__main__":

View File

@ -2,3 +2,4 @@ pycryptodome==3.17
requests~=2.25.1
rsa~=4.0
urllib3~=1.26.2
pypushdeer==0.0.3

78
ruff.toml Normal file
View File

@ -0,0 +1,78 @@
# Exclude a variety of commonly ignored directories.
exclude = [
".bzr",
".direnv",
".eggs",
".git",
".git-rewrite",
".hg",
".ipynb_checkpoints",
".mypy_cache",
".nox",
".pants.d",
".pyenv",
".pytest_cache",
".pytype",
".ruff_cache",
".svn",
".tox",
".venv",
".vscode",
"__pypackages__",
"_build",
"buck-out",
"build",
"dist",
"node_modules",
"site-packages",
"venv",
]
# Same as Black.
line-length = 320
indent-width = 4
# Assume Python 3.11
target-version = "py311"
[lint]
# Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`) codes by default.
# Unlike Flake8, Ruff doesn't enable pycodestyle warnings (`W`) or
# McCabe complexity (`C901`) by default.
select = ["E4", "E7", "E9", "F"]
ignore = []
# Allow fix for all enabled rules (when `--fix`) is provided.
fixable = ["ALL"]
unfixable = []
# Allow unused variables when underscore-prefixed.
dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"
[format]
# Like Black, use double quotes for strings.
quote-style = "double"
# quote-style = "single"
# Like Black, indent with spaces, rather than tabs.
indent-style = "space"
# Like Black, respect magic trailing commas.
skip-magic-trailing-comma = false
# Like Black, automatically detect the appropriate line ending.
line-ending = "auto"
# Enable auto-formatting of code examples in docstrings. Markdown,
# reStructuredText code/literal blocks and doctests are all supported.
#
# This is currently disabled by default, but it is planned for this
# to be opt-out in the future.
docstring-code-format = true
# Set the line length limit used when formatting code snippets in
# docstrings.
#
# This only has an effect when the `docstring-code-format` setting is
# enabled.
docstring-code-line-length = "dynamic"