Пример #1
0
 def getUserCautionByIp(self, ip):
     m = mmysql("old_hongbao")
     r = m_redis.get_instance()
     try:
         iplist = []
         ip_cache_list = r.get(m_redis._ZHUAN_USER_BLACK_IP_) or ""
         if ip_cache_list:
             iplist = json.loads(ip_cache_list)
         else:
             sql = 'SELECT black_ip FROM z_ip_black WHERE status = 0;'
             m.Q(sql)
             rs = m.fetchall()
             for row in rs:
                 iplist.append(row["black_ip"])
             r.setex(m_redis._ZHUAN_USER_BLACK_IP_, json.dumps(iplist), 600)
     
         if iplist:
             for ip_str in iplist:
                 if re.findall(r"%s" % ip_str, ip):
                     return True
     except:
         traceback.print_exc()
         print "ip black is wrong"
     finally:
         m.close()
     return False
Пример #2
0
 def getUserPointById(self, uid):
     default_return_rs = {'point': 0, 'subpoint': 0, 'penaltypoint': 0, 'sumpoint': 0, 'vip': 1}
     cache_key =  m_redis._ZHUAN_USER_POINT_ + str(uid)
     r = m_redis.get_instance('ad')
     cache = r.get(cache_key)
     if not cache:
         m = mmysql()
         sql = 'SELECT point, subpoint, penaltypoint, sumpoint FROM user_contribution_%s WHERE uid = %s;' % (str(int(uid))[-1], int(uid))
         m.Q(sql)
         rs = m.fetchone()
         m.close()
         if rs:
             vip = 0
             if rs['sumpoint'] >= 10 and rs['sumpoint'] < 150:
                 vip = 1
             elif rs['sumpoint'] >= 150 and rs['sumpoint'] < 600:
                 vip = 2
             elif rs['sumpoint'] >= 600 and rs['sumpoint'] < 5000:
                 vip = 3
             elif rs['sumpoint'] >= 5000:
                 vip = 4
             rs['vip'] = vip
         r.set(cache_key, json.dumps(rs if rs else default_return_rs, cls = CJsonEncoder), 3600 * 4)
         cache = r.get(cache_key)
     if not cache:
         return default_return_rs
     return json.loads(cache)
Пример #3
0
 def cacheUpdateUserInfo(self, uid, device_id = "", app_id = 0):
     r = m_redis.get_instance()
     r.delete(m_redis._ZHUAN_USER_LOGIN_NEW_ + str(uid))
     r.delete(m_redis._ZHUAN_USER_SCORE_LIST_GROUP_ + str(uid))
     self.cacheUpdateUserInfoWithApp(uid, app_id)
     if device_id:
         r.delete(m_redis._ZHUAN_USER_ID_BY_DEVICE_ID_ + str(app_id) + "_" + str(device_id))
Пример #4
0
    def getUserExInfo(self, uid):
        uid = int(uid)
        r = m_redis.get_instance("ad")
        key = m_redis._ZHUAN_USER_EX_INFO_ + str(uid)
        uinfo_str = r.get(key)
        if uinfo_str:
            uinfo_obj = json.loads(uinfo_str)
        else:
            m = mmysql()
            sql = "select uid,sex,workspace,birth_day,ctime from z_user_info_ex where uid = '%s'" % (
                uid)
            m.Q(sql)
            uinfo_obj = m.fetchone()
            if uinfo_obj:
                uinfo_str = json.dumps(uinfo_obj, cls=CJsonEncoder)
                r.set(key, uinfo_str, 86400)
                uinfo_obj = json.loads(uinfo_str)
            else:
                uinfo_obj = {}
                r.set(key, "{}", 300)
            m.close()

        if not uinfo_obj:
            return UserExInfo()
        else:
            uei = UserExInfo()
            uei.uid = uinfo_obj["uid"]
            uei.sex = uinfo_obj["sex"]
            uei.workspace = uinfo_obj["workspace"]
            uei.birthday = uinfo_obj["birth_day"]
            uei.ctime = uinfo_obj["ctime"]
            return uei
Пример #5
0
 def addAppRegister(self, uid, app_id, device_id, imsi, os_type, channel, client_ip):
     if not self._validate_param('device_id', device_id):
         return False
     
     m = mmysql()
     try:
         # 新规则 如果device_id 已经被人用了  且uid和你不一样  就不让激活
         # 增加这个规则意义在于 如果z_user表内已经有人用过这个device_id 也是不允许其他人激活的
         sql = "SELECT uid FROM device_id_uid_appid_%s WHERE device_id = '%s';" % (int(app_id), m.F(device_id))                   
         m.Q(sql)
         rs = m.fetchone()
         if rs and rs["uid"] and rs["uid"] != uid:
             return False
         
         sql = "INSERT INTO device_id_uid_appid_%s(device_id, uid, update_time) VALUES('%s', '%s', now())" % (int(app_id), m.F(device_id), int(uid))
         m.Q(sql)
         sql = "INSERT INTO app_register_%s(uid, appid, rtime, device_id, imsi, os_type, channel, register_ip) \
                     VALUES('%s', '%s', now(), '%s', '%s', '%s', '%s', '%s')" % (str(int(uid))[-1], int(uid), int(app_id), m.F(device_id), m.F(imsi) ,m.F(os_type), m.F(channel), m.F(client_ip))
         m.Q(sql)
         self.cacheUpdateUserInfo(int(uid), m.F(device_id), app_id)
     except:
         traceback.print_exc()
         return False
     finally:
         m.close()
         r = m_redis.get_instance()
         r.delete(self._appIdCacheKey(uid, app_id))
     return True
Пример #6
0
    def createUserExInfo(self, userexinfo):

        if not re.findall("^\d{8,10}$", str(userexinfo.uid)):
            raise InvalidOperation(1, "uid is not validate.")

        if userexinfo.sex not in [1, 2]:
            raise InvalidOperation(2, "sex is not validate.")

        if not workSpace._VALUES_TO_NAMES.has_key(userexinfo.workspace):
            raise InvalidOperation(3, "workSpace is not validate.")

        if not re.findall("^\d{4}-\d{2}-\d{2}$", userexinfo.birthday):
            raise InvalidOperation(4, "birth day is not validate.")

        try:
            m = mmysql()
            sql = "insert into z_user_info_ex(uid,sex,workspace,birth_day,ctime) values('%s','%s','%s','%s',now())" % (
                userexinfo.uid, userexinfo.sex, userexinfo.workspace,
                userexinfo.birthday)
            m.Q(sql)
            m.close()
            key = m_redis._ZHUAN_USER_EX_INFO_ + str(userexinfo.uid)
            r = m_redis.get_instance("ad")
            r.delete(key)
        except:
            raise InvalidOperation(5, traceback.format_exc())

        return True
Пример #7
0
    def resumeUserScoreForExchange(self, uid, score):
        if not self._validate_param('uid', uid):
            return False

        m = mmysql(self.witchDb(uid))
        try:
            sql = "SELECT uid, score FROM %s WHERE uid = '%s';" % (
                self.witchScoreTable(uid), int(uid))
            m.Q(sql)
            rs = m.fetchone()
            if not rs:
                m.close()
                return False

            # log表规则是取uid倒数第2位分库 最后1位分表 共100个表(包括0)
            sql = "UPDATE %s SET score = score + %s, update_time = now() WHERE uid = '%s';" % (
                self.witchScoreTable(uid), score, int(uid))
            m.Q(sql)
        except:
            traceback.print_exc()
            m.close()
            return False

        # 如果今天有缓存,更新积分退款和减余额全部更新缓存
        r = m_redis.get_instance()
        r.delete(self._scoreListKey(uid))
        m.close()
        return True
Пример #8
0
    def getAccessToken():
        u'''获取access token
        '''
        access_token = None
        r = m_redis.get_instance()
        c_k = '_Z_WX_ACCESS_TOKEN'
        access_token = r.get(c_k)
        if access_token:
            info('cache hit %s', c_k)
            raise gen.Return(access_token)

        url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={APPSECRET}'.format(APPID=WXLoginManager.APPID, APPSECRET=WXLoginManager.APPSECRET)
        try:
            httpc_lient = AsyncHTTPClient()
            resp = yield gen.Task(httpc_lient.fetch, url)  # , validate_cert = False)
            info('resp: %s', resp.body)
            j_data = json.loads(resp.body)
        except:
            error('', exc_info=True)
        else:
            if 'errcode' in j_data:
                info('errcode %s, errmsg: %s', j_data['errcode'], j_data.get('errmsg', ''))
            else:
                access_token = j_data['access_token']
                expires_in = j_data['expires_in']
                info('access token[:20]%s expire in %s', access_token[:20], expires_in)
                r.setex(c_k, access_token, expires_in)

        raise gen.Return(access_token)
Пример #9
0
    def getUidByDeviceId(self, device_id, app_id = 0):
        r = m_redis.get_instance()
        if app_id == None:
            raise InvalidOperation(1, "app_id is None.")
        
        device_id_key = m_redis._ZHUAN_USER_ID_BY_DEVICE_ID_ + str(app_id) + "_" + str(device_id)
        uid = r.get(device_id_key)
        if not uid:
            m = mmysql()
            sql = "SELECT uid FROM device_id_uid_appid_%s WHERE device_id = '%s';" % (int(app_id), m.F(device_id))                   
            m.Q(sql)
            rs = m.fetchone()
            if not rs:
                sql = 'SELECT uid FROM z_user WHERE device_id = "%s"' % m.F(device_id)
                m.Q(sql)
                rs = m.fetchone()
            if rs:
                uid = rs["uid"]
                r.setex(device_id_key, uid, 800)
            else:
                m.close()
                return 0
            m.close()

        return int(uid)
Пример #10
0
    def getIpList():
        u'''获取微信服务器ip列表
        '''
        ip_list = []

        r = m_redis.get_instance()
        c_k = '_Z_WX_IP_LIST'
        ip_list = r.get(c_k)
        if ip_list:
            info('cache hit %s', c_k)
            raise gen.Return(ip_list)

        access_token = yield WXLoginManager.getAccessToken()
        if access_token:
            url = 'https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token={ACCESS_TOKEN}'.format(ACCESS_TOKEN=access_token)
            try:
                httpc_lient = AsyncHTTPClient()
                resp = yield gen.Task(httpc_lient.fetch, url)  # , validate_cert = False)
                info('resp: %s', resp.body)
                j_data = json.loads(resp.body)
            except:
                error('', exc_info=True)
            else:
                if 'errcode' in j_data:
                    info('errcode %s, errmsg: %s', j_data['errcode'], j_data.get('errmsg', ''))
                    # 出错情况下 5秒内不重试
                    r.setex(c_k, json.dumps(ip_list), 5)
                else:
                    ip_list = j_data['ip_list']
                    info('ip_list: %s', ip_list)
                    r.setex(c_k, json.dumps(ip_list), 3600)
        else:
            info('can\'t get access_token, no ip list returned.')

        raise gen.Return(ip_list)
Пример #11
0
    def finishSmallExchange(self, uid, type_score, succ):
        r = m_redis.get_instance()
        if not self._finishSmallExchangeDirtyWork(r, uid, type_score):
            return False

        # 到这里说明可以进行小额兑换完毕的操作,处理一下数据
        r = m_redis.get_instance()
        m = mmysql()
        ad_time = self.SMALL_EXCHANGE_SCORE_AD_TIME_LIST.get(type_score)
        redis_key = m_redis._ZHUAN_USER_SMALL_EXCHANGE_ALL_AD_TIME_ + str(uid)
        r.delete(redis_key)
        if succ:
            sql = 'UPDATE user_small_exchange_%s SET score_ad_holding_time = 0, score_ad_finish_time = score_ad_finish_time + %s WHERE uid = %s;' % (
                self._whichTable(uid), ad_time, uid)
        else:
            sql = 'UPDATE user_small_exchange_%s SET score_ad_holding_time = 0, score_ad_time = score_ad_time + %s WHERE uid = %s;' % (
                self._whichTable(uid), ad_time, uid)
        result = m.Q(sql)
        m.close()
        return result
Пример #12
0
 def get_counting(self, key, interval, default_cooltime=1, onmonth=0):
     today = str(datetime.date.today()) if not onmonth else str(
         datetime.date.today())[:7]
     r_cool_key = "service_" + key + "_" + today
     r = m_redis.get_instance()
     rcooltime = r.incr(r_cool_key)
     if rcooltime == 1: r.expire(r_cool_key, interval)
     if default_cooltime != 1:
         if rcooltime > default_cooltime:
             return True
     elif rcooltime != 1:
         return True
     return False
Пример #13
0
 def userScoreMaxCheck(self, uid, score):
     if not score:
         return False
     today = str(datetime.date.today())
     today_score_key = m_redis._ZHUAN_USER_SCORE_MAX_ + today + "_" + str(uid)
     r = m_redis.get_instance()
     today_score = r.get(today_score_key)
     return_rs = False
     if today_score and int(today_score) > 50:
         return_rs = True
     r.incr(today_score_key, int(score))
     r.expire(today_score_key, 86400 * 2)
     return return_rs
Пример #14
0
    def getUserTodayScoreList(self, uid, is_yesteday=True):
        if is_yesteday:
            str_day = str(datetime.date.today() - datetime.timedelta(days=1))
        else:
            str_day = str(datetime.date.today())
        today_user_key = m_redis._ZHUAN_TODAY_USER_SCORE_NEW_ + str_day + str(
            uid)
        r = m_redis.get_instance()
        alllist = r.hgetall(today_user_key)

        for key in alllist.keys():
            alllist[key] = int(alllist[key])
        return alllist
Пример #15
0
    def userLogin(self,
                  pnum,
                  pw,
                  device_id,
                  os_type,
                  client_ip,
                  app_id,
                  imsi='',
                  channel=''):
        self._validate_param("pnum", pnum)
        self._validate_param("password", pw)
        self._validate_param("device_id", device_id)

        # 2 秒防爆破
        r = m_redis.get_instance()
        no_boom_key = "userLogin_" + str(pnum)
        no_boom_val = r.get(no_boom_key)
        if no_boom_val:
            if no_boom_val == "null":
                raise InvalidOperation(Errtype.REQUEST_TOO_FASTER,
                                       "访问过快,或访问异常。")
            else:
                return UserTicket(True, no_boom_val)
        r.set(no_boom_key, "null", 2)
        userinfo = self.getUserInfo(pnum, client_ip, 0, app_id)
        if not userinfo or not userinfo.uid:
            raise InvalidOperation(Errtype.USER_NO_FIND, "抱歉,账户不存在。")
        if self._get_password(pw) != userinfo.pword:
            raise InvalidOperation(Errtype.PASSWORD_WRONG, "密码错误。")

        # 判断是否已经在 app register 里面注册了  如果没有 注册进去
        is_app_register = self.existAppRegister(int(userinfo.uid), app_id)
        if not is_app_register:
            try:
                if not self.addAppRegister(int(userinfo.uid), 0, device_id,
                                           imsi, os_type, channel, client_ip):
                    raise InvalidOperation(Errtype.DEVICE_ID_NOT_BIND,
                                           "抱歉,您已被其他账号绑定。")
            except:
                raise InvalidOperation(Errtype.DEVICE_ID_NOT_BIND,
                                       "抱歉,您已被其他账号绑定。")

        ticket = ticket_manager.create_ticket(userinfo.uid, userinfo.device_id,
                                              userinfo.pword)
        if ticket:
            r.set(no_boom_key, ticket, 10)
            return UserTicket(True, ticket)
        else:
            raise InvalidOperation(Errtype.TICKET_CREATE_FAILD, "ticket 生成失败!")
Пример #16
0
    def addSmallExchange(self, uid, type_score):
        if not self._addSmallExchangeDirtyWork(uid, type_score):
            return False

        # 到这里说明可以进行小额兑换,那么充值一下数据
        r = m_redis.get_instance()
        m = mmysql()
        ad_time = self.SMALL_EXCHANGE_SCORE_AD_TIME_LIST.get(type_score)
        redis_key = m_redis._ZHUAN_USER_SMALL_EXCHANGE_ALL_AD_TIME_ + str(uid)
        r.delete(redis_key)
        sql = 'UPDATE user_small_exchange_%s SET score_ad_time = score_ad_time - %s, score_ad_holding_time = %s WHERE uid = %s;' % (
            self._whichTable(uid), ad_time, ad_time, uid)
        result = m.Q(sql)
        m.close()
        return result
Пример #17
0
 def _getUserInfoByAppId(self, uid, app_id = 0):
     rkey = self._appIdCacheKey(uid, app_id)
     r = m_redis.get_instance()
     cache = r.get(rkey)
     if not cache:
         m = mmysql()
         sql = "SELECT uid, appid, rtime, device_id, imsi, os_type, channel, register_ip FROM app_register_%s WHERE uid = %s AND appid = %s;" % (str(int(uid))[-1], int(uid), int(app_id))
         m.Q(sql)
         rs = m.fetchone()
         r.set(rkey, json.dumps(rs if rs else {},cls=CJsonEncoder), 86400)
         cache = r.get(rkey)
         m.close()
     if not cache:
         return {}
     return json.loads(cache)
Пример #18
0
 def existUser(self, uid):
     r = m_redis.get_instance()
     u_r_key = m_redis._ZHUAN_USER_LOGIN_NEW_ + str(uid)
     user_re = r.get(u_r_key)
     if user_re:
         return True
     
     m = mmysql()
     sql = "SELECT 'x' FROM z_user WHERE uid = '%s';" % int(uid)
     m.Q(sql)
     rs = m.fetchone()
     if rs and rs["x"]:
         m.close()
         return True
     m.close()
     return False
Пример #19
0
 def getInviteMember(self, uid):
     r = m_redis.get_instance("ad")
     invite_key = m_redis._ZHUAN_INVITE_MEMBER_ + str(uid) 
     num = r.get(invite_key)
     if not num:
         m = mmysql()
         sql = "SELECT COUNT(uid) AS num FROM z_user WHERE invite_code = '%s';" % (int(uid))
         m.Q(sql)
         rs = m.fetchone()
         if rs:
             num = rs["num"]
             r.setex(invite_key,rs["num"],800)
         else:
             m.close()
             return 0
         m.close()
     return int(num)
Пример #20
0
 def consumeAdDownloadTimes(self, uid, times):
     if not self._validate_param('uid', uid):
         return False
     all_ad_time_data = json.loads(self.getUserSmallExchangeAllAdTime(uid))
     score_ad_time = all_ad_time_data.get('score_ad_time', 0)
     if score_ad_time < times:
         return False
     m = mmysql()
     sql = 'UPDATE user_small_exchange_%s SET score_ad_time = score_ad_time - %s, score_ad_finish_time = score_ad_finish_time + %s WHERE uid = %s;' % (
         self._whichTable(uid), times, times, uid)
     result = m.Q(sql)
     m.close()
     if result:
         r = m_redis.get_instance()
         redis_key = m_redis._ZHUAN_USER_SMALL_EXCHANGE_ALL_AD_TIME_ + str(
             uid)
         r.delete(redis_key)
     return result
Пример #21
0
 def getUidByPnum(self, pnum):
     r = m_redis.get_instance()
     pnum = str(pnum)
     uid = r.get(m_redis._ZHUAN_USER_ID_BY_PNUM_ + str(pnum))
     if not uid:
         uid = 0
         m = mmysql()
         sql = 'SELECT uid FROM z_user WHERE pnum = "%s";' % m.F(pnum)
         m.Q(sql)
         rs = m.fetchone()
         if rs:
             uid = rs["uid"]
             r.setex(m_redis._ZHUAN_USER_ID_BY_PNUM_ + str(pnum), uid, 86400)
         else:
             m.close()
             return 0
         m.close()
     
     return int(uid)
Пример #22
0
    def getQrPicBySceneId(scene_id, want_temp=True):
        u'''通过场景值获取二维码图片数据

        * ``scene_id``
        * ``want_temp`` True 临时(默认)  False 永久

        返回二维码图片数据或者None
        '''
        pic_data = None
        max_expire = 604800
        r = m_redis.get_instance('ad')
        c_k = '_Z_WX_QR_%s' % scene_id
        ticket = r.get(c_k)
        if not ticket:
            if want_temp:
                if not isinstance(scene_id, int):
                    info('参数错误: 临时二维码的scene_id必须为32位非0整型!')
                    raise gen.Return(pic_data)
                data = {'expire_seconds': max_expire, 'action_name': 'QR_SCENE', 'action_info': {'scene': {'scene_id': scene_id}}}
            else:
                if isinstance(scene_id, int):
                    if not (0 < scene_id <= 100000):
                        info('参数错误: 永久二维码的scene_id为整数时,范围为(0,100000]')
                        raise gen.Return(pic_data)
                    data = {'expire_seconds': max_expire, 'action_name': 'QR_LIMIT_SCENE', 'action_info': {'scene': {'scene_id': scene_id}}}
                elif isinstance(scene_id, str):
                    if not (0 < len(scene_id) <= 64):
                        info('参数错误: 永久二维码的scene_id为字符串时,长度范围为[1,64]')
                        raise gen.Return(pic_data)
                    data = {'expire_seconds': max_expire, 'action_name': 'QR_LIMIT_STR_SCENE', 'action_info': {'scene': {'scene_str': scene_id}}}
                else:
                    info('参数错误: 永久二维码的scene_id应该为int或str')
                    raise gen.Return(pic_data)

            j_data = yield WXLoginManager.createQrCodeTicket(data)
            info('%s', pcformat(j_data))
            ticket = j_data['ticket']
            expire_at = j_data['expire_seconds']
            r.setex(c_k, ticket, expire_at)
        if ticket:
            pic_data = yield WXLoginManager.getQrCodeByTicket(ticket)
            open('/tmp/t.jpg', 'wb').write(pic_data)
        raise gen.Return(pic_data)
Пример #23
0
 def _getUserSmallExchangeTime(self, uid, redis_key_prefix, db_column,
                               cache_time):
     self._validate_param('uid', uid)
     r = m_redis.get_instance()
     m = mmysql()
     redis_key = redis_key_prefix + str(uid)
     s_time = r.get(redis_key)
     if not s_time:
         sql = 'SELECT %s FROM user_small_exchange_%s WHERE uid = %s;' % (
             db_column, self._whichTable(uid), uid)
         m.Q(sql)
         rs = m.fetchone()
         if rs and rs[db_column]:
             s_time = rs[db_column]
         else:
             s_time = 0
         self._cacheSmallExchangeData(r, redis_key, s_time, cache_time)
         s_time = r.get(redis_key)
     m.close()
     return int(s_time)
Пример #24
0
    def getUserThisMonthScoreTime(self, uid, action_type=0):
        r = m_redis.get_instance()
        scoreTimeMonthly = r.get(m_redis._ZHUAN_USER_SCORE_TIME_THIS_MONTH_ +
                                 str(uid))
        if scoreTimeMonthly == None:
            today = datetime.date.today()
            firstDay = datetime.date(day=1, month=today.month, year=today.year)
            firstDay = firstDay.strftime('%Y-%m-%d %H:%M:%S')

            m = mmysql(self.witchDb(uid))
            sql = 'SELECT count(*) as time FROM %s WHERE uid = %s AND action_type = %s AND ctime >= "%s";' % (
                self.witchScoreLogTable(uid), int(uid), int(action_type),
                firstDay)
            m.Q(sql)
            result = m.fetchone()
            scoreTimeMonthly = result['time']
            r.setex(m_redis._ZHUAN_USER_SCORE_TIME_THIS_MONTH_ + str(uid),
                    scoreTimeMonthly, 60 * 60)

        return int(scoreTimeMonthly)
Пример #25
0
    def _addScoreSmallExchangeWork(self, uid, ScoreAddObj, currency):
        # 如果加分类型不是广告,直接返回
        if ScoreAddObj.action_type != Scoretype._ACTION_TYPE_AD:
            return
        # 如果广告不是自家的,直接返回
        if ScoreAddObj.trade_type != 1:
            return
        '''
        # 如果不是 ios 系统,直接返回
        if ScoreAddObj.os_type_id != OS_TYPE._OS_TYPE_IOS:
            return
        '''

        # 如果金额为0(特惠),直接返回
        if currency == 0:
            return

        m = mmysql()
        r = m_redis.get_instance()
        self._firstAdWork(m, r, uid, currency)  # 先看看是不是第一次下载广告
        self._addSmallExchangeAdTime(m, r, uid)  # 增加用户可用于小额兑换的广告次数
        m.close()
Пример #26
0
    def _getUserScoreList(self, uid):
        r = m_redis.get_instance()
        list = r.hgetall(self._scoreListKey(uid))
        if not list:
            m = mmysql(self.witchDb(uid))
            sql = 'SELECT uid, score, update_time, score_ad, score_right_catch, score_register, score_other, score_task, score_active, \
                    score_field_1 AS wifi_share, score_field_2 AS bind_bank_card, score_field_3 AS ad_wall_20, score_field_4 AS score_offspring, \
                    score_ad + score_right_catch + score_register + score_other + score_task + score_active + score_field_1 + score_field_2 + score_field_3 + score_field_4 as num \
                    FROM %s WHERE uid = "%s";' % (self.witchScoreTable(uid),
                                                  int(uid))
            m.Q(sql)
            rs = m.fetchone()
            if not rs:
                return {}
            rs['update_time'] = int(time.mktime(rs['update_time'].timetuple()))
            m.close()
            r.hmset(self._scoreListKey(uid), rs)
            r.expire(self._scoreListKey(uid), 86400)
            list = r.hgetall(self._scoreListKey(uid))

        for key in list.keys():
            list[key] = int(list[key])
        return list
Пример #27
0
 def getUserSmallExchangeAllAdTime(self, uid):
     all_ad_time_data = '{}'
     if not self._validate_param('uid', uid):
         return all_ad_time_data
     r = m_redis.get_instance()
     m = mmysql()
     redis_key = m_redis._ZHUAN_USER_SMALL_EXCHANGE_ALL_AD_TIME_ + str(uid)
     all_ad_time_data = r.get(redis_key)
     if not all_ad_time_data:
         sql = 'SELECT score_ad_time, score_ad_finish_time, score_ad_holding_time FROM user_small_exchange_%s WHERE uid = %s;' % (
             self._whichTable(uid), uid)
         m.Q(sql)
         rs = m.fetchone()
         if not rs:
             rs = self.SMALL_EXCHANGE_SCORE_AD_TIME_LIST
         else:
             rs.update(self.SMALL_EXCHANGE_SCORE_AD_TIME_LIST)
         r.set(redis_key,
               json.dumps(rs if rs else all_ad_time_data, cls=CJsonEncoder),
               self.SMALL_EXCHANGE_ALL_AD_TIME_CACHE_TIME)
         all_ad_time_data = r.get(redis_key)
     m.close()
     return all_ad_time_data
Пример #28
0
    def updateUserPoint(self, uid, point, subpoint):
        # 该函数只做加分操作,减分操作是由每天凌晨的脚本跑出来的
        uinfo = self.getUserInfoByUid(uid)
        if not uinfo or uinfo.uid == None:
            return False
        
        stat_date = datetime.datetime.now().strftime("%Y-%m-%d")
        m = mmysql()
        m.Q("INSERT INTO user_contribution_%s VALUES('%s', '%s', %s, 0, 0, `point` + `subpoint` + `penaltypoint`, -100, NOW()) ON DUPLICATE KEY UPDATE \
         stat_date ='%s', `point` = `point` + %d, `sumpoint` = `sumpoint` + %d, utime = now();" % (str(uid)[-1], str(uid), stat_date, int(point), stat_date, int(point), int(point)))

        if int(uinfo.invite_code) and uinfo.invite_code > 0:
            subinfo = self.getUserInfoByUid(uinfo.invite_code)
            if subinfo and subinfo.uid != None:
                m.Q("INSERT INTO user_contribution_%s VALUES('%s', '%s', 50, %s, 0, `point` + `subpoint` + `penaltypoint`, -100, NOW()) ON DUPLICATE KEY UPDATE \
                    stat_date = '%s', subpoint = subpoint + %d, `sumpoint` = `sumpoint` + %d, utime = now();" %
                    (str(uinfo.invite_code)[-1], str(uinfo.invite_code), stat_date, int(subpoint), stat_date, int(subpoint), int(subpoint)))
        m.close()
        # 清除缓存
        cache_key = m_redis._ZHUAN_USER_POINT_ + str(uid)
        r = m_redis.get_instance("ad")
        r.delete(cache_key)
        return True
Пример #29
0
    def _getOAuthAccessTokenOpenId(code, package_name):
        u'''通过code换取网页授权access_token, refresh_token 和 openid

        '''
        access_token, refresh_token, openid, err_code, err_msg = None, None, None, None, None
        r = m_redis.get_instance()
        c_k = '_Z_WX_O_ACCESS_TOKEN_%s' % code
        c_data = r.get(c_k)
        if c_data:
            access_token, openid = json.loads(c_data)
            info('cache hit %s', c_k)
            raise gen.Return((access_token, refresh_token, openid, err_code, err_msg))

        app_id, app_secret = WXLoginManager._getAppIdAndAppSecret(package_name)
        url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid={APPID}&secret={APPSECRET}&code={CODE}&grant_type=authorization_code'.format(APPID=app_id, APPSECRET=app_secret, CODE=code)
        try:
            httpc_lient = AsyncHTTPClient()
            resp = yield gen.Task(httpc_lient.fetch, url)  # , validate_cert = False)
            info('resp: %s', resp.body)
            j_data = json.loads(resp.body)
        except:
            error('', exc_info=True)
        else:
            if 'errcode' in j_data:
                err_code, err_msg = j_data['errcode'], j_data['errmsg']
                info('errcode %s, errmsg: %s', j_data['errcode'], j_data.get('errmsg', ''))
            else:
                access_token = j_data['access_token']
                refresh_token = j_data['refresh_token']
                expires_in = j_data['expires_in']
                openid = j_data['openid']
#-#                scope = j_data['scope']
#-#                unionid = j_data.get('unionid', '')
                info('access token[:20]%s expire in %s openid %s', access_token[:20], expires_in, openid)
                r.setex(c_k, json.dumps((access_token, openid)), expires_in)

        raise gen.Return((access_token, refresh_token, openid, err_code, err_msg))
Пример #30
0
    def getMediaId(media_type, media_data, key=None):
        u'''获取素材id
        * ``media_type`` 素材类型 image/voice/video/thumb 之一
        * ``media_data`` 素材数据,如果 ``media_data`` 不为空 且 ``key`` 在缓存中查不到,则上传素材
        * ``key`` 指定的key值,以后可以设置 ``media_data`` 为空的情况下获取已经上传的素材id

        返回 media_id ,此数值可以用于构造图片消息
        '''
        media_id = None
        d_content_type = {'image': 'image/jpg',  # bmp/png/jpeg/jpg/gif
                          'voice': 'voice/mp3',  # mp3/wma/wav/amr
                          'video': 'video/mp4',
                          'thumb': 'thumb/jpg',
                          }
        if media_type not in d_content_type:
            info('unknown media_type %s', media_type)
            raise gen.Return(media_id)
        if not key:
            if not media_data:
                info('media_data 为空')
                raise gen.Return(media_id)
            key = md5(media_data).hexdigest()
        c_k = '_Z_WX_M_%s_%s' % (media_type, key)
        r = m_redis.get_instance()
        media_id = r.get(c_k)
        if not media_id:
            if not media_data:  # 缓存里面没有查到,必须先上传,media_type必须非空
                info('media_data 为空')
                raise gen.Return(media_id)
            access_token = yield WXLoginManager.getAccessToken()
            url = 'https://api.weixin.qq.com/cgi-bin/media/upload?access_token={ACCESS_TOKEN}&type={MEDIA_TYPE}'.format(ACCESS_TOKEN=access_token, MEDIA_TYPE=media_type)
#-#            info('url: %s', url)  # debug only
            nr_try = 1
            while 1:
                boundary = ''.join((random.choice(string.digits) for _ in xrange(32)))
                if media_data.find(boundary) == -1:
                    break
                nr_try += 1
            headers = HTTPHeaders({'Content-Type': 'multipart/form-data;boundary=%s' % boundary})
            form_body = '--%s\r\n' \
                        'Content-Disposition: form-data; name="media"; filename="upload.%s"\r\n' \
                        'Content-Type: %s\r\n' \
                        'FileLength: %s\r\n\r\n' \
                        '%s\r\n' \
                        '--%s--\r\n' \
                        % (boundary, d_content_type[media_type].split('/')[1], d_content_type[media_type], len(media_data), media_data, boundary)
#-#            info('form_body(header part):\n%s', form_body[:form_body.find('\r\n\r\n')])  # debug only
            req = HTTPRequest(url, method='POST', body=form_body, headers=headers)  # , validate_cert = False)
            httpc_lient = AsyncHTTPClient()
            try:
                resp = yield gen.Task(httpc_lient.fetch, req)
                info('resp: %s', resp.body)
                j_data = json.loads(resp.body)
            except:
                error('', exc_info=True)
            else:
                if j_data.get('errcode', None):
                    info('上传素材出错: errcode %s, errmsg: %s', j_data['errcode'], j_data.get('errmsg', ''))
                else:
                    media_id = j_data['media_id']
                    r.setex(c_k, media_id, 86400 * 3)
        else:
            info('cache hit %s', c_k)

        raise gen.Return(media_id)
Пример #31
0
 def ping(self, str):
     print 'ping'
     r = m_redis.get_instance()
     r.set('xx', int(r.get('xx') or 0) + 1, 300)
     print r.get('xx')
     return True
Пример #32
0
    def addScore(self, ScoreAddObj):
        try:
            currency = int(ScoreAddObj.currency)
        except:
            return False

        try:
            # uid 不能为空,不能为0,且必须存在
            uid = int(ScoreAddObj.uid)
            if not uid:
                return False
        except:
            return False

        try:
            # uid 不能为空,不能为0,且必须存在
            app_id = int(ScoreAddObj.app_id)
            if not app_id:
                app_id = 0
        except:
            return False

        server_ip = ""
        try:
            #uid 不能为空 不能为0 且必须存在
            server_ip = self.remoteAddress
        except:
            pass

        # 退款和兑换只加减余额和记录
        score_sql_str = ''
        if ScoreAddObj.action_type not in [6, 7]:
            # 更新主表的加分类别,如果加分类别不存在则主表更新不会成功,因此出错返回
            try:
                score_str = self._SCORE_TYPE_DB_NAME[ScoreAddObj.action_type]
                if not score_str:
                    return False
                score_sql_str = ", %s = %s + %s" % (score_str, score_str,
                                                    currency)
            except:
                return False

        m = mmysql(self.witchDb(uid))
        balance = 0
        try:

            sql = "SELECT uid, score FROM %s WHERE uid = '%s';" % (
                self.witchScoreTable(uid), int(uid))
            m.Q(sql)
            rs = m.fetchone()
            if not rs:
                balance = currency
                if self.existUser(uid):
                    self.create_user_score_line(uid)
            else:
                balance = int(rs["score"]) + currency

            # 如果是扣款,检查一下金额是否足够
            if currency < 0 and balance < 0:
                m.close()
                return False

            # log表规则是取uid倒数第2位分库 最后1位分表 共100个表(包括0)
            sql = "UPDATE %s SET score = score + %s, update_time = now() %s WHERE uid = '%s';" % (
                self.witchScoreTable(uid), currency, score_sql_str, int(uid))
            m.Q(sql)
            # 后面不能放东西
        except:
            traceback.print_exc()
            m.close()
            return False

        # 如果今天有缓存,更新积分退款和减余额全部更新缓存
        r = m_redis.get_instance()
        r.delete(self._scoreListKey(uid))

        # log
        try:
            # log表规则是取uid倒数第2位分库 最后1位分表 共100个表(包括0)
            time_stamp = ScoreAddObj.time_stamp
            if not ScoreAddObj.time_stamp:
                time_stamp = 123457
            if not ScoreAddObj.order_id:
                ScoreAddObj.order_id = ''
            if not ScoreAddObj.ad_name:
                ScoreAddObj.ad_name = ''
            if not ScoreAddObj.client_ip:
                ScoreAddObj.client_ip = ''
            sql = "INSERT INTO %s(uid, device_id, score, ad_id, ad_type, ad_name, ctime, order_id, time_stamp, action_type, ip, balance, app_from, server_ip) \
                        values('%s', '%s', %s, '%s', '%s', '%s', now(), '%s', '%s', %s, '%s', '%s', '%s', '%s')"                                                                                                                 % \
                        (self.witchScoreLogTable(uid), int(uid), m.F(ScoreAddObj.device_id), currency, m.F(ScoreAddObj.pack_name), int(ScoreAddObj.trade_type),
                        m.F(ScoreAddObj.ad_name), m.F(ScoreAddObj.order_id), int(time_stamp), ScoreAddObj.action_type, m.F(ScoreAddObj.client_ip),
                        balance, app_id, server_ip)
            m.Q(sql)
        except:
            traceback.print_exc()
        finally:
            m.close()

        # 增加一个记录今天的积分的缓存 采用累计的方式
        # 替换前需要getUserInfoByUid中修改今日收益
        try:
            if ScoreAddObj.action_type not in [6, 7]:
                r = m_redis.get_instance()
                today_user_key = m_redis._ZHUAN_TODAY_USER_SCORE_ + str(
                    datetime.date.today()) + str(uid)
                r.incr(today_user_key, int(currency))
                r.expire(today_user_key, 86400 * 2)
        except:
            traceback.print_exc()
            print "today is wrong"

        # 下面这个以后会替代今日收益
        try:
            if ScoreAddObj.action_type not in [6, 7]:
                r = m_redis.get_instance()
                today_user_key = m_redis._ZHUAN_TODAY_USER_SCORE_NEW_ + str(
                    datetime.date.today()) + str(uid)
                r.hincrby(today_user_key, "today_score", int(currency))
                r.hincrby(today_user_key, ScoreAddObj.action_type,
                          int(currency))
                if ScoreAddObj.action_type in [0, 2]:
                    r.hincrby(today_user_key,
                              "%s_num" % ScoreAddObj.action_type)
                r.expire(today_user_key, 86400 * 2)
        except:
            traceback.print_exc()
            print "today is wrong"

        # 删除一下这个月用户下载广告次数的缓存
        r.delete(m_redis._ZHUAN_USER_SCORE_TIME_THIS_MONTH_ + str(uid))

        # 处理一下小额兑换
        self._addScoreSmallExchangeWork(str(uid), ScoreAddObj, currency)

        return True
Пример #33
0
 def cacheUpdateUserInfoWithApp(self, uid, app_id):
     m_redis.get_instance().delete(self._appIdCacheKey(uid, app_id))
Пример #34
0
    def delUser(self, pnum):
        print pnum
        if not re.findall("^[0-9]{11}$", str(pnum)):
            return False
        
        uinfo = self.getUserInfo(pnum)
        if uinfo and uinfo.uid:
            if not self.isTestUser(pnum):
                return False

            uid = str(uinfo.uid)
            m = mmysql("old_hongbao")
            sql = "DELETE FROM z_verify_log WHERE mobile = '%s';" % str(uinfo.mobile)
            m.Q(sql)
            sql = "DELETE FROM z_push_ios WHERE uid = %s;" % str(uid)
            m.Q(sql)
            sql = 'DELETE FROM z_user WHERE uid = %s;' % (uid)
            m.Q(sql)
            sql = 'DELETE FROM z_user WHERE pnum = "%s";' % (pnum)
            m.Q(sql)
            m.close()
            newdatadb = mmysql(self.witchDb(uid))
            sql = 'DELETE FROM z_user_score_%s WHERE uid = %s;' % (str(uid)[-1], uid)
            newdatadb.Q(sql)
            sql = 'DELETE FROM z_score_log_%s WHERE uid = %s;' % (str(uid)[-1], uid)
            newdatadb.Q(sql)
            newdatadb.close()
            md = mmysql("old_hongbao_data")
            sql = 'DELETE FROM zhuan_yxpopo_data.z_quest_user_%s WHERE uid = %s;' % (uid[-2:], uid)
            md.Q(sql)
            md.close()
            m = mmysql()
            sql = 'DELETE FROM z_user WHERE uid = %s;' % uid
            m.Q(sql)
            sql = 'DELETE FROM device_id_uid_appid_0 WHERE uid = %s;' % uid
            m.Q(sql)
            sql = 'DELETE FROM device_id_uid_appid_1 WHERE uid = %s;' % uid
            m.Q(sql)
            sql = 'DELETE FROM device_id_uid_appid_2 WHERE uid = %s;' % uid
            m.Q(sql)
            sql = 'DELETE FROM device_id_uid_appid_3 WHERE uid = %s;' % uid
            m.Q(sql)
            sql = 'DELETE FROM device_id_uid_appid_4 WHERE uid = %s;' % uid
            m.Q(sql)
            sql = 'DELETE FROM device_id_uid_appid_5 WHERE uid = %s;' % uid
            m.Q(sql)
            sql = 'DELETE FROM z_user_info_ex WHERE uid = %s;' % uid
            m.Q(sql)
            sql = 'DELETE FROM app_register_%s WHERE uid = %s;' % (str(uid)[-1], uid)
            m.Q(sql) 
            m.close()
            self.cacheUpdateUserInfo(uid,uinfo.device_id, 0)
            self.cacheUpdateUserInfo(uid,uinfo.device_id, 1)
            self.cacheUpdateUserInfo(uid,uinfo.device_id, 2)
            self.cacheUpdateUserInfo(uid,uinfo.device_id, 3)
            self.cacheUpdateUserInfo(uid,uinfo.device_id, 4)
            self.cacheUpdateUserInfo(uid,uinfo.device_id, 5)
            r = m_redis.get_instance()
            r.delete('_ZHUAN_U_L' + str(uid))
            r.delete('_ZHUAN_U_P' + str(uinfo.mobile)) 
            r.delete('_ZHUAN_U_I_B_D_I' + str(uinfo.device_id))
            r.delete('_ZHUAN_U_S_A_L_' + str(uid))
            self.cacheUpdateUserInfoWithApp(uid, 0)
            self.cacheUpdateUserInfoWithApp(uid, 1)
            self.cacheUpdateUserInfoWithApp(uid, 2)
            self.cacheUpdateUserInfoWithApp(uid, 3)
            self.cacheUpdateUserInfoWithApp(uid, 4)
            self.cacheUpdateUserInfoWithApp(uid, 5)
            # 绑定次数key
            bkey = "_ZHUAN_%s%s_%s" % ("ValidateBindNewPhone", "bindtime" + str(uid), str(datetime.date.today())[:7])
            r.delete(bkey)
            return True
        else:
            return False
Пример #35
0
    def delUserEx(self, pnum):
        print pnum
        if not re.findall("^[0-9]{11}$", str(pnum)):
            return False
        
        uinfo = self.getUserInfo(pnum)
        if uinfo and uinfo.uid:
            if not self.isTestUser(pnum):
                return False

            uid = str(uinfo.uid)
            print uid
            m = mmysql("old_hongbao")
            strDate = time.strftime('%Y%m%d%H%M%S')[2:]
            sql = "UPDATE z_verify_log SET device_id = concat(`device_id`, '-%s'), mobile = %s WHERE mobile = '%s';" % (strDate, strDate, uinfo.mobile)
            m.Q(sql)
            sql = "UPDATE z_push_ios SET device_id = concat(`device_id`, '-%s') WHERE uid = '%s';" % (strDate, uid)
            m.Q(sql)
            sql = "UPDATE z_user SET device_id = concat(`device_id`, '-%s'), pnum = '%s' WHERE uid = %s;" % (strDate, strDate, uid)
            m.Q(sql)
            m.close()
            newdatadb = mmysql(self.witchDb(uid))
            sql = "UPDATE z_score_log_%s SET device_id = concat(`device_id`, '-%s') WHERE uid = '%s';" % (str(uid)[-1], strDate, uid);
            newdatadb.Q(sql)
            newdatadb.close()
            m = mmysql()
            sql = "UPDATE z_user SET device_id = concat(`device_id`, '-%s'), pnum = %s WHERE uid = %s;" % (strDate, strDate, uid)
            m.Q(sql)
            sql = "UPDATE device_id_uid_appid_0 SET device_id = concat(`device_id`, '-%s') WHERE uid = %s;" % (strDate, uid)
            m.Q(sql)
            sql = "UPDATE device_id_uid_appid_1 SET device_id = concat(`device_id`, '-%s') WHERE uid = %s;" % (strDate, uid)
            m.Q(sql)
            sql = "UPDATE device_id_uid_appid_2 SET device_id = concat(`device_id`, '-%s') WHERE uid = %s;" % (strDate, uid)
            m.Q(sql)
            sql = "UPDATE device_id_uid_appid_3 SET device_id = concat(`device_id`, '-%s') WHERE uid = %s;" % (strDate, uid)
            m.Q(sql)
            sql = "UPDATE device_id_uid_appid_4 SET device_id = concat(`device_id`, '-%s') WHERE uid = %s;" % (strDate, uid)
            m.Q(sql)
            sql = "UPDATE device_id_uid_appid_5 SET device_id = concat(`device_id`, '-%s') WHERE uid = %s;" % (strDate, uid)
            m.Q(sql)
            sql = "UPDATE app_register_%s SET device_id = concat(`device_id`, '-%s') WHERE uid = %s;" % (str(uid)[-1], strDate, uid)
            m.Q(sql)
            m.close()
            self.cacheUpdateUserInfo(uid,uinfo.device_id, 0)
            self.cacheUpdateUserInfo(uid,uinfo.device_id, 1)
            self.cacheUpdateUserInfo(uid,uinfo.device_id, 2)
            self.cacheUpdateUserInfo(uid,uinfo.device_id, 3)
            self.cacheUpdateUserInfo(uid,uinfo.device_id, 4)
            self.cacheUpdateUserInfo(uid,uinfo.device_id, 5)
            r = m_redis.get_instance()
            r.delete('_ZHUAN_U_L' + str(uid))
            r.delete('_ZHUAN_U_P' + str(uinfo.mobile)) 
            r.delete('_ZHUAN_U_I_B_D_I' + str(uinfo.device_id))
            r.delete('_ZHUAN_U_S_A_L_' + str(uid))
            self.cacheUpdateUserInfoWithApp(uid, 0)
            self.cacheUpdateUserInfoWithApp(uid, 1)
            self.cacheUpdateUserInfoWithApp(uid, 2)
            self.cacheUpdateUserInfoWithApp(uid, 3)
            self.cacheUpdateUserInfoWithApp(uid, 4)
            self.cacheUpdateUserInfoWithApp(uid, 5)
            # 绑定次数key
            bkey = "_ZHUAN_%s%s_%s" % ("ValidateBindNewPhone", "bindtime" + str(uid), str(datetime.date.today())[:7])
            r.delete(bkey)
            return True
        else:
            return False