diff --git a/auto_pt/admin.py b/auto_pt/admin.py
index 5872ad7..46bbfa0 100644
--- a/auto_pt/admin.py
+++ b/auto_pt/admin.py
@@ -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
diff --git a/auto_pt/views.py b/auto_pt/views.py
index 2799aec..7930c63 100644
--- a/auto_pt/views.py
+++ b/auto_pt/views.py
@@ -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)
diff --git a/pt_site/UtilityTool.py b/pt_site/UtilityTool.py
index 28b08bd..15876bb 100644
--- a/pt_site/UtilityTool.py
+++ b/pt_site/UtilityTool.py
@@ -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 = '### {} 有{}条新短消息,请注意及时查收! \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 = '## {} 获取做种大小失败,请检查规则信息是否匹配?'.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'# {site.name} 站点分享率告警:{ratio} \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 = '### {} 有{}条新短消息,请注意及时查收! \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()
diff --git a/pt_site/views.py b/pt_site/views.py
index acebf52..6ec7298 100644
--- a/pt_site/views.py
+++ b/pt_site/views.py
@@ -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'> {msg}')
+ message = f'> {msg}'
+ 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()
diff --git a/templates/auto_pt/shell.html b/templates/auto_pt/shell.html
index 83ebb08..98cc61f 100644
--- a/templates/auto_pt/shell.html
+++ b/templates/auto_pt/shell.html
@@ -33,9 +33,9 @@
发送
- 更新代码
更新依赖
- 初始化代码
+ 更新代码
+ 初始化代码
初始化xpath
diff --git a/templates/auto_pt/update.html b/templates/auto_pt/update.html
index 8022a59..57b0f20 100644
--- a/templates/auto_pt/update.html
+++ b/templates/auto_pt/update.html
@@ -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: "更新失败!"
});
})