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
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)
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))
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
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
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
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
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)
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)
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)
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
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
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
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
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 生成失败!")
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
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)
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
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)
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
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)
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)
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)
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)
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()
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
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
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
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))
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)
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
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
def cacheUpdateUserInfoWithApp(self, uid, app_id): m_redis.get_instance().delete(self._appIdCacheKey(uid, app_id))
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
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