def checkBlacklist(ipAdress): ''' 封禁检查... ''' blackItem = database.getRedisData(ipAdress, 'blackList', doEval=True) if blackItem != None: return blackItem
def authorizer(osuid, otsuToken, path, needGroup=[], customInfo={}): def infoer(infoType): default = { 'invalid': '请求被拒绝,授权认证', 'group': '请求被拒绝,认证用户组权限不足', 'success': '请求已确认,授权认证' } cust = customInfo.get(infoType) if cust != None and cust != '': info = cust else: info = default.get(infoType) return info authorize, actionTime = database.getRedisData( osuid, 'userToken', doEval=True), utils.getTime(1) if authorize == None or authorize.get('otsuToken') != otsuToken: return infoer('invalid'), -1, {} groupStatus, privilege = userGroupChecker(needGroup, eval(authorize.get('group')), path) if groupStatus != True: return infoer('group'), -1, {} if authorize.get('otsuToken') == otsuToken: # pass and refresh token database.setUserOtsuToken(osuid, otsuToken, actionTime, expiresIn, user=None) privilege['osuid'] = osuid userObject = database.getUserByosuid(osuid) if userObject != None: privilege['osuname'] = userObject.osuname else: privilege['osuname'] = '未知' return infoer('success'), 1, privilege
def interceptorDo(ipAdress, rdbname='allApiRecord', banTime=300, criticalCount=70, cacheCycleS=5, apiName='*'): ''' 全局拦截器做什么(目前主要防水防火) Args: ipAdress (str): 客户机ip地址. rdbname (str): redis数据库[变量名] banTime (int): 封禁时长(s) criticalCount (int): 连续请求达到这个次数就封禁ip cacheCycleS (int): 几秒钟清除一次该ip的请求次数 apiName (str): 用来决定封禁的接口路径,如"*"表示全域封禁(该api全站),用具体api名称可以实现对某某ip使用某某接口的封禁 ''' ipCount = database.getRedisData(ipAdress, 'ipRecord') requestCount = database.getRedisData(ipAdress, rdbname) # only record ip++ if ipCount == None: database.setDataToRedis(ipAdress, 1, 'ipRecord') else: database.setDataToRedis(ipAdress, int(ipCount) + 1, 'ipRecord') # record ip and judge ban ip if requestCount == None: database.setDataToRedis(ipAdress, 1, rdbname, expireS=cacheCycleS) else: database.setDataToRedis(ipAdress, int(requestCount) + 1, rdbname, expireS=cacheCycleS) if int(requestCount) >= criticalCount: if int(requestCount) >= criticalCount * 7: banTime *= 12 * 24 * 180 elif int(requestCount) >= criticalCount * 5: banTime *= 12 * 24 * 90 elif int(requestCount) >= criticalCount * 3: banTime *= 12 * 24 elif int(requestCount) >= criticalCount * 2: banTime *= 12 database.addToBlacklist( ipAdress, reason= f'over {int(requestCount)} consecutive visits but not not rest.', blackTime=banTime, banFor=apiName)
def handleGetPlayerDataV1(data, info='获取osu!玩家信息', message='', status=-1): playerKey = data.get('playerKey') action = data.get('action') kt = data.get('keyType') data = {} if playerKey not in (None, ''): if database.getRedisData(f'{playerKey.lower()}apiV1Record', 'recordTimer') == None: res = getPlayerInfoWithApiv1(playerKey, keyType=kt) if res.get('status') != -1: database.setDataToRedis(f'{playerKey.lower()}apiV1Record', f'冷却中:{utils.getTime(1)}', 'recordTimer', expireS=dataRecordTimer) res = database.getPlayerApiV1Record(playerKey) if res != None: if type(res) == list: if len(res) > 1: repairDuplicateDataRecord(res) osuInfo = getPlayerInfoWithApiv1(playerKey, keyType=kt) if osuInfo.get('status') != -1: osuid = osuInfo.get('message').get('user_id') data, status = [ i.getDict for i in res if i.osuid == osuid ][0], 1 else: data, status = [i.getDict for i in res], 1 elif len(res) == 1: data, status = res[0].getDict, 1 else: data, status = res.getDict, 1 if status == 1: if action == 'simple': data = { 'osuid': data.get('osuid'), 'osuname': data.get('osuname'), 'pp': data.get('current', {}).get('pp_raw'), 'rank': data.get('current', {}).get('pp_rank'), 'country': data.get('current', {}).get('country') } if action == 'noHistory': data['history'] = [] return data, message, info, status
def handleGetPlayerPlusPP(data, info='获取玩家pp+记录', message='', status=-1): playerKey, action = data.get('playerKey'), data.get('action') kt = data.get('keyType') data = {} if playerKey not in (None, ''): if action == 'refresh': keyBackup = playerKey if database.getRedisData(f'{playerKey.lower()}plusPPrecord', 'recordTimer') == None: plusRes = utils.requestPlusPP(playerKey) if plusRes.get('status') == 1: plusInfo = plusRes.get('message') playerKey = plusInfo.get('osuid') database.savePlayerPlusPPInfo(plusInfo) database.setDataToRedis(f'{keyBackup.lower()}plusPPrecord', f'冷却中:{utils.getTime(1)}', 'recordTimer', expireS=dataRecordTimer) res = database.getPlayerPlusPPRecord(playerKey) if res != None: if type(res) == list: if len(res) > 1: repairDuplicateDataRecord(res) osuInfo = getPlayerInfoWithApiv1(playerKey, keyType=kt) if osuInfo.get('status') != -1: osuid = osuInfo.get('message').get('user_id') data, status = [ i.getDict for i in res if i.osuid == osuid ][0], 1 else: data, status = [i.getDict for i in res], 1 elif len(res) == 1: data, status = res[0].getDict, 1 else: data, status = res.getDict, 1 if status == -1: message = '如果失败了很有可能是因为没找到信息,请将action设为"refresh"进行数据更新' return data, message, info, status
def getSomething(key): return database.getRedisData(key, 'otherSomething')