def check_FSIDR_and_QN(param, pagedata): '''随机数校验。param为web请求参数。pagedata为准备向页面传送的变量''' pagedata['HTTP_USER_AGENT'] = web.ctx.env.get('HTTP_USER_AGENT', '') pagedata['REALHOME'] = web.ctx.get('realhome', '') pagedata['APPID'] = wxaccount.APPID pagedata['WXCODE'] = wxcode pagedata['signPackage'] = web.Storage( mforweixin.calc_jsapi_signature(web.ctx.homedomain + web.ctx.env['REQUEST_URI'])) put_static_host(pagedata) fsid = param.get('fsid') random_value = param.get('r') if not fsid: return getPageError('获取用户信息失败!', pagedata) if str(fsid) in web.config.app_configuration.get('run:blacklist', []): return getPageError('您的账号出现异常操作,已暂时锁定!', pagedata) if not (random_value and cacher_random_checker.chkRandomValueNotPop( fsid, random_value)): return getPageError('链接已失效!') pagedata['FSOBJ'] = mdb.get_fans_byfsid(fsid) if not pagedata.get('FSOBJ'): return getPageError('获取用户信息失败!', pagedata) pagedata['QNOBJ'] = mdb.get_naire(param.get('qnid')) if not pagedata['QNOBJ']: return getPageError('问卷不存在!', pagedata) pagedata['r'] = cacher_random_checker.genRandomValueForFSID( fsid) #为页面传入一个新的r
def POST(self): '''回答问卷提交''' param = web.input(r='', fsid='', qnid='', AN_CONTENT='') if not cacher_random_checker.chkRandomValueWithPop( param['fsid'], param['r']): return get_render(view_render, 'error')('页面已无效,请返回重新操作。') param['AN_CONTENT'] = formatting.replaceEmoji(param['AN_CONTENT']) retval = mdb.set_answer(param['qnid'], param['fsid'], param['AN_CONTENT'], web.ctx.ip) pagedata = {} pagedata['QNOBJ'] = mdb.get_naire(param['qnid']) mqsnaire.injectAD(pagedata) #向答卷完成后的提示页面注入广告 if retval.has_key('success'): # if retval.has_key('seeurl'): # return web.seeother(retval['seeurl'],True) # else: pagedata['APPID'] = wxaccount.APPID from models import mforweixin pagedata['signPackage'] = web.Storage( mforweixin.calc_jsapi_signature(web.ctx.homedomain + web.ctx.env['REQUEST_URI'])) return get_render(view_render, 'success')('提交成功', retval['success'], pagedata) else: return get_render(view_render, 'error')(retval['error'], pagedata)
def GET(self): #支持: answer,question,qstmpl,preview,stview,nopay3,paid3,hong3,help1_1,help1_2,help1_3,这些是需要FSOBJ和QNOBJ和r的。 #备注: paid2,hong2在cwxjsapi中实现,因为微信支付要求在二级目录下。在cwxjsapi中实现相同的 check_FSIDR_and_QN 和 CtrlIncludeFSCheck 处理 param = web.input() urlpars = urlparse.urlparse(web.ctx.path) ctxpath = urlpars.path render = get_render(view_render, ctxpath) if not render: return getPageError('页面不存在!', pagedata) #向页面传入数据 pagedata = {} chkret = check_FSIDR_and_QN(param, pagedata) if chkret: return chkret #问卷类型与访问页面不匹配,认定为问卷不存在 if ctxpath.endswith(('paid2')) and pagedata['QNOBJ'].QN_TYPE != 1: return getPageError('问卷不存在!', pagedata) if ctxpath.endswith(('hong2')) and pagedata['QNOBJ'].QN_TYPE != 2: return getPageError('问卷不存在!', pagedata) if ctxpath.endswith(('help2')) and pagedata['QNOBJ'].QN_TYPE != 3: return getPageError('问卷不存在!', pagedata) if ctxpath.endswith('stview'): #在统计结果页面为传话题问卷 pagedata['TPOBJ'] = mdb.get_naire( pagedata['QNOBJ'].TOPIC_QNID ) if pagedata['QNOBJ'].TOPIC_QNID else None pagedata["MESSAGE"] = cacher_message_pool.pop(pagedata['FSOBJ'].FS_ID) return render(pagedata)
def GET(self): '''复刻指定模板创建新问卷''' #这个方法是先显示模板题目,再填写问卷基本信息 param = web.input() param = web.input() pagedata = {} chkret = check_WeixinAuth_or_FSIDR(param, pagedata) if chkret: return chkret pagedata['TPOBJ'] = mdb.get_naire( param.get('tpid')) if param.has_key('tpid') else mdb.get_naire( param.get('state')) if not pagedata['TPOBJ']: return getPageError('无效的问卷模板!', pagedata) if pagedata['TPOBJ'].QN_STATUS < 10: #所有模板类问卷都可以 return getPageError('无效的问卷模板!', pagedata) pagedata['REFQN'] = mdb.get_naire(param.get('refqn')) render = get_render(view_render, 'newfromtp') return render(pagedata) if render else getPageError('页面不存在!', pagedata)
def GET(self): '''创建话题问卷,可直接创建:提供参数fsid/r/tpic。也可从微信网页授权进入:传入参数state''' #支持: topic1 param = web.input() pagedata = {} chkret = check_WeixinAuth_or_FSIDR(param, pagedata) if chkret: return chkret pagedata['TPOBJ'] = mdb.get_naire( param.get('tpid')) if param.has_key('tpid') else mdb.get_naire( param.get('state')) if not pagedata['TPOBJ']: return getPageError('无效的问卷话题!', pagedata) if pagedata['TPOBJ'].QN_STATUS != 99: return getPageError('无效的问卷话题!', pagedata) pagedata['QNOBJ'] = mdb.get_naire(param.get('qnid')) pagedata['REFQN'] = mdb.get_naire(param.get('refqn')) render = get_render(view_render, 'topic1') return render(pagedata) if render else getPageError('页面不存在!', pagedata)
def GET(self): '''创建红包问卷界面''' param = web.input() pagedata = {} chkret = check_WeixinAuth_or_FSIDR(param, pagedata) if chkret: return chkret if param.has_key('qnid'): pagedata['QNOBJ'] = mdb.get_naire(param['qnid']) render = get_render(view_render, 'hong1') return render(pagedata) if render else getPageError('页面不存在!', pagedata)
def POST(self): '''发布问卷,开始回收。发布后问卷不能修改''' param = web.input(r='', fsid='', qnid='') if not cacher_random_checker.chkRandomValueWithPop( param['fsid'], param['r']): return '{"error":"页面已无效,请返回重新操作。"}' QNOBJ = mdb.get_naire(param['qnid']) if not QNOBJ: return formatting.json_string({'error': '问卷不存在!'}) retval = mdb.deploy_qs(QNOBJ) return formatting.json_string(retval)
def GET(self): '''创建空白问卷。通用的问卷创建,有奖/红包/互助/普通都是这一个入口,录入问卷基本信息、录入题目、选择发布方式、然后再付款。''' param = web.input() pagedata = {} chkret = check_WeixinAuth_or_FSIDR(param, pagedata) if chkret: return chkret if param.has_key('qnid'): if param['qnid'].startswith(('sojump_')): param['qnid'] = hashlib.md5(param['qnid']).hexdigest() pagedata['QNOBJ'] = mdb.get_naire(param['qnid']) render = get_render(view_render, 'createqs') return render(pagedata) if render else getPageError('页面不存在!', pagedata)
def GET(self): '''用于问卷参与页面。微信网页登录授权后跳转进来时,需要按照微信网页开发方法执行后续动作,用户已经授权或未授权''' #有几种情况进入此页面: #1.粉丝在公号内获取到问卷参与链接,这个链接分享给其他粉丝也是可用的,不是粉丝的话用不了。https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxaa70b76f1dcc6401&redirect_uri=https%3A%2F%2Fqsnaire.aifetel.cc%2Flink&response_type=code&scope=snsapi_userinfo&state=b4166c68c46611e69acd9cf387b1feac#wechat_redirect #2.直接链接。link?state=QN_ID #2.1.微信公号网页授权后跳转进来,带code,state参数,再根据code参数可获取到用户openid #2.2.用户把带code参数的链接分享出去,此时code参数是无效的,获取不到用户openid #2.3.用户直接分享不带code参数的链接,此时获取不到用户身份 # 微信公号网页授权http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html # 第一步:用户同意授权,获取code # 第二步:通过code换取网页授权access_token,此时可拿到openid和unionid # 第三步:刷新access_token(如果需要) # 第四步:拉取用户信息(需scope为 snsapi_userinfo) param = web.input() pagedata = {} chkret = check_WeixinAuth_or_FSIDR(param, pagedata) pagedata['QNOBJ'] = mdb.get_naire(param.get('state')) if not pagedata['QNOBJ']: return getPageError('问卷不存在!', pagedata) if chkret: if pagedata.get('FSOBJ'): #如果返回错误并且有用户身份,说明用户在黑名单 return chkret else: #答卷页面针对取不到身份的用户(返回错误无用户身份) #如果用户是在微信内访问,重定向到微信网页授权页面,从而可以让他进入答卷页面。否则返回关注提示和问卷基本信息页面 if pagedata['HTTP_USER_AGENT'].find('MicroMessenger') > 0: return web.seeother( mforweixin.get_mp_authurl("%s/link" % (HOST_NOS), pagedata['QNOBJ'].QN_ID), True) else: return get_render(view_render, 'tipsub')(pagedata) #判断问卷是否有效和在回收中 if pagedata['QNOBJ'].QN_STATUS == 3: return getPageError('该问卷目前暂停回收!', pagedata) elif pagedata['QNOBJ'].QN_STATUS < 2: return getPageError('该问卷不在回收中!', pagedata) elif pagedata['QNOBJ'].QN_STATUS != 2: return getPageError('该问卷已结束!', pagedata) ANOBJ = mdb.get_answer(pagedata['QNOBJ'].QN_ID, pagedata['FSOBJ'].FS_ID) anshint = mdb.get_anshint(pagedata['FSOBJ'], pagedata['QNOBJ'], ANOBJ) if anshint: return getPageError(anshint, pagedata, True) if pagedata['QNOBJ'].QN_TYPE == 1: return get_render(view_render, 'pzview')(pagedata) else: return get_render(view_render, 'answer')(pagedata)
def PUT(self): '''问卷发布人设置问卷为已兑奖状态(如果是发布人就设置为1,如果是中奖人就设置为2)''' param = web.input(r='', fsid='', qnid='') if not cacher_random_checker.chkRandomValueNotPop( param['fsid'], param['r']): return '{"error":"页面已无效,请返回重新操作。"}' QNOBJ = mdb.get_naire(param['qnid']) if param['fsid'] == str( QNOBJ.FS_ID) and QNOBJ.WIN_END == 0: #发布人标记为已兑奖 return formatting.json_string( mdb.set_qsend(param['qnid'], None, 1, param.get('expno'))) elif param['fsid'] == str(QNOBJ.WIN_FSID): #中奖人标记为已领奖 return formatting.json_string(mdb.set_qsend( param['qnid'], None, 2)) else: return '{"error":"无效请求!"}'
def GET(self): '''将问卷答卷导出到excel文件''' param = web.input(r='', fsid='', qnid='') if not cacher_random_checker.chkRandomValueNotPop( param['fsid'], param['r']): return '{"error":"页面已无效,请返回重新操作。"}' param.pop('r') QNOBJ = mdb.get_naire(param.qnid) if not QNOBJ: return get_render(view_render, 'error')('问卷不存在!', {}, False) if not QNOBJ.NUM_VOTE: return get_render(view_render, 'error')('问卷还没有回收答卷!', {}, False) retval = mdb.export_answer_excel(param.qnid) web.header("Content-Type", "application/octet-stream; charset=UTF-8") web.header("Content-Length", str(len(retval))) web.header( "Content-Disposition", 'attachment;filename="%s.xls"' % QNOBJ.QN_TITLE.encode('utf8')) return retval
def check_FSIDR_and_QN(param, pagedata): '''随机数校验。param为web请求参数。pagedata为准备向页面传送的变量''' pagedata['HTTP_USER_AGENT'] = web.ctx.env.get('HTTP_USER_AGENT', '') pagedata['REALHOME'] = web.ctx.get('realhome', '') pagedata['APPID'] = wxaccount.APPID fsid = param.get('fsid') random_value = param.get('r') if not fsid: return getPageError('获取用户信息失败!') if not (random_value and cacher_random_checker.chkRandomValueNotPop( fsid, random_value)): return getPageError('链接已失效!') pagedata['FSOBJ'] = mdb.get_fans_byfsid(fsid) if not pagedata.get('FSOBJ'): return getPageError('获取用户信息失败!') pagedata['QNOBJ'] = mdb.get_naire(param.get('qnid')) if not pagedata['QNOBJ']: return getPageError('问卷不存在!') pagedata['r'] = cacher_random_checker.genRandomValueForFSID( fsid) #为页面传入一个新的r
def GET(self): '''扒之''' param = web.input(fsid='',r='',wjid='') if not cacher_random_checker.chkRandomValueNotPop(param['fsid'],param['r']): return '{"error":"无效请求!"}' if int(param['fsid']) not in web.config.app_configuration['run:selfman']: return '{"error":"无效请求!"}' import_qnobj = {} if param.wjid: qnid = 'sojump_'+param.wjid qnid = hashlib.md5(qnid).hexdigest() if mdb.get_naire(qnid): return u"%s 已存在!可以去编辑!"%qnid print qnid resp = utils.sendGetRequest('https://sojump.com/m/%s.aspx'%param.wjid) import_qnobj = madmin.decode_sojump_html(qnid,resp) retdat = madmin.save_sojump(import_qnobj,param['fsid']) if retdat.has_key('error'): return retdat['error'] return formatting.json_string(import_qnobj,ensure_ascii=False,pretty=True)
def GET(self): '''获取问卷消息''' param = web.input(r='', fsid='', qnid='') if not cacher_random_checker.chkRandomValueNotPop( param['fsid'], param['r']): return '{"error":"页面已无效,请返回重新操作。"}' param.pop('r') QNOBJ = mdb.get_naire(param.qnid) if not QNOBJ: return '{"error":"问卷不存在!"}' FSOBJ = mdb.get_fans_byfsid(QNOBJ.FS_ID) mqsnaire.delaySendMessage(FSOBJ.OPENID, mqsnaire.getQsArticleBody(QNOBJ)) txtmsg = '直接戳链接:%s。' % (QNOBJ.SHARE_LINK.encode('utf8')) txtmsg = txtmsg + '或者关注【问卷调查大师】公众号,发文字消息【%s】(可输入部分文字模糊搜索)得到问卷参与链接。' % ( QNOBJ.QN_TITLE.encode('utf8')) if QNOBJ.QN_TYPE == 3: txtmsg = txtmsg + '填写问卷可获答谢%d调查币,' % int( round(QNOBJ.HONGBAO_MNY, 0)) txtmsg = txtmsg + '可获奖励基数%d调查币。' % (QNOBJ.QN_NO) mqsnaire.delaySendMessage(FSOBJ.OPENID, txtmsg, 500) return '{"success":"问卷消息已发送,您可以分享出去以便推广问卷。若您没有收到,可能是因为您与服务号的交互时间超过了48小时,请回到会话界面点击任意菜单再来点我!"}'