def task_send_mail(self, title, content, email): try: utils.send_mail(to=email, subject=u"在网站{0} {1}".format(config.domain, title), text=content, async=True) except Exception as e: logging.error('tasend mail error: %r', e) return
def sendmail(self, email, title, content): user = self.db.user.get(email=email, fields=('id', 'email', 'email_verified', 'nickname')) if user['email'] and user['email_verified']: try: utils.send_mail(to = email, subject = u"在网站{0} {1}".format(config.domain, title), text = content, async=True) except Exception as e: logging.error('tasend mail error: %r', e)
def send_mail(self, user): verified_code = [user['email'], time.time()] verified_code = self.db.user.encrypt(user['id'], verified_code) verified_code = self.db.user.encrypt(0, [user['id'], verified_code]) verified_code = base64.b64encode(verified_code).decode() future = utils.send_mail(to=user['email'], subject=u"欢迎注册 签到平台", html=u""" <table style="width:99.8%%;height:99.8%%"><tbody><tr><td style=" background:#fafafa url(#) "><div style="border-radius:10px;font-size:13px;color:#555;width:666px;font-family:'Century Gothic','Trebuchet MS','Hiragino Sans GB','微软雅黑','Microsoft Yahei',Tahoma,Helvetica,Arial,SimSun,sans-serif;margin:50px auto;border:1px solid #eee;max-width:100%%;background:#fff repeating-linear-gradient(-45deg,#fff,#fff 1.125rem,transparent 1.125rem,transparent 2.25rem);box-shadow:0 1px 5px rgba(0,0,0,.15)"><div style="width:100%%;background:#49BDAD;color:#fff;border-radius:10px 10px 0 0;background-image:-moz-linear-gradient(0deg,#43c6b8,#ffd1f4);background-image:-webkit-linear-gradient(0deg,#4831ff,#0497ff);height:66px"><p style="font-size:15px;word-break:break-all;padding:23px 32px;margin:0;background-color:hsla(0,0%%,100%%,.4);border-radius:10px 10px 0 0"> [签到平台] {http}://{domain}</p></div> <div style="margin:40px auto;width:90%%"> <p>点击以下链接验证邮箱,当您的签到失败的时候,会自动给您发送通知邮件。</p> <p style="background:#fafafa repeating-linear-gradient(-45deg,#fff,#fff 1.125rem,transparent 1.125rem,transparent 2.25rem);box-shadow:0 2px 5px rgba(0,0,0,.15);margin:20px 0;padding:15px;border-radius:5px;font-size:14px;color:#555"><a href="{http}://{domain}/verify/{code}">{http}://{domain}/verify/{code}</a></p> <p>请注意:此邮件由 <a href="{http}://{domain}/verify/{code}" style="color:#12addb" target="_blank">签到平台</a> 自动发送,请勿直接回复。</p> <p>若此邮件不是您请求的,请忽略并删除!</p> </div> </div> </td> </tr> </tbody> </table> """.format(http='https' if config.https else 'http', domain=config.domain, code=verified_code), shark=True) def get_result(future): try: return future.result() except Exception as e: logging.error(e) if future: future.add_done_callback(get_result) return future
def send_mail(self, user): verified_code = [user['mtime'], time.time()] verified_code = self.db.user.encrypt(user['id'], verified_code) verified_code = self.db.user.encrypt(0, [user['id'], verified_code]) verified_code = base64.b64encode(verified_code) future = utils.send_mail(to=user['email'], subject=u"签到(qiandao.today) 密码重置", html=u""" <h1 style="margin-left: 30px;">签到<sup>alpha</sup></h1> <p>点击以下链接完成您的密码重置(一小时内有效)。</p> <p><a href="http://%s/password_reset/%s">http://%s/password_reset/%s</a></p> <p>点击或复制到浏览器中打开</p> """ % (config.domain, verified_code, config.domain, verified_code), async=True) def get_result(future): try: return future.result() except Exception as e: logging.error(e) if future: future.add_done_callback(get_result) return future
def send_mail(self, user): verified_code = [user['email'], time.time()] verified_code = self.db.user.encrypt(user['id'], verified_code) verified_code = self.db.user.encrypt(0, [user['id'], verified_code]) verified_code = base64.b64encode(verified_code) future = utils.send_mail(to=user['email'], subject=u"欢迎注册 签到", html=u""" <h1 style="margin-left: 30px;">签到<sup>alpha</sup></h1> <p>点击以下链接验证邮箱,当您的签到失败的时候,会自动给您发送通知邮件。</p> <p><a href="http://%s/verify/%s">http://%s/verify/%s</a></p> <p>点击或复制到浏览器中打开</p> <p>您也可以不验证邮箱继续使用签到的服务,我们不会继续给您发送任何邮件。</p> """ % (config.domain, verified_code, config.domain, verified_code), async=True) def get_result(future): try: return future.result() except Exception as e: logging.error(e) if future: future.add_done_callback(get_result) return future
def send_mail(self, user): verified_code = [user['mtime'], time.time()] verified_code = self.db.user.encrypt(user['id'], verified_code) verified_code = self.db.user.encrypt(0, [user['id'], verified_code]) verified_code = base64.b64encode(verified_code) future = utils.send_mail(to=user['email'], subject=u"签到(qiandao.today) 密码重置", html=u""" <h1 style="margin-left: 30px;">签到<sup>alpha</sup></h1> <p>点击以下链接完成您的密码重置(一小时内有效)。</p> <p><a href="http://qiandao.today/password_reset/%s">http://qiandao.today/password_reset/%s</a></p> <p>点击或复制到浏览器中打开</p> """ % (verified_code, verified_code), async=True) def get_result(future): try: return future.result() except Exception as e: logging.error(e) future.add_done_callback(get_result) return future
def send_mail(self, user): verified_code = [user['email'], time.time()] verified_code = self.db.user.encrypt(user['id'], verified_code) verified_code = self.db.user.encrypt(0, [user['id'], verified_code]) verified_code = base64.b64encode(verified_code) future = utils.send_mail(to=user['email'], subject=u"欢迎注册 签到", html=u""" <h1 style="margin-left: 30px;">签到<sup>alpha</sup></h1> <p>点击以下链接验证邮箱,当您的签到失败的时候,会自动给您发送通知邮件。</p> <p><a href="http://qiandao.today/verify/%s">http://qiandao.today/verify/%s</a></p> <p>点击或复制到浏览器中打开</p> <p>您也可以不验证邮箱继续使用签到的服务,我们不会继续给您发送任何邮件。</p> """ % (verified_code, verified_code), async=True) def get_result(future): try: return future.result() except Exception as e: logging.error(e) future.add_done_callback(get_result) return future
async def sendmail(self, email, title, content): user = self.db.user.get(email=email, fields=('id', 'email', 'email_verified', 'nickname')) if user['email'] and user['email_verified']: try: content = content.replace('\\r\\n','\n') await gen.convert_yielded(utils.send_mail(to = email, subject = u"在网站{0} {1}".format(config.domain, title), text = content, shark=True)) except Exception as e: logging.error('tasend mail error: %r', e)
def do(self, task): user = self.db.user.get(task['userid'], fields=('id', 'email', 'email_verified', 'nickname')) tpl = self.db.tpl.get(task['tplid'], fields=('id', 'userid', 'sitename', 'siteurl', 'tpl', 'interval', 'last_success')) if task['disabled']: self.db.tasklog.add(task['id'], False, msg='task disabled.') self.db.task.mod(task['id'], next=None, disabled=1) raise gen.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) raise gen.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) raise gen.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) raise gen.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=[], ) new_env = yield self.fetcher.do_fetch(fetch_tpl, env) 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 next = time.time() + max( (tpl['interval'] if tpl['interval'] else 24 * 60 * 60), 30 * 60 ) + random.choice( (-1, 1)) * (random.randint(1, 500) + random.randint(1, 500)) 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']) logger.info('taskid:%d tplid:%d successed! %.4fs', task['id'], task['tplid'], time.time() - start) except Exception as e: # failed feedback next_time_delta = self.failed_count_to_time( task['last_failed_count'], tpl['interval']) if next_time_delta: disabled = False next = time.time() + next_time_delta else: disabled = True next = None self.db.tasklog.add(task['id'], success=False, msg=unicode(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']) if task['success_count'] and task['last_failed_count'] and user['email_verified'] and user['email']\ and self.is_tommorrow(next): try: _ = yield utils.send_mail( to=user['email'], subject=u"%s - 签到失败%s" % (tpl['sitename'], u' 已停止' if disabled else u""), text=u""" 您的 %(sitename)s [ %(siteurl)s ] 签到任务,执行 %(cnt)d次 失败。%(disable)s 下一次重试在一天之后,为防止签到中断,给您发送这份邮件。 访问: http://%(domain)s/task/%(taskid)s/log 查看日志。 """ % dict( sitename=tpl['sitename'] or u'未命名', siteurl=tpl['siteurl'] or u'', cnt=task['last_failed_count'] + 1, disable=u"因连续多次失败,已停止。" if disabled else u"", domain=config.domain, taskid=task['id'], ), async=True) except Exception as e: logging.error('send mail error: %r', e) logger.error('taskid:%d tplid:%d failed! %r %.4fs', task['id'], task['tplid'], e, time.time() - start) raise gen.Return(False) raise gen.Return(True)
def do(self, task): user = self.db.user.get(task['userid'], fields=('id', 'email', 'email_verified', 'nickname')) 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')) if task['disabled']: self.db.tasklog.add(task['id'], False, msg='task disabled.') self.db.task.mod(task['id'], next=None, disabled=1) raise gen.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) raise gen.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) raise gen.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) raise gen.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 = [], ) new_env = yield self.fetcher.do_fetch(fetch_tpl, env) 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 (ontime['ontimeflg'] == 1): temp = ontime['ontime'] now = datetime.datetime.now() ehour = int(temp[0:2]) emin = int(temp[-2:]) if(ehour >= now.hour): if (emin > now.minute): eday = now.day else: eday = now.day+1 else : eday = now.day+1 tz = pytz.timezone('Asia/Shanghai') pre = datetime.datetime(year=now.year, month=now.month, day=eday, hour=ehour, minute=emin, tzinfo=tz) next = int(time.mktime(pre.timetuple()) + pre.microsecond/1e6) 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']) logger.info('taskid:%d tplid:%d successed! %.4fs', task['id'], task['tplid'], time.time()-start) except Exception as e: # failed feedback next_time_delta = self.failed_count_to_time(task['last_failed_count'], tpl['interval']) if next_time_delta: # 每次都推送通知 pushno = send2phone.send2phone() pushno.send2bark("签到任务 {0} 失败".format(tpl['sitename']), "请检查状态") pushno.send2s("签到任务 {0} 失败".format(tpl['sitename']), "请检查状态") pushno.send2BarkAndWJ("签到任务 {0} 失败".format(tpl['sitename']), "请检查状态") disabled = False next = time.time() + next_time_delta else: disabled = True next = None # 任务禁用时发送通知 pushno.send2bark("签到任务 {0} 失败".format(tpl['sitename']), "任务已禁用") pushno.send2s("签到任务 {0} 失败".format(tpl['sitename']), "任务已禁用") pushno.send2BarkAndWJ(u"签到任务 {0} 失败".format(tpl['sitename']), u"任务已禁用") self.db.tasklog.add(task['id'], success=False, msg=unicode(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']) if task['success_count'] and task['last_failed_count'] and user['email_verified'] and user['email']: #and self.is_tommorrow(next): try: _ = yield utils.send_mail(to=user['email'], subject=u"%s - 签到失败%s" % ( tpl['sitename'], u' 已停止' if disabled else u""), text=u""" 您的 %(sitename)s [ %(siteurl)s ] 签到任务,执行 %(cnt)d次 失败。%(disable)s 下一次重试在一天之后,为防止签到中断,给您发送这份邮件。 访问: http://%(domain)s/task/%(taskid)s/log 查看日志。 """ % dict( sitename=tpl['sitename'] or u'未命名', siteurl=tpl['siteurl'] or u'', cnt=task['last_failed_count'] + 1, disable=u"因连续多次失败,已停止。" if disabled else u"", domain=config.domain, taskid=task['id'], ), async=True) except Exception as e: logging.error('send mail error: %r', e) logger.error('taskid:%d tplid:%d failed! %r %.4fs', task['id'], task['tplid'], e, time.time()-start) raise gen.Return(False) raise gen.Return(True)
def do(self, task): user = self.db.user.get(task['userid'], fields=('id', 'email', 'email_verified', 'nickname')) tpl = self.db.tpl.get(task['tplid'], fields=('id', 'userid', 'sitename', 'siteurl', 'tpl', 'interval', 'last_success')) if task['disabled']: self.db.tasklog.add(task['id'], False, msg='task disabled.') self.db.task.mod(task['id'], next=None, disabled=1) raise gen.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) raise gen.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) raise gen.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) raise gen.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 = [], ) new_env = yield self.fetcher.do_fetch(fetch_tpl, env) 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 next = time.time() + max((tpl['interval'] if tpl['interval'] else 24 * 60 * 60), 30*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']) logger.info('taskid:%d tplid:%d successed! %.4fs', task['id'], task['tplid'], time.time()-start) except Exception as e: # failed feedback next_time_delta = self.failed_count_to_time(task['last_failed_count'], tpl['interval']) if next_time_delta: disabled = False next = time.time() + next_time_delta else: disabled = True next = None self.db.tasklog.add(task['id'], success=False, msg=unicode(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']) if task['success_count'] and task['last_failed_count'] and user['email_verified'] and user['email']\ and self.is_tommorrow(next): try: _ = yield utils.send_mail(to=user['email'], subject=u"%s - 签到失败%s" % ( tpl['sitename'], u' 已停止' if disabled else u""), text=u""" 您的 %(sitename)s [ %(siteurl)s ] 签到任务,执行 %(cnt)d次 失败。%(disable)s 下一次重试在一天之后,为防止签到中断,给您发送这份邮件。 访问: http://%(domain)s/task/%(taskid)s/log 查看日志。 """ % dict( sitename=tpl['sitename'] or u'未命名', siteurl=tpl['siteurl'] or u'', cnt=task['last_failed_count'] + 1, disable=u"因连续多次失败,已停止。" if disabled else u"", domain=config.domain, taskid=task['id'], ), async=True) except Exception as e: logging.error('send mail error: %r', e) logger.error('taskid:%d tplid:%d failed! %r %.4fs', task['id'], task['tplid'], e, time.time()-start) raise gen.Return(False) raise gen.Return(True)
def do(self, task): user = self.db.user.get(task["userid"], fields=("id", "email", "email_verified", "nickname")) tpl = self.db.tpl.get( task["tplid"], fields=("id", "userid", "sitename", "siteurl", "tpl", "interval", "last_success") ) if task["disabled"]: self.db.tasklog.add(task["id"], False, msg="task disabled.") self.db.task.mod(task["id"], next=None, disabled=1) raise gen.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) raise gen.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) raise gen.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) raise gen.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=[]) new_env = yield self.fetcher.do_fetch(fetch_tpl, env) variables = self.db.user.encrypt(task["userid"], new_env["variables"]) session = self.db.user.encrypt( task["userid"], new_env["session"] if isinstance(new_env["session"], basestring) else new_env["session"].to_json(), ) # todo next not mid night next = time.time() + (tpl["interval"] if tpl["interval"] else 24 * 60 * 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"]) logger.info("taskid:%d tplid:%d successed! %.4fs", task["id"], task["tplid"], time.time() - start) except Exception as e: # failed feedback next_time_delta = self.failed_count_to_time(task["last_failed_count"], tpl["interval"]) if next_time_delta: disabled = False next = time.time() + next_time_delta else: disabled = True next = None self.db.tasklog.add(task["id"], success=False, msg=unicode(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"]) if ( task["success_count"] and task["last_failed_count"] and user["email_verified"] and user["email"] and self.is_tommorrow(next) ): try: _ = yield utils.send_mail( to=user["email"], subject=u"%s - 签到失败%s" % (tpl["sitename"], u" 已停止" if disabled else u""), text=u""" 您的 %(sitename)s [ %(siteurl)s ] 签到任务,执行 %(cnt)d次 失败。%(disable)s 下一次重试在一天之后,为防止签到中断,给您发送这份邮件。 访问: http://qiandao.today/task/%(taskid)s/log 查看日志。 """ % dict( sitename=tpl["sitename"] or u"未命名", siteurl=tpl["siteurl"] or u"", cnt=task["last_failed_count"] + 1, disable=u"因连续多次失败,已停止。" if disabled else u"", taskid=task["id"], ), async=True, ) except Exception as e: logging.error("send mail error: %r", e) logger.error("taskid:%d tplid:%d failed! %r %.4fs", task["id"], task["tplid"], e, time.time() - start) raise gen.Return(False) raise gen.Return(True)
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')) 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')) newontime = json.loads(ontime["newontime"]) pushsw = json.loads(ontime['pushsw']) notice = self.db.user.get(task['userid'], fields=('skey', 'barkurl', 'noticeflg', 'wxpusher')) temp = notice['wxpusher'].split(";") wxpusher_token = temp[0] if (len(temp) >= 2) else "" wxpusher_uid = temp[1] if (len(temp) >= 2) else "" pushno2b = send2phone.send2phone(barkurl=notice['barkurl']) pushno2s = send2phone.send2phone(skey=notice['skey']) pushno2w = send2phone.send2phone(wxpusher_token=wxpusher_token, wxpusher_uid=wxpusher_uid) pusher = {} pusher["barksw"] = False if (notice['noticeflg'] & 0x40) == 0 else True pusher["schansw"] = False if (notice['noticeflg'] & 0x20) == 0 else True pusher["wxpushersw"] = False if (notice['noticeflg'] & 0x10) == 0 else True logtime = json.loads(self.db.user.get(task['userid'], fields=('logtime'))['logtime']) 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) raise gen.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) raise gen.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) raise gen.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) raise gen.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 = [], ) new_env = yield self.fetcher.do_fetch(fetch_tpl, env) 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']): next = calNextTimestamp(newontime, True) 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']) if (notice['noticeflg'] & 0x2 != 0): t = datetime.datetime.now().strftime('%m-%d %H:%M:%S') title = u"签到任务 {0}-{1} 成功".format(tpl['sitename'], task['note']) logtemp = new_env['variables'].get('__log__') if (notice['noticeflg'] & 0x2 != 0) and (pushsw['pushen']): if (pusher["barksw"]):pushno2b.send2bark(title, u"{0} 运行成功".format(t)) if (pusher["schansw"]):pushno2s.send2s(title, u"{0} 日志:{1}".format(t, logtemp)) if (pusher["wxpushersw"]):pushno2w.send2wxpusher(title+u"{0} 日志:{1}".format(t, logtemp)) logger.info('taskid:%d tplid:%d successed! %.4fs', task['id'], task['tplid'], time.time()-start) # delete log self.ClearLog(task['id']) except Exception as e: # failed feedback next_time_delta = self.failed_count_to_time(task['last_failed_count'], tpl['interval']) t = datetime.datetime.now().strftime('%m-%d %H:%M:%S') title = u"签到任务 {0}-{1} 失败".format(tpl['sitename'], task['note']) content = u"日志:{log}".format(log=e) if next_time_delta: # 每次都推送通知 if (logtime['ErrTolerateCnt'] <= task['last_failed_count']): if (notice['noticeflg'] & 0x1 == 1) and (pushsw['pushen']): if (pusher["barksw"]):pushno2b.send2bark(title, u"请自行排查") if (pusher["schansw"]):pushno2s.send2s(title, content) if (pusher["wxpushersw"]):pushno2w.send2wxpusher(title+u" "+content) disabled = False next = time.time() + next_time_delta else: disabled = True next = None # 任务禁用时发送通知 if (notice['noticeflg'] & 1 == 1): if (pusher["barksw"]):pushno2b.send2bark(title, u"任务已禁用") if (pusher["schansw"]):pushno2s.send2s(title, u"任务已禁用") if (pusher["wxpushersw"]):pushno2w.send2wxpusher(title+u"任务已禁用") self.db.tasklog.add(task['id'], success=False, msg=unicode(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']) if task['success_count'] and task['last_failed_count'] and user['email_verified'] and user['email']: #and self.is_tommorrow(next): try: _ = yield utils.send_mail(to=user['email'], subject=u"%s - 签到失败%s" % ( tpl['sitename'], u' 已停止' if disabled else u""), text=u""" 您的 %(sitename)s [ %(siteurl)s ] 签到任务,执行 %(cnt)d次 失败。%(disable)s 下一次重试在一天之后,为防止签到中断,给您发送这份邮件。 访问: http://%(domain)s/task/%(taskid)s/log 查看日志。 """ % dict( sitename=tpl['sitename'] or u'未命名', siteurl=tpl['siteurl'] or u'', cnt=task['last_failed_count'] + 1, disable=u"因连续多次失败,已停止。" if disabled else u"", domain=config.domain, taskid=task['id'], ), async=True) except Exception as e: logging.error('send mail error: %r', e) logger.error('taskid:%d tplid:%d failed! %r %.4fs', task['id'], task['tplid'], e, time.time()-start) raise gen.Return(False) raise gen.Return(True)