From 1e9e13cdda31acc5b51d1cc2266acbc2d17253df Mon Sep 17 00:00:00 2001 From: sftang Date: Wed, 31 Aug 2022 10:37:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E7=AD=BE=E5=88=B0=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/cron/crontabs.py | 71 +++++++++++++++++++++++++++++- apps/cron/templates/cron/sign.html | 15 +++++++ apps/cron/urls/views_urls.py | 1 + apps/cron/views.py | 1 + apps/cron/views_request.py | 27 +++++++++++- 5 files changed, 111 insertions(+), 4 deletions(-) diff --git a/apps/cron/crontabs.py b/apps/cron/crontabs.py index 19123c8..42eb38a 100644 --- a/apps/cron/crontabs.py +++ b/apps/cron/crontabs.py @@ -79,6 +79,12 @@ def my_scheduler(crontab_id=None, crontab_status=None, hour="*", minute="*", job #删除job if action=='del': scheduler.remove_job(crontab_id) + return True + + #立刻执行任务 + if action == 'now' and jobtype_id == 1000: + scheduler.add_job(sign, 'interval', trigger='date', next_run_time=datetime.datetime.now(), id=crontab_id) + return True #激活 if crontab_status: @@ -103,7 +109,14 @@ def my_scheduler(crontab_id=None, crontab_status=None, hour="*", minute="*", job if jobtype_id == 1000: scheduler.add_job(sign, 'cron', hour=hour, minute=minute, id=crontab_id, args=[crontab_id]) elif jobtype_id == 1003: - scheduler.add_job(re_fail_sign, 'cron', hour=hour, minute=minute, id=crontab_id, args=[crontab_id]) + scheduler.add_job(re_fail_sign, 'cron', hour=hour, minute=minute, id=crontab_id, args=[crontab_id]) + else: + #无状态任务处理(常规为立刻执行任务) + #立刻执行签到任务 + if action == 'now' and jobtype_id == 1000: + #只执行一次 + scheduler.add_job(signonekey, trigger='date', next_run_time=datetime.datetime.now(), id=crontab_id) + return True return True @@ -116,7 +129,7 @@ def sign(crontab_id): """ #获取任务ID对应的站点 - job_sites = list(Job.objects.filter(crontab_id=crontab_id).values_list('sites',flat=True)) + job_sites = list(Job.objects.filter(crontab_id=crontab_id).values_list('sites',flat=True))[0] #保存最后发送的结果 send_data = [] @@ -162,6 +175,60 @@ def sign(crontab_id): return +def signonekey(): + """ + 一键执行签到 + 参数: + crontab_id:执行任务的ID + """ + + #获取任务ID对应的站点 + job_sites = list(Job.objects.filter(jobtype_id=1000).values_list('sites',flat=True))[0] + crontab_id = list(Job.objects.filter(jobtype_id=1000).values_list('crontab_id',flat=True))[0] + + #保存最后发送的结果 + send_data = [] + site_count = SiteInfo.objects.count() + if site_count == 0: + send_data.append('未配置任何站点') + else: + if len(job_sites) == 0: + #获取所有已经配置的站点 + sites = SiteInfo.objects.all() + else: + sites = SiteInfo.objects.filter(siteconfig_name__in=job_sites) + + for i in sites: + site_name = i.siteconfig_name + site_cookie = i.cookie + #获取站点配置信息 + site_config = SiteConfig.objects.get(name=site_name) + site_url = site_config.index_url + site_name_cn = site_config.name_cn + site_sign_type = site_config.sign_type + + #headers = { + #'user-agent': user_agent, + #'referer': site_url, + #'cookie': site_cookie + #} + #统一签到入口 + flag, data = signIngress(site_name, site_name_cn, site_url, site_cookie, site_sign_type) + + try: + Log.objects.create(name = '签到',type_id = 1000, crontab_id = crontab_id, site_name=site_name, message = data, status = flag) + except: + logger.error("%s(%s)数据返回出错" % (site_name, site_name_cn)) + #防止返回数据错误导致异常退出 + continue + + send_data.append(data) + + #发送消息 + send_msg(crontab_id, send_data) + + return + def re_fail_sign(crontab_id): """ 重试签到失败 diff --git a/apps/cron/templates/cron/sign.html b/apps/cron/templates/cron/sign.html index 6af8c97..2eb28bc 100644 --- a/apps/cron/templates/cron/sign.html +++ b/apps/cron/templates/cron/sign.html @@ -73,6 +73,7 @@
+
@@ -146,6 +147,20 @@ return false; }); + form.on('submit(signOneKeySubmit)', function (data) { + layer.load(2); + + admin.req('cron/signonekey', data.field, function (data) { + layer.closeAll('loading'); + if (data.code == 1) { + layer.msg(data.msg, {icon: 1}); + } else { + layer.msg(data.msg, {icon: 2}); + } + }, $('#signForm').attr('method')); + return false; + }); + let joblog_action = function() { let callback = null; diff --git a/apps/cron/urls/views_urls.py b/apps/cron/urls/views_urls.py index 331266c..9e54d89 100644 --- a/apps/cron/urls/views_urls.py +++ b/apps/cron/urls/views_urls.py @@ -24,6 +24,7 @@ urlpatterns = [ path('job/list', views_request.job), #签到任务 path('sign', views.SignJobView.as_view()), + path('signonekey', views_request.signonekey), #日志 path('log', views.LogListView.as_view()), path('log/del', views.LogDelView.as_view()), diff --git a/apps/cron/views.py b/apps/cron/views.py index 3f31a13..7d03159 100644 --- a/apps/cron/views.py +++ b/apps/cron/views.py @@ -582,6 +582,7 @@ class SignJobView(LoginRequiredMixin,TemplateView): return JsonResponse(response_data) + #=================================================================== class LogListView(LoginRequiredMixin,TemplateView): """ diff --git a/apps/cron/views_request.py b/apps/cron/views_request.py index 077cf59..c1bf46b 100644 --- a/apps/cron/views_request.py +++ b/apps/cron/views_request.py @@ -4,7 +4,8 @@ from django.db.models import Q from django.contrib.auth.decorators import login_required import datetime from .models import JobType, Job, Log - +import uuid +from .crontabs import my_scheduler #直接使用检查是否管理员 #from django.contrib.auth.decorators import user_passes_test @@ -329,4 +330,26 @@ def loginfo(request): return JsonResponse(data) - + +#------------------------------ +@login_required +def signonekey(request): + """ + 一键签到 + """ + + if request.method == "POST": + """ + 数据提交 + """ + + + crontab_id = str(uuid.uuid1()) + + # 创建任务 + my_scheduler(crontab_id, jobtype_id=1000, action="now") + + + response_data={"code":1,"msg":"添加成功"} + + return JsonResponse(response_data) \ No newline at end of file