1. 升级通知,支持标题的可以看到标题

2. 因代码更新会长期服务,后提示更新失败,现修改更新,代码更新与数据库同步分开,代码更新完毕发送通知,然后同步数据库
3. 如嫌操作麻烦,可以直接重启容器进行更新
This commit is contained in:
ngfchl
2023-01-04 20:26:49 +08:00
parent 9d2f323128
commit 3c50d23aeb
6 changed files with 86 additions and 94 deletions

View File

@@ -129,17 +129,18 @@ class TaskJobAdmin(admin.ModelAdmin): # instead of ModelAdmin
obj.task_exec = False
obj.save()
# raise
msg = obj.job_id + '任务添加失败!原因:' + str(e)
msg = f'计划任务:{obj.job_id} 任务添加失败!原因:{e}'
logger.error(msg)
pt_spider.send_text('计划任务:' + msg)
pt_spider.send_text(title=msg, message=msg)
messages.error(request, msg)
def delete_model(self, request, obj):
print(obj)
# DjangoJob.objects.filter(obj.job_id).delete()
tasks.scheduler.get_job(obj.job_id).remove()
logging.info('计划任务:' + obj.job_id + ' 取消成功!')
pt_spider.send_text('计划任务:' + obj.job_id + ' 取消成功!')
message = f'计划任务:{obj.job_id} 取消成功!'
logging.info(message)
pt_spider.send_text(title=message, message=message)
obj.delete()
def delete_queryset(self, request, queryset):
@@ -147,8 +148,9 @@ class TaskJobAdmin(admin.ModelAdmin): # instead of ModelAdmin
job = tasks.scheduler.get_job(obj.job_id)
if job:
job.remove()
logging.info('计划任务:' + obj.job_id + ' 取消成功!')
pt_spider.send_text('计划任务:' + obj.job_id + ' 取消成功!')
message = f'计划任务:{obj.job_id} 取消成功!'
logging.info(message)
pt_spider.send_text(title=message, message=message)
queryset.delete()
# def delete_view(self, request, object_id, extra_context=None):
@@ -170,10 +172,11 @@ class NotifyAdmin(AjaxAdmin):
def test_notify(self, request, queryset):
post = request.POST
text = post.get('text')
print(text)
title = post.get('title')
message = post.get('message')
print(title, message)
try:
res = pt_spider.send_text(text)
res = pt_spider.send_text(title=title, message=message)
return JsonResponse(data={
'status': 'success',
'msg': res
@@ -214,7 +217,16 @@ class NotifyAdmin(AjaxAdmin):
# 这里的type 对应el-input的原生input属性默认为input
'type': 'input',
# key 对应post参数中的key
'key': 'text',
'key': 'title',
# 显示的文本
'label': '消息标题',
# 为空校验默认为False
'require': True
}, {
# 这里的type 对应el-input的原生input属性默认为input
'type': 'input',
# key 对应post参数中的key
'key': 'message',
# 显示的文本
'label': '测试消息',
# 为空校验默认为False

View File

@@ -81,9 +81,7 @@ def test_field(request):
def test_notify(request):
# res = NotifyDispatch().send_text(text='66666')
res = pt_spider.send_text('666')
res = pt_spider.send_text(title='通知测试', message='通知测试内容欢迎使用PTools')
logger.info(res)
return JsonResponse(res, safe=False)

View File

@@ -127,7 +127,7 @@ class PtSpider:
'mobile': False
}, delay=delay)
def send_text(self, text: str, url: str = None):
def send_text(self, message: str, title: str = '', url: str = None):
"""通知分流"""
notifies = Notify.objects.filter(enable=True).all()
res = '你还没有配置通知参数哦!'
@@ -142,7 +142,7 @@ class PtSpider:
secret=notify.corpsecret,
agent_id=notify.agentid, )
res = notify_push.send_text(
text=text,
text=message,
to_uid=notify.touser if notify.touser else '@all'
)
msg = '企业微信通知:{}'.format(res)
@@ -151,7 +151,7 @@ class PtSpider:
if notify.name == PushConfig.wxpusher_push:
"""WxPusher通知"""
res = WxPusher.send_message(
content=text,
content=message,
url=url,
uids=notify.touser.split(','),
token=notify.corpsecret,
@@ -165,13 +165,13 @@ class PtSpider:
server=notify.custom_server,
pushkey=notify.corpsecret)
# res = pushdeer.send_text(text, desp="optional description")
res = pushdeer.send_markdown(text=text,
desp="#### 欢迎使用PTools使用中遇到问题请在微信群进行反馈")
res = pushdeer.send_markdown(text=message,
desp=title)
msg = 'pushdeer通知{}'.format(res)
logger.info(msg)
if notify.name == PushConfig.bark_push:
url = notify.custom_server + notify.corpsecret + '/' + text
url = f'{notify.custom_server}{notify.corpsecret}/{title}/{message}'
res = self.get_scraper().get(url=url)
msg = 'bark通知{}'.format(res)
logger.info(msg)
@@ -182,8 +182,8 @@ class PtSpider:
res = self.get_scraper().post(
url=url,
data={
'text': '欢迎使用PTools',
'desp': text
'text': title,
'desp': message
})
logger.info('爱语飞飞通知:{}'.format(res))
except Exception as e:
@@ -269,7 +269,7 @@ class PtSpider:
msg = '百度OCR识别失败{}'.format(e)
logger.info(traceback.format_exc(limit=3))
# raise
self.send_text(msg)
self.send_text(title='OCR识别出错咯', message=msg)
return CommonResponse.error(
status=StatusCodeEnum.OCR_ACCESS_ERR,
msg='{} {}'.format(StatusCodeEnum.OCR_ACCESS_ERR.errmsg, msg)
@@ -1234,11 +1234,12 @@ class PtSpider:
return CommonResponse.error(msg="网站访问失败")
except Exception as e:
# raise
title = f'{site.name} 网站访问失败'
msg = '{} 网站访问失败!原因:{}'.format(site.name, e)
# 打印异常详细信息
logger.error(msg)
logger.error(traceback.format_exc(limit=3))
self.send_text(msg)
self.send_text(title=title, message=msg)
return CommonResponse.error(msg=msg)
# @transaction.atomic
@@ -1437,8 +1438,9 @@ class PtSpider:
return CommonResponse.success(data=(new_count, count))
except Exception as e:
# raise
# self.send_text(site.name + '解析种子信息:失败!原因:' + str(e))
title = f'{site.name} 解析种子信息:失败!'
msg = '解析种子页面失败!{}'.format(e)
self.send_text(title=title, message=msg)
logger.error(msg)
logger.error(traceback.format_exc(limit=3))
return CommonResponse.error(msg=msg)
@@ -1700,7 +1702,7 @@ class PtSpider:
message = '{} 访问个人主页信息:失败!原因:{}'.format(my_site.site.name, e)
logger.error(message)
logger.error(traceback.format_exc(limit=3))
# self.send_text(message)
# self.send_text(title=message, message=message)
# raise
return CommonResponse.error(msg=message)
@@ -1746,7 +1748,8 @@ class PtSpider:
if my_site.mail > 0:
template = '### <font color="red">{}{}条新短消息,请注意及时查收!</font> \n'
# 测试发送网站消息原内容
self.send_text(f'{template.format(site.name, my_site.mail)}\n{mail_str}\n{notice_str}')
msg = f'{template.format(site.name, my_site.mail)}\n{mail_str}\n{notice_str}'
self.send_text(title=msg, message=msg)
# ajax.php?action=user&id=
details_response = details_html.get('response')
stats = details_response.get('stats')
@@ -1798,7 +1801,8 @@ class PtSpider:
'seed_vol': seeding_size,
})
if float(ratio) < 1:
self.send_text(f'{site.name} 分享率 {ratio} 过低,请注意')
msg = f'{site.name} 分享率 {ratio} 过低,请注意'
self.send_text(title=msg, message=msg)
return CommonResponse.success(data=res_gpw)
else:
return CommonResponse.error(data=result)
@@ -1839,9 +1843,11 @@ class PtSpider:
'seed_vol': seeding_size,
})
if my_site.mail > 0:
self.send_text(f'{site.name}{my_site.mail}条新消息,请注意查收!')
msg = f'{site.name}{my_site.mail}条新消息,请注意查收!'
self.send_text(title=msg, message=msg)
if float(ratio) < 1:
self.send_text(f'{site.name} 分享率 {ratio} 过低,请注意')
msg = f'{site.name} 分享率 {ratio} 过低,请注意'
self.send_text(title=msg, message=msg)
return CommonResponse.success(data=res_gpw)
except Exception as e:
# 打印异常详细信息
@@ -1968,7 +1974,7 @@ class PtSpider:
msg = '## <font color="red">{} 获取做种大小失败,请检查规则信息是否匹配?</font>'.format(
site.name)
logger.warning(msg)
self.send_text(msg)
self.send_text(title=msg, message=msg)
break
else:
# seed_vol_all = 0
@@ -2153,7 +2159,7 @@ class PtSpider:
ratio = round(int(uploaded) / int(downloaded), 3)
if ratio and ratio != 'inf' and float(ratio) <= 1:
message = f'# <font color="red">{site.name} 站点分享率告警:{ratio}</font> \n'
self.send_text(message)
self.send_text(title=message, message=message)
# 检查邮件
mail_str = ''.join(details_html.xpath(site.mailbox_rule))
notice_str = ''.join(details_html.xpath(site.notice_rule))
@@ -2166,9 +2172,8 @@ class PtSpider:
if mail_count + notice_count > 0:
template = '### <font color="red">{}{}条新短消息,请注意及时查收!</font> \n'
# 测试发送网站消息原内容
self.send_text(
f'{template.format(site.name, mail_count + notice_count)}\n{mail_str}\n{notice_str}'
)
message = f'{template.format(site.name, mail_count + notice_count)}\n{mail_str}\n{notice_str}'
self.send_text(title=message, message=message)
else:
my_site.mail = 0
if site.url in [
@@ -2325,3 +2330,10 @@ class PtSpider:
return CommonResponse.success(
msg=f'初始化失败!{e}',
)
def parse_uuid(self):
with open('db/ptools.toml', 'r') as f:
data = toml.load(f)
vip = data.get('vip')
os.environ['VIP'] = vip.get('key')
uuid = os.getenv()

View File

@@ -53,7 +53,8 @@ def auto_sign_in():
logger.info('已经全部签到咯!!')
else:
logger.info(message_list + consuming)
pt_spider.send_text(message_list + consuming)
message = message_list + consuming
pt_spider.send_text(title=message, message=message)
logger.info('{} 任务运行成功!完成时间:{}'.format('自动签到', time.strftime("%Y-%m-%d %H:%M:%S")))
@@ -110,7 +111,8 @@ def auto_get_status():
time.strftime("%Y-%m-%d %H:%M:%S")
)
logger.info(message_list + consuming)
pt_spider.send_text(text=message_list + consuming)
message = message_list + consuming
pt_spider.send_text(title=message, message=message)
def auto_update_torrents():
@@ -152,7 +154,8 @@ def auto_update_torrents():
end - start,
time.strftime("%Y-%m-%d %H:%M:%S"))
logger.info(message_list + consuming)
pt_spider.send_text(message_list + consuming)
message = message_list + consuming
pt_spider.send_text(title=message, message=message)
def auto_remove_expire_torrents():
@@ -194,14 +197,8 @@ def auto_remove_expire_torrents():
count += 1
torrent_info.delete()
end = time.time()
pt_spider.send_text(
'> {} 任务运行成功!共清除过期种子{}个,耗时:{}{} \n'.format(
'清除种子',
count,
end - start,
time.strftime("%Y-%m-%d %H:%M:%S")
)
)
message = f'> 清除种子 任务运行成功!共清除过期种子{count}个,耗时:{end - start} \n{time.strftime("%Y-%m-%d %H:%M:%S")}'
pt_spider.send_text(title=message, message=message)
def auto_push_to_downloader():
@@ -209,8 +206,8 @@ def auto_push_to_downloader():
start = time.time()
print('推送到下载器')
end = time.time()
pt_spider.send_text(
'> {} 任务运行成功!耗时:{}{} \n'.format('签到', end - start, time.strftime("%Y-%m-%d %H:%M:%S")))
message = f'> 签到 任务运行成功!耗时:{end - start} \n{time.strftime("%Y-%m-%d %H:%M:%S")}'
pt_spider.send_text(title=message, message=message)
def auto_get_torrent_hash():
@@ -219,8 +216,8 @@ def auto_get_torrent_hash():
print('自动获取种子HASH')
time.sleep(5)
end = time.time()
pt_spider.send_text(
'> {} 任务运行成功!耗时:{}{} \n'.format('获取种子HASH', end - start, time.strftime("%Y-%m-%d %H:%M:%S")))
message = f'> 获取种子HASH 任务运行成功!耗时:{end - start} \n{time.strftime("%Y-%m-%d %H:%M:%S")}'
pt_spider.send_text(title=message, message=message)
def exec_command(commands):
@@ -240,61 +237,30 @@ def auto_upgrade():
"""程序更新"""
try:
logger.info('开始自动更新')
pt_site_site_mtime = os.stat('pt_site_site.json').st_mtime
requirements_mtime = os.stat('requirements.txt').st_mtime
update_commands = {
# 'cp db/db.sqlite3 db/db.sqlite3-$(date "+%Y%m%d%H%M%S")',
'强制覆盖本地': 'git reset --hard',
'更新依赖环境': 'wget -O requirements.txt https://gitee.com/ngfchl/ptools/raw/master/requirements.txt && pip install -r requirements.txt -U',
'强制覆盖本地': 'git clean -df && git reset --hard',
'获取更新信息': 'git fetch --all',
'拉取代码更新': 'git pull origin {}'.format(os.getenv('DEV')),
}
requirements_commands = {
'安装依赖': 'pip install -r requirements.txt',
}
migrate_commands = {
'同步数据库': 'python manage.py migrate',
'拉取代码更新': f'git pull origin {os.getenv("DEV")}',
}
logger.info('拉取最新代码')
result = exec_command(update_commands)
new_requirements_mtime = os.stat('requirements.txt').st_mtime
if new_requirements_mtime > requirements_mtime:
logger.info('更新环境依赖')
result.extend(exec_command(requirements_commands))
new_pt_site_site = os.stat('pt_site_site.json').st_mtime
logger.info('更新前文件最后修改时间')
logger.info(pt_site_site_mtime)
logger.info('更新后文件最后修改时间')
logger.info(new_pt_site_site)
if new_pt_site_site == pt_site_site_mtime:
logger.info('本次无规则更新,跳过!')
result.append({
'command': '本次无更新规则',
'res': 0
})
else:
logger.info('拉取更新完毕开始更新Xpath规则')
p = subprocess.run('cp db/db.sqlite3 db/db.sqlite3-$(date "+%Y%m%d%H%M%S")', shell=True)
logger.info('备份数据库 命令执行结果:\n{}'.format(p))
result.append({
'command': '备份数据库',
'res': p.returncode
})
result.extend(exec_command(migrate_commands))
logger.info('同步数据库 命令执行结果:\n{}'.format(p))
logger.info('更新完毕')
pt_spider.send_text(f'> 更新完成{datetime.datetime.now()}')
message = f'> 更新完成!!请在接到通知后同步数据库{datetime.datetime.now()}'
pt_spider.send_text(title=message, message=message)
return CommonResponse.success(
msg='更新成功15S后自动刷新页面',
msg='更新成功!稍后请在接到通知后同步数据库!',
data={
'result': result
}
)
except Exception as e:
# raise
msg = '更新失败!{},请初始化Xpath'.format(str(e))
msg = '更新失败!{},请尝试同步数据库'.format(str(e))
logger.error(msg)
pt_spider.send_text(f'> <font color="red">{msg}</font>')
message = f'> <font color="red">{msg}</font>'
pt_spider.send_text(title=msg, message=message)
return CommonResponse.error(
msg=msg
)
@@ -349,7 +315,7 @@ def auto_update_license():
result = res.json()
if result.get('code') == 0:
result['data'] = token
pt_spider.send_text(text=f'> {token}')
pt_spider.send_text(title='小助手License更新成功', message=f'> {token}')
return CommonResponse.success(
data=result
)
@@ -368,5 +334,5 @@ except socket.error:
except Exception as e:
logger.info('启动后台任务启动任务失败!{}'.format(e))
# 有错误就停止定时器
pt_spider.send_text(text='启动后台任务启动任务失败!')
pt_spider.send_text(title='启动后台任务启动任务失败!', message='启动后台任务启动任务失败!')
scheduler.shutdown()

View File

@@ -33,9 +33,9 @@
<el-dropdown split-button size="small" type="primary" @command="exec_shell">
<i class="fas fa-terminal"></i>发送
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="git pull">更新代码</el-dropdown-item>
<el-dropdown-item command="pip install -r requirements.txt -U">更新依赖</el-dropdown-item>
<el-dropdown-item command="git clean -df">初始化代码</el-dropdown-item>
<el-dropdown-item command="git pull">更新代码</el-dropdown-item>
<el-dropdown-item command="git clean -df && git reset --hard">初始化代码</el-dropdown-item>
<el-dropdown-item command="python manage.py migrate">初始化xpath</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>

View File

@@ -269,6 +269,10 @@
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$message({
type: 'success',
message: '更新指令发送成功!稍后请在接到通知后同步数据库!'
});
axios.get(
"{% url "do_update" %}"
).then(res => {
@@ -295,7 +299,7 @@
console.log(res, 3)
this.$message({
type: 'error',
message: "更新失败!请重新更新后初始化Xpath"
message: "更新失败!"
});
})