Beispiel #1
0
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
Beispiel #2
0
 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)
Beispiel #3
0
 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)
Beispiel #4
0
 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)
Beispiel #5
0
 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)
Beispiel #6
0
 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)
Beispiel #7
0
 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)
Beispiel #8
0
 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)
Beispiel #9
0
 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)
Beispiel #10
0
 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":"无效请求!"}'
Beispiel #11
0
 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
Beispiel #12
0
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
Beispiel #13
0
 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)
Beispiel #14
0
 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小时,请回到会话界面点击任意菜单再来点我!"}'