From 3c50d23aebe8ca2249fc8122787c47dd6676d09f Mon Sep 17 00:00:00 2001 From: ngfchl Date: Wed, 4 Jan 2023 20:26:49 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E5=8D=87=E7=BA=A7=E9=80=9A=E7=9F=A5?= =?UTF-8?q?=EF=BC=8C=E6=94=AF=E6=8C=81=E6=A0=87=E9=A2=98=E7=9A=84=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5=E7=9C=8B=E5=88=B0=E6=A0=87=E9=A2=98=202.=20=E5=9B=A0?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=9B=B4=E6=96=B0=E4=BC=9A=E9=95=BF=E6=9C=9F?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=EF=BC=8C=E5=90=8E=E6=8F=90=E7=A4=BA=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E5=A4=B1=E8=B4=A5=EF=BC=8C=E7=8E=B0=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=EF=BC=8C=E4=BB=A3=E7=A0=81=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E4=B8=8E=E6=95=B0=E6=8D=AE=E5=BA=93=E5=90=8C=E6=AD=A5=E5=88=86?= =?UTF-8?q?=E5=BC=80=EF=BC=8C=E4=BB=A3=E7=A0=81=E6=9B=B4=E6=96=B0=E5=AE=8C?= =?UTF-8?q?=E6=AF=95=E5=8F=91=E9=80=81=E9=80=9A=E7=9F=A5=EF=BC=8C=E7=84=B6?= =?UTF-8?q?=E5=90=8E=E5=90=8C=E6=AD=A5=E6=95=B0=E6=8D=AE=E5=BA=93=203.=20?= =?UTF-8?q?=E5=A6=82=E5=AB=8C=E6=93=8D=E4=BD=9C=E9=BA=BB=E7=83=A6=EF=BC=8C?= =?UTF-8?q?=E5=8F=AF=E4=BB=A5=E7=9B=B4=E6=8E=A5=E9=87=8D=E5=90=AF=E5=AE=B9?= =?UTF-8?q?=E5=99=A8=E8=BF=9B=E8=A1=8C=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- auto_pt/admin.py | 32 +++++++++----- auto_pt/views.py | 4 +- pt_site/UtilityTool.py | 54 ++++++++++++++--------- pt_site/views.py | 80 ++++++++++------------------------- templates/auto_pt/shell.html | 4 +- templates/auto_pt/update.html | 6 ++- 6 files changed, 86 insertions(+), 94 deletions(-) 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: "更新失败!" }); })