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