def replyClick31(fromuser): '''我的信息''' # 回复一个图文消息,显示用户的统计信息:发了多少个问卷、答了多少个问卷、中奖几次,引荐了多少粉丝,个人基本信息。提示点击可修改个人信息。 # 个人信息页面可查看自己的个人信息,可编辑。 retval = '' FSOBJ = mdb.get_fans_byopenid(fromuser) fsid = FSOBJ.FS_ID if FSOBJ else '' p0, p1, p2, p3, a0, a1, a2, a3, win, suma2, f1 = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 #发了多少个问卷(无偿,有偿,红包)、答了多少个问卷(无偿,有偿,红包)、中奖几次(中奖,红包),引荐了多少粉丝 if fsid: cacher_random_checker.popRandomValueForFSID(fsid) p0, p1, p2, p3, a0, a1, a2, a3, win, suma2, f1 = mdb.stat_fans_byfsid( fsid) info = '省份:%s\n城市:%s\n年龄:%s\n婚姻:%s\n学历:%s\n收入:%s' % ( FSOBJ.PROVINCE.encode('utf8') if FSOBJ.PROVINCE else '', FSOBJ.CITY.encode('utf8') if FSOBJ.CITY else '', mdb.get_basetitle('AGE', FSOBJ.P2_AGE), mdb.get_basetitle('MARRIAGE', FSOBJ.P2_MARRIAGE), mdb.get_basetitle('ACADEMIC', FSOBJ.P2_ACADEMIC), mdb.get_basetitle('INCOME', FSOBJ.P2_INCOME)) retval = { "title": "我的信息", "url": mforweixin.get_mp_authurl("%s/p31" % (HOST_NOS)), "description": "发布: 普通%d个,有奖%d个,红包%d个,互助%d个\n参与: 普通%d个,有奖%d个,红包%d个,互助%d个\n中奖次数: %d次。获得红包: %.2f元%s\n引荐粉丝: %d\n\n%s\n\n可点击修改个人信息" % (p0, p1, p2, p3, a0, a1, a2, a3, win, suma2, (',未发%.2f' % FSOBJ.NOTPAY_A2 if FSOBJ.NOTPAY_A2 else ''), f1, info) } #向自己人发送随机数 if fsid in web.config.app_configuration['run:selfman']: delaySendMessage(fromuser, cacher_random_checker.genRandomValueForFSID(fsid)) return retval
def replayQnaire(fromuser): qnid = web.config.app_configuration.get('sys:subnaire', '') #设置问卷ID在关注时返回 if qnid: QNOBJ = mdb.get_naire(qnid) if QNOBJ and QNOBJ.QN_STATUS == 2: FSOBJ = mdb.get_fans_byopenid(fromuser) ANOBJ = mdb.get_answer(QNOBJ.QN_ID, FSOBJ.FS_ID) if not ANOBJ: #如果没参与过才发 msg = getQsArticleBody(QNOBJ) delaySendMessage(fromuser, msg, 500)
def replyClickMC2(fromuser): '''我的调查币''' retval = '' mforweixin.get_fansinfo(fromuser) cacher_fsid_byopenid.delete(fromuser) FSOBJ = mdb.get_fans_byopenid(fromuser) fsid = FSOBJ.FS_ID if FSOBJ else '' if fsid: cacher_random_checker.popRandomValueForFSID(fsid) retval = { "title": "我的调查币", "url": mforweixin.get_mp_authurl("%s/pmc2" % (HOST_NOS)), "description": "当前调查币余额 %d\n用户等级 %s\n\n点击查看详情" % (FSOBJ.get('COIN_HOLD', 0), mdb.get_fans_level(FSOBJ)) } return retval
def replyClickMA1(fromuser): '''答互助问卷''' retval = '' FSOBJ = mdb.get_fans_byopenid(fromuser) if FSOBJ: cacher_random_checker.popRandomValueForFSID(FSOBJ.FS_ID) #如果年龄为空,说明是新用户,返回图文消息,提示用户需要填写个人信息后再参与问卷 if FSOBJ and not FSOBJ.P2_AGE: pushTask(mforweixin.get_fansinfo, fromuser) #获取微信用户信息 retval = { "title": "完善资料", "url": mforweixin.get_mp_authurl("%s/p31" % (HOST_NOS)), "description": "参与问卷前请先完善资料,所填写资料只用于调查问卷统计,不涉及隐私内容。" } return retval if FSOBJ: retval = mdb.list_cananswer(FSOBJ.FS_ID, 3) #问卷参与url:用微信网页授权并跳转 retval = [getQsArticleBody(x, i) for i, x in enumerate(retval)] retval = [x for x in retval if x] if retval: return retval return '没有更多互助问卷了!'
def set_weixinfan(openid,args={},fromchat=True): '''设置微信用户。args里面是要设置的字段及值。fromchat表示是否源自会话等活动(这些活动都是粉丝)。返回 tuple(FSID,用户是否公号粉丝),如果出错就返回(None,None)''' #微信网页授权有2种scope,都无需关注:1、以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的。2、以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。 global mutex import mdb FSOBJ = mdb.get_fans_byopenid(openid) # FSOBJ = web.listget(dbFrame.select("WX_FANS",vars=locals(),where="OPENID=$openid").list(), 0, None) t = dbFrame.transaction() try: #总是设置最近活跃时间 args['UNSUBSCRIBETIME'] = utils.get_currdatetimestr(dbFrame.dbtype) #利用取消关注时间字段记录综合的最后活跃时间 if fromchat: args['LASTACTIVETIME'] = utils.get_currdatetimestr(dbFrame.dbtype) #只记录来自会话的最后活跃时间,来自网页的不记录 #如果显式设置关注为1,说明是关注动作,设置关注时间 if args.get('SUBSCRIBE')==1: #关注 args['SUBSCRIBETIME'] = utils.get_currdatetimestr(dbFrame.dbtype) #如果显式设置关注为0,说明是取消关注动作,设置取消关注时间 if args.get('SUBSCRIBE')==0: args['UNSUBSCRIBETIME'] = utils.get_currdatetimestr(dbFrame.dbtype) else: #如果是会话/扫码等动作,并且不是取消关注动作,说明用户是粉丝,设置SUBSCRIBE以保证表中记录的关注状态是正确的。只有网页活动不知道是否粉丝 if fromchat: args['SUBSCRIBE'] = 1 isfan = args.get('SUBSCRIBE')==1 #根据openid判断的如果存在就更新,不存在就添加 if not FSOBJ: if mutex.acquire(1): fsid = utils.get_id_bytime() mutex.release() else: fsid = utils.get_id_bytime() while mdb.get_fans_byfsid(fsid): fsid = utils.get_id_bytime() if not args.has_key('IN_BY'): args['IN_BY'] = 10000 if args.get('SUBSCRIBE')==1: #如果用户不存在,且SUBSCRIBE为1,设置关注赠送积分 args['COIN_TOTAL'] = 100 args['COIN_HOLD'] = 100 dbFrame.insert("WX_COINDETAIL",CD_ID=utils.get_keyword(),FS_ID=fsid,INSERTTIME=utils.get_currdatetimestr(dbFrame.dbtype),CHG_AMOUNT=100,CHG_TYPE=11) dbFrame.update("WX_FANS",vars=locals(),where="FS_ID=$args['IN_BY']",GET_FANS=web.SQLLiteral('GET_FANS+1')) dbFrame.insert("WX_FANS",FS_ID=fsid,OPENID=openid,INSERTTIME=utils.get_currdatetimestr(dbFrame.dbtype), **args) else: fsid = FSOBJ.FS_ID if FSOBJ.SUBSCRIBE!=None: args.pop('IN_BY','') #在修改时如果SUBSCRIBE不是null说明用户关注中或曾经关注过,不修改IN_BY的值 elif args.get('SUBSCRIBE')==1: #如果SUBSCRIBE是null说明用户从未关注过,第1次关注的话设置赠送积分 pass # args['COIN_TOTAL'] = 100 # args['COIN_HOLD'] = 100 # dbFrame.insert("WX_COINDETAIL",CD_ID=utils.get_keyword(),FS_ID=fsid,INSERTTIME=utils.get_currdatetimestr(dbFrame.dbtype),CHG_AMOUNT=100,CHG_TYPE=11) if FSOBJ.SUBSCRIBE==args.get('SUBSCRIBE'): #如果现存值等于即将设置值就pop掉不再设置 args.pop('SUBSCRIBE','') dbFrame.update("WX_FANS",vars=locals(),where='OPENID=$openid', **args) # if args.keys()!=['LASTACTIVETIME']: # #如果只是设置最近活跃时间,不清除缓存 # cacher_fans_obj.delete(fsid) FSOBJ.update(args) #更新缓存 cacher_fans_obj.set(fsid,FSOBJ) except Exception, e: t.rollback() traceback.print_exc() return None,None