mirror of
https://github.com/ngfchl/ptools
synced 2023-07-10 13:41:22 +08:00
1. 升级通知,支持标题的可以看到标题
2. 因代码更新会长期服务,后提示更新失败,现修改更新,代码更新与数据库同步分开,代码更新完毕发送通知,然后同步数据库 3. 如嫌操作麻烦,可以直接重启容器进行更新
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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: "更新失败!"
|
||||
});
|
||||
})
|
||||
|
||||
|
||||
Reference in New Issue
Block a user