Пример #1
0
 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
Пример #2
0
 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)
Пример #3
0
    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">&nbsp;[签到平台]&nbsp;&nbsp;{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
Пример #4
0
    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
Пример #5
0
    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
Пример #6
0
    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
Пример #7
0
    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
Пример #8
0
 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)
Пример #9
0
    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)
Пример #10
0
    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)
Пример #11
0
    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)
Пример #12
0
    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)
Пример #13
0
    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)