async def post(self,userid): try: envs = {} for k, _ in self.request.body_arguments.items(): envs[k] = self.get_body_argument(k) req = pusher() log = '' now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) tmp = await gen.convert_yielded(req.cus_pusher_send(envs ,u'推送测试', now)) if ('True' == tmp): if (envs['btn'] == 'regbtn'): self.db.user.mod(userid, diypusher=json.dumps(envs)) else: raise Exception(tmp) log = u'运行成功,请检查是否收到推送' except Exception as e: if (str(e).find('get user need id or email') > -1): e = u'请输入用户名/密码' traceback.print_exc() self.render('utils_run_result.html', log=str(e), title=u'设置失败', flg='danger') return self.render('utils_run_result.html', log=log, title=u'设置成功', flg='success') return
async def push_batch(self): try: userlist = await asyncio.wait_for(asyncio.get_event_loop().run_in_executor(None, functools.partial(self.db.user.list,fields=('id', 'email', 'status', 'push_batch'))),timeout=3.0) pushtool = pusher() logging.debug('scaned push_batch task, waiting...') if userlist: for user in userlist: userid = user['id'] push_batch = json.loads(user['push_batch']) if user['status'] == "Enable" and push_batch["sw"] and isinstance(push_batch['time'],(float,int)) and time.time() >= push_batch['time']: title = u"定期签到日志推送" delta = push_batch.get("delta", 86400) logtemp = "{}".format(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(push_batch['time']))) tmpdict = {} tmp = "" numlog = 0 task_list = await asyncio.wait_for(asyncio.get_event_loop().run_in_executor(None, functools.partial(self.db.task.list,userid=userid, fields=('id', 'tplid', 'note', 'disabled', 'last_success', 'last_failed', 'pushsw'))),timeout=3.0) for task in task_list: pushsw = json.loads(task['pushsw']) if pushsw["pushen"] and (task["disabled"] == 0 or (task.get("last_success", 0) and task.get("last_success", 0) >= push_batch['time']-delta) or (task.get("last_failed", 0) and task.get("last_failed", 0) >= push_batch['time']-delta)): tmp0 = "" tasklog_list = await asyncio.wait_for(asyncio.get_event_loop().run_in_executor(None, functools.partial(self.db.tasklog.list,taskid=task["id"], fields=('success', 'ctime', 'msg'))),timeout=3.0) for log in tasklog_list: if (push_batch['time'] - delta) < log['ctime'] <= push_batch['time']: tmp0 += "\\r\\n时间: {}\\r\\n日志: {}".format(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(log['ctime'])), log['msg']) numlog += 1 tmplist = tmpdict.get(task['tplid'],[]) if tmp0: tmplist.append("\\r\\n-----任务{0}-{1}-----{2}\\r\\n".format(len(tmplist)+1, task['note'], tmp0)) else: tmplist.append("\\r\\n-----任务{0}-{1}-----\\r\\n记录期间未执行签到,请检查任务! \\r\\n".format(len(tmplist)+1, task['note'])) tmpdict[task['tplid']] = tmplist for tmpkey in tmpdict: tmp = "\\r\\n\\r\\n=====签到: {0}=====".format(self.db.tpl.get(tmpkey, fields=('sitename'))['sitename']) tmp += ''.join(tmpdict[tmpkey]) logtemp += tmp push_batch["time"] = push_batch['time'] + delta self.db.user.mod(userid, push_batch=json.dumps(push_batch)) if tmp and numlog: user_email = user.get('email','Unkown') logger.debug("Start push batch log for {}".format(user_email)) await pushtool.pusher(userid, {"pushen": bool(push_batch.get("sw",False))}, 4080, title, logtemp) logger.info("Success push batch log for {}".format(user_email)) except Exception as e: traceback.print_exc() logger.error('push batch task failed: {}'.format(str(e)))
async def do(self, task): task['note'] = self.db.task.get(task['id'], fields=('note'))['note'] user = self.db.user.get(task['userid'], fields=('id', 'email', 'email_verified', 'nickname', 'logtime')) tpl = self.db.tpl.get(task['tplid'], fields=('id', 'userid', 'sitename', 'siteurl', 'tpl', 'interval', 'last_success')) ontime = self.db.task.get(task['id'], fields=('ontime', 'ontimeflg', 'pushsw', 'newontime', 'next')) newontime = json.loads(ontime["newontime"]) pushtool = pusher() caltool = cal() logtime = json.loads(user['logtime']) pushsw = json.loads(ontime['pushsw']) if 'ErrTolerateCnt' not in logtime:logtime['ErrTolerateCnt'] = 0 if task['disabled']: self.db.tasklog.add(task['id'], False, msg='task disabled.') self.db.task.mod(task['id'], next=None, disabled=1) return False if not user: self.db.tasklog.add(task['id'], False, msg='no such user, disabled.') self.db.task.mod(task['id'], next=None, disabled=1) return False if not tpl: self.db.tasklog.add(task['id'], False, msg='tpl missing, task disabled.') self.db.task.mod(task['id'], next=None, disabled=1) return False if tpl['userid'] and tpl['userid'] != user['id']: self.db.tasklog.add(task['id'], False, msg='no permission error, task disabled.') self.db.task.mod(task['id'], next=None, disabled=1) return False start = time.time() try: fetch_tpl = self.db.user.decrypt(0 if not tpl['userid'] else task['userid'], tpl['tpl']) env = dict( variables = self.db.user.decrypt(task['userid'], task['init_env']), session = [], ) url = utils.parse_url(env['variables'].get('_proxy')) if not url: new_env = await gen.convert_yielded(self.fetcher.do_fetch(fetch_tpl, env)) else: proxy = { 'scheme': url['scheme'], 'host': url['host'], 'port': url['port'], 'username': url['username'], 'password': url['password'] } new_env = await gen.convert_yielded(self.fetcher.do_fetch(fetch_tpl, env, [proxy])) variables = self.db.user.encrypt(task['userid'], new_env['variables']) session = self.db.user.encrypt(task['userid'], new_env['session'].to_json() if hasattr(new_env['session'], 'to_json') else new_env['session']) # todo next not mid night if (newontime['sw']): if ('mode' not in newontime): newontime['mode'] = 'ontime' if (newontime['mode'] == 'ontime'): newontime['date'] = (datetime.datetime.now()+datetime.timedelta(days=1)).strftime("%Y-%m-%d") next = caltool.calNextTs(newontime)['ts'] else: next = time.time() + max((tpl['interval'] if tpl['interval'] else 24 * 60 * 60), 1*60) if tpl['interval'] is None: next = self.fix_next_time(next) # success feedback self.db.tasklog.add(task['id'], success=True, msg=new_env['variables'].get('__log__')) self.db.task.mod(task['id'], last_success=time.time(), last_failed_count=0, success_count=task['success_count']+1, env=variables, session=session, mtime=time.time(), next=next) self.db.tpl.incr_success(tpl['id']) t = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') title = u"签到任务 {0}-{1} 成功".format(tpl['sitename'], task['note']) logtemp = new_env['variables'].get('__log__') logtemp = u"{0} \\r\\n日志:{1}".format(t, logtemp) await pushtool.pusher(user['id'], pushsw, 0x2, title, logtemp) logger.info('taskid:%d tplid:%d successed! %.5fs', task['id'], task['tplid'], time.time()-start) # delete log self.ClearLog(task['id']) except Exception as e: # failed feedback traceback.print_exc() next_time_delta = self.failed_count_to_time(task['last_failed_count'], task['retry_count'], task['retry_interval'], tpl['interval']) t = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') title = u"签到任务 {0}-{1} 失败".format(tpl['sitename'], task['note']) content = u"{0} \\r\\n日志:{1}".format(t, str(e)) disabled = False if next_time_delta: next = time.time() + next_time_delta content = content + u" \\r\\n下次运行时间:{0}".format(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(next))) if (logtime['ErrTolerateCnt'] <= task['last_failed_count']): await pushtool.pusher(user['id'], pushsw, 0x1, title, content) else: disabled = True next = None content = u" \\r\\n任务已禁用" await pushtool.pusher(user['id'], pushsw, 0x1, title, content) self.db.tasklog.add(task['id'], success=False, msg=str(e)) self.db.task.mod(task['id'], last_failed=time.time(), failed_count=task['failed_count']+1, last_failed_count=task['last_failed_count']+1, disabled = disabled, mtime = time.time(), next=next) self.db.tpl.incr_failed(tpl['id']) logger.error('taskid:%d tplid:%d failed! %r %.4fs', task['id'], task['tplid'], str(e), time.time()-start) return False return True
async def post(self, userid): envs = {} for key in self.request.body_arguments: envs[key] = self.get_body_arguments(key) env = json.loads(envs['env'][0]) wxpusher_token = env["wxpusher_token"] skey = env["skey"] barkurl = env["barkurl"] qywx_token = env["qywx_token"] tg_token = env["tg_token"] dingding_token = env["dingding_token"] log = "" if ("reg" == self.get_body_argument('func')): try: if (wxpusher_token != ""): self.db.user.mod(userid, wxpusher = wxpusher_token) if (self.db.user.get(userid, fields=("wxpusher"))["wxpusher"] == wxpusher_token): log = u"注册 WxPusher 成功\r\n" else: log = u"注册 WxPusher 失败\r\n" else: log = u"WxPusher 未填写完整\r\n" if (skey != ""): self.db.user.mod(userid, skey = skey) if (self.db.user.get(userid, fields=("skey"))["skey"] == skey): log = log+u"注册 S酱 成功\r\n" else: log = log+u"注册 S酱 失败\r\n" else: log = log+u"Sendkey 未填写完整\r\n" if (barkurl != ""): if (barkurl[-1] != '/'): barkurl=barkurl+'/' self.db.user.mod(userid, barkurl = barkurl) if (self.db.user.get(userid, fields=("barkurl"))["barkurl"] == barkurl): log = log+u"注册 Bark 成功\r\n" else: log = log+u"注册 Bark 失败\r\n" else: log = log+u"BarkUrl 未填写完整\r\n" if (qywx_token != ""): self.db.user.mod(userid, qywx_token = qywx_token) if (self.db.user.get(userid, fields=("qywx_token"))["qywx_token"] == qywx_token): log = log+u"注册 企业微信 成功\r\n" else: log = log+u"注册 企业微信 失败\r\n" else: log = log+u"企业微信 未填写完整\r\n" if (tg_token != ""): self.db.user.mod(userid, tg_token = tg_token) if (self.db.user.get(userid, fields=("tg_token"))["tg_token"] == tg_token): log = log+u"注册 Tg Bot 成功\r\n" else: log = log+u"注册 Tg Bot 失败\r\n" else: log = log+u"Tg Bot 未填写完整\r\n" if (dingding_token != ""): self.db.user.mod(userid, dingding_token = dingding_token) if (self.db.user.get(userid, fields=("dingding_token"))["dingding_token"] == dingding_token): log = log+u"注册 DingDing Bot 成功\r\n" else: log = log+u"注册 DingDing Bot 失败\r\n" else: log = log+u"DingDing Bot 未填写完整\r\n" except Exception as e: traceback.print_exc() self.render('tpl_run_failed.html', log=str(e)) return self.render('utils_run_result.html', log=log, title=u'设置成功', flg='success') return else: try: f = pusher() t = datetime.datetime.now().strftime('%y-%m-%d %H:%M:%S') if (wxpusher_token != ""): await f.send2wxpusher("{0}".format(wxpusher_token),u"{t} 发送测试".format(t=t)) log = u"WxPusher 已推送,请检查是否收到\r\n" else: log = u"WxPusher 未填写完整\r\n" if (skey != ""): await f.send2s(skey, u"正在测试S酱", u"{t} 发送测试".format(t=t)) log = log+u"S酱 已推送,请检查是否收到\r\n" else: log = log+u"Sendkey 未填写完整\r\n" if (barkurl != ""): await f.send2bark(barkurl, u"正在测试Bark", u"{t} 发送测试".format(t=t)) log = log+u"Bark 已推送,请检查是否收到\r\n" else: log = log+u"BarkUrl 未填写完整\r\n" if (qywx_token != ""): await f.qywx_pusher_send(qywx_token, "正在测试企业微信", u"{t} 发送测试".format(t=t)) log = log+u"企业微信 已推送,请检查是否收到\r\n" else: log = log+u"企业微信 未填写完整\r\n" if (tg_token != ""): await f.send2tg(tg_token, "正在测试Tg Bot", u"{t} 发送测试".format(t=t)) log = log+u"Tg Bot 已推送,请检查是否收到\r\n" else: log = log+u"Tg Bot 未填写完整\r\n" if (dingding_token != ""): await f.send2dingding(dingding_token, "正在测试DingDing Bot", u"{t} 发送测试".format(t=t)) log = log+u"DingDing Bot 已推送,请检查是否收到\r\n" else: log = log+u"DingDing Bot 未填写完整\r\n" except Exception as e: traceback.print_exc() self.render('tpl_run_failed.html', log=str(e)) return self.render('utils_run_result.html', log=log, title=u'设置成功', flg='success') return
async def post(self, taskid): self.evil(+2) start_ts = int(time.time()) user = self.current_user task = self.check_permission(self.db.task.get(taskid, fields=('id', 'tplid', 'userid', 'init_env', 'env', 'session', 'retry_count', 'retry_interval', 'last_success', 'last_failed', 'success_count', 'note', 'failed_count', 'last_failed_count', 'next', 'disabled', 'ontime', 'ontimeflg', 'pushsw','newontime')), 'w') tpl = self.check_permission(self.db.tpl.get(task['tplid'], fields=('id', 'userid', 'sitename', 'siteurl', 'tpl', 'interval', 'last_success'))) fetch_tpl = self.db.user.decrypt( 0 if not tpl['userid'] else task['userid'], tpl['tpl']) env = dict( variables = self.db.user.decrypt(task['userid'], task['init_env']), session = [], ) pushsw = json.loads(task['pushsw']) newontime = json.loads(task['newontime']) pushertool = pusher() caltool = cal() try: url = utils.parse_url(env['variables'].get('_proxy')) if not url: new_env = await gen.convert_yielded(self.fetcher.do_fetch(fetch_tpl, env)) else: proxy = { 'scheme': url['scheme'], 'host': url['host'], 'port': url['port'], 'username': url['username'], 'password': url['password'] } new_env = await gen.convert_yielded(self.fetcher.do_fetch(fetch_tpl, env, [proxy])) except Exception as e: t = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') title = u"签到任务 {0}-{1} 失败".format(tpl['sitename'], task['note']) logtmp = u"{0} \\r\\n日志:{1}".format(t, e) self.db.tasklog.add(task['id'], success=False, msg=str(e)) self.finish('<h1 class="alert alert-danger text-center">签到失败</h1><div class="showbut well autowrap" id="errmsg">%s<button class="btn hljs-button" data-clipboard-target="#errmsg" >复制</button></div>' % logtmp.replace('\\r\\n', '<br>')) await pushertool.pusher(user['id'], pushsw, 0x4, title, logtmp) return self.db.tasklog.add(task['id'], success=True, msg=new_env['variables'].get('__log__')) if (newontime["sw"]): if ('mode' not in newontime): newontime['mode'] = 'ontime' if (newontime['mode'] == 'ontime'): newontime['date'] = (datetime.datetime.now()+datetime.timedelta(days=1)).strftime("%Y-%m-%d") nextTime = caltool.calNextTs(newontime)['ts'] else: nextTime = time.time() + (tpl['interval'] if tpl['interval'] else 24 * 60 * 60) self.db.task.mod(task['id'], disabled = False, last_success = time.time(), last_failed_count = 0, success_count = task['success_count'] + 1, mtime = time.time(), next = nextTime) t = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') title = u"签到任务 {0}-{1} 成功".format(tpl['sitename'], task['note']) logtmp = new_env['variables'].get('__log__') logtmp = u"{0} \\r\\n日志:{1}".format(t, logtmp) self.db.tpl.incr_success(tpl['id']) self.finish('<h1 class="alert alert-success text-center">签到成功</h1><div class="showbut well autowrap" id="errmsg"><pre>%s</pre><button class="btn hljs-button" data-clipboard-target="#errmsg" >复制</button></div>' % logtmp.replace('\\r\\n', '<br>')) await pushertool.pusher(user['id'], pushsw, 0x8, title, logtmp) logDay = int(self.db.site.get(1, fields=('logDay'))['logDay']) for log in self.db.tasklog.list(taskid = taskid, fields=('id', 'ctime')): if (time.time() - log['ctime']) > (logDay * 24 * 60 * 60): self.db.tasklog.delete(log['id']) return