示例#1
0
文件: tpl.py 项目: billypon/qiandao-1
    def post(self, tplid):
        self.evil(+5)
        user = self.current_user
        data = {}
        if 'json' in self.request.headers['Content-Type']:
            data = json.loads(self.request.body)

        tplid = tplid or data.get('tplid') or self.get_argument(
            '_binux_tplid', None)
        tpl = dict()
        fetch_tpl = None
        if tplid:
            tpl = self.check_permission(
                self.db.tpl.get(tplid,
                                fields=('id', 'userid', 'sitename', 'siteurl',
                                        'tpl', 'interval', 'last_success')))
            fetch_tpl = self.db.user.decrypt(tpl['userid'], tpl['tpl'])

        if not fetch_tpl:
            fetch_tpl = data.get('tpl')

        if not fetch_tpl:
            try:
                fetch_tpl = json.loads(self.get_argument('tpl'))
            except:
                raise HTTPError(400)

        env = data.get('env')
        if not env:
            try:
                env = dict(variables=json.loads(self.get_argument('env')),
                           session=[])
            except:
                raise HTTPError(400)

        try:
            url = utils.parse_url(env['variables'].get('_binux_proxy'))
            if url:
                proxy = {
                    'host': url['host'],
                    'port': url['port'],
                }
                result = yield self.fetcher.do_fetch(fetch_tpl, env, [proxy])
            elif self.current_user:
                result = yield self.fetcher.do_fetch(fetch_tpl, env)
            else:
                result = yield self.fetcher.do_fetch(fetch_tpl,
                                                     env,
                                                     proxies=[])
        except Exception as e:
            self.render('tpl_run_failed.html', log=e)
            return

        if tpl:
            self.db.tpl.incr_success(tpl['id'])
        self.render('tpl_run_success.html',
                    log=result.get('variables', {}).get('__log__'))
        return
示例#2
0
    def post(self, taskid):
        self.evil(+2)

        user = self.current_user
        task = self.check_permission(self.db.task.get(taskid, fields=('id', 'tplid', 'userid', 'init_env',
            'env', 'session', 'last_success', 'last_failed', 'success_count',
            'failed_count', 'last_failed_count', 'next', 'disabled')), '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 = [],
                )

        try:
            url = utils.parse_url(env['variables'].get('_proxy'))
            if not url:
                new_env = yield self.fetcher.do_fetch(fetch_tpl, env)
            else:
                proxy = {
                    'host': url['host'],
                    'port': url['port'],
                }
                new_env = yield self.fetcher.do_fetch(fetch_tpl, env, [proxy])
        except Exception as e:
            self.db.tasklog.add(task['id'], success=False, msg=unicode(e))
            self.finish('<h1 class="alert alert-danger text-center">签到失败</h1><div class="well">%s</div>' % e)
            return

        self.db.tasklog.add(task['id'], success=True, msg=new_env['variables'].get('__log__'))
        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 = time.time() + (tpl['interval'] if tpl['interval'] else 24 * 60 * 60))
        self.db.tpl.incr_success(tpl['id'])
        self.finish('<h1 class="alert alert-success text-center">签到成功</h1>')
        return
示例#3
0
文件: funcs.py 项目: livingli/qiandao
 async def send2tg(self, tg_token, title, content):
     r = 'False'
     tmp = tg_token.split(';')
     tgToken = ''
     tgUserId = ''
     if len(tmp) >= 2:
         tgToken = tmp[0]
         tgUserId = tmp[1]
         tgHost = tmp[2] if len(tmp) >= 3 else ''
         proxy = utils.parse_url(tmp[3]) if len(tmp) >= 4 else ''
         pic = tmp[4] if len(tmp) >= 5 else ''
     if tgToken and tgUserId:
         try:
             token = tgToken
             chat_id = tgUserId
             #TG_BOT的token
             #token = os.environ.get('TG_TOKEN')
             #用户的ID
             #chat_id = os.environ.get('TG_USERID')
             if not tgHost:
                 link = u'https://api.telegram.org/bot{0}/sendMessage'.format(token)
             else:
                 if tgHost[-1]!='/':
                     tgHost = tgHost + '/'
                 if 'http://' in tgHost or 'https://' in tgHost:
                     link = u'{0}bot{1}/sendMessage'.format(tgHost,token)
                 else:
                     link = u'https://{0}bot{1}/sendMessage'.format(tgHost,token)
             picurl = config.push_pic if pic == '' else pic
             content = content.replace('\\r\\n','</pre>\n<pre>')
             d = {'chat_id': str(chat_id), 'text': '<b>' + title + '</b>' + '\n<pre>' + content + '</pre>\n' + '------<a href="' + picurl + '">QianDao提醒</a>------', 'disable_web_page_preview':'false', 'parse_mode': 'HTML'}
             obj = {'request': {'method': 'POST', 'url': link, 'headers': [{'name' : 'Content-Type', 'value': 'application/json; charset=UTF-8'}], 'cookies': [], 'data':json.dumps(d)}, 'rule': {
                'success_asserts': [], 'failed_asserts': [], 'extract_variables': []}, 'env': {'variables': {}, 'session': []}}
             if proxy:
                 _,_,res = await gen.convert_yielded(self.fetcher.build_response(obj = obj, proxy = proxy))
             else:
                 _,_,res = await gen.convert_yielded(self.fetcher.build_response(obj = obj))
             r = 'True'
         except Exception as e:
             r = traceback.format_exc()
             print(r)
     return r
示例#4
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', '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)
            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=[],
            )

            url = utils.parse_url(env['variables'].get('_proxy'))
            if not url:
                new_env = yield self.fetcher.do_fetch(fetch_tpl, env)
            else:
                proxy = {
                    'host': url['host'],
                    'port': url['port'],
                }
                new_env = yield 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('%m-%d %H:%M:%S')
            title = u"签到任务 {0}-{1} 成功".format(tpl['sitename'], task['note'])
            logtemp = new_env['variables'].get('__log__')
            logtemp = u"{0}  日志:{1}".format(t, logtemp)
            pushtool.pusher(user['id'], pushsw, 0x2, title, 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)
            disabled = False
            if next_time_delta:
                next = time.time() + next_time_delta
                content = content + u"下次运行时间:{0}".format(
                    time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(next)))
                if (logtime['ErrTolerateCnt'] <= task['last_failed_count']):
                    pushtool.pusher(user['id'], pushsw, 0x1, title, content)
            else:
                disabled = True
                next = None
                content = u"任务已禁用"
                pushtool.pusher(user['id'], pushsw, 0x1, title, content)

            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'])

            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)
示例#5
0
new_task_delay = 1  # 新建任务后准备时间

# 发送邮件内链接域名, 如果是通过IP+端口Port方式请正确输入`IP:Port`
domain = os.getenv('DOMAIN', 'qiandao.today')  # 指定域名, 建议修改, 不然邮件重置密码之类的功能无效

# 邮件发送相关配置
mail_smtp = os.getenv('MAIL_SMTP', "")  # 邮箱SMTP服务器
mail_port = int(os.getenv('MAIL_PORT', 465))  # 邮箱SMTP服务器端口
mail_ssl = True  # 是否使用SSL加密方式收发邮件
mail_user = os.getenv('MAIL_USER', '')  # 邮箱用户名
mail_password = os.getenv('MAIL_PASSWORD', '')  # 邮箱密码
mail_domain = os.getenv('MAIL_DOMAIN', "mail.qiandao.today")  # 发送邮件内容显示邮箱域名
# Mailgun Api_Key
mailgun_key = ""  # 优先用`mailgun`方式发送邮件

# google analytics
ga_key = ""  # google analytics密钥

try:
    from local_config import *  # 修改local_config.py文件的内容不受通过git更新源码的影响
except ImportError:
    pass

try:
    from libs.utils import parse_url
    for index, proxy in enumerate(proxies):
        if isinstance(proxy, str):
            proxies[index] = parse_url(proxy)
except Exception as e:
    raise e
示例#6
0
文件: task.py 项目: wpf900/qiandao
    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', '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')))
        t = 0 if not tpl['userid'] else task['userid'], tpl['tpl']
        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 = yield self.fetcher.do_fetch(fetch_tpl, env)
            else:
                proxy = {
                    'host': url['host'],
                    'port': url['port'],
                }
                new_env = yield self.fetcher.do_fetch(fetch_tpl, env, [proxy])
        except Exception as e:
            t = datetime.datetime.now().strftime('%m-%d %H:%M:%S')
            title = u"签到任务 {0}-{1} 失败".format(tpl['sitename'], task['note'])
            logtmp = u"{0} 日志:{1}".format(t, e)
            pushertool.pusher(user['id'], pushsw, 0x4, title, logtmp)

            self.db.tasklog.add(task['id'], success=False, msg=unicode(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>'
                % e)
            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('%m-%d %H:%M:%S')
        title = u"签到任务 {0}-{1} 成功".format(tpl['sitename'], task['note'])
        logtmp = new_env['variables'].get('__log__')
        logtmp = u"{0}  日志:{1}".format(title, logtmp)
        pushertool.pusher(user['id'], pushsw, 0x8, title, 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)
        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
示例#7
0
    async def post(self, tplid):
        self.evil(+5)
        user = self.current_user
        data = {}
        try:
            if 'json' in self.request.headers['Content-Type']:
                self.request.body = self.request.body.replace(
                    b'\xc2\xa0', b' ')
                data = json.loads(self.request.body)
        except:
            pass

        tplid = tplid or data.get('tplid') or self.get_argument(
            '_binux_tplid', None)
        tpl = dict()
        fetch_tpl = None
        if tplid:
            tpl = self.check_permission(
                self.db.tpl.get(tplid,
                                fields=('id', 'userid', 'sitename', 'siteurl',
                                        'tpl', 'interval', 'last_success')))
            fetch_tpl = self.db.user.decrypt(tpl['userid'], tpl['tpl'])

        if not fetch_tpl:
            fetch_tpl = data.get('tpl')

        if not fetch_tpl:
            try:
                fetch_tpl = json.loads(self.get_argument('tpl'))
            except:
                if not user:
                    return await self.render('tpl_run_failed.html',
                                             log="请先登录!")
                raise HTTPError(400)

        env = data.get('env')
        if not env:
            try:
                env = dict(variables=json.loads(self.get_argument('env')),
                           session=[])
            except:
                raise HTTPError(400)

        try:
            url = utils.parse_url(env['variables'].get('_binux_proxy'))
            if url:
                proxy = {
                    'scheme': url['scheme'],
                    'host': url['host'],
                    'port': url['port'],
                    'username': url['username'],
                    'password': url['password']
                }
                result = await gen.convert_yielded(
                    self.fetcher.do_fetch(fetch_tpl, env, [proxy]))
            elif self.current_user:
                result = await gen.convert_yielded(
                    self.fetcher.do_fetch(fetch_tpl, env))
            else:
                result = await gen.convert_yielded(
                    self.fetcher.do_fetch(fetch_tpl, env, proxies=[]))
        except Exception as e:
            traceback.print_exc()
            await self.render('tpl_run_failed.html', log=str(e))
            return

        if tpl:
            self.db.tpl.incr_success(tpl['id'])
        await self.render('tpl_run_success.html',
                          log=result.get('variables', {}).get('__log__'))
        return
示例#8
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=[],
            )

            url = utils.parse_url(env['variables'].get('_proxy'))
            if not url:
                new_env = yield self.fetcher.do_fetch(fetch_tpl, env)
            else:
                proxy = {
                    'host': url['host'],
                    'port': url['port'],
                }
                new_env = yield 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
            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)