import requests import json import time from db_helper import HologresHelper, RedisHelper from config import set_config from log import Log config_ = set_config() log_ = Log() def request_post(request_url, request_data): """ post 请求 HTTP接口 :param request_url: 接口URL :param request_data: 请求参数 :return: res_data json格式 """ response = requests.post(url=request_url, json=request_data) if response.status_code == 200: res_data = json.loads(response.text) return res_data def filter_by_pseudo_exposure(app_type, mid, video_ids): """ 伪曝光过滤 :param app_type: 产品标识 type-int :param mid: 设备id type-string :param video_ids: 需过滤的视频列表 type-list :return: filtered_videos 过滤后的列表 type-list """ # 根据Redis缓存中的数据过滤 redis_helper = RedisHelper() # key拼接 key_name = '{}.{}.{}'.format(config_.PSEUDO_EXPOSURE_KEY_PREFIX, app_type, mid) pe_videos_list = redis_helper.get_data_from_set(key_name) if not pe_videos_list: return video_ids pe_videos = [eval(video) for video in pe_videos_list] filtered_videos = [video_id for video_id in video_ids if video_id not in pe_videos] return filtered_videos def filter_video_status(video_ids): """ 对视频状态进行过滤 :param video_ids: 视频id列表 type-list :return: filtered_videos """ st = time.time() sql = "SELECT video_id" \ "FROM {}" \ "WHERE audit_status = 5" \ "AND applet_rec_status IN (1, 6)" \ "-- AND open_status = 1" \ "-- AND payment_status = 0" \ "-- AND encryption_status != 5" \ "-- AND transcoding_status = 3" \ "AND video_id IN {};".format(config_.VIDEO_STATUS, tuple(video_ids)) hologres_helper = HologresHelper() data = hologres_helper.get_data(sql=sql) filtered_videos = [temp[0] for temp in data] et = time.time() log_.info('filter video status finished! filtered_videos = {}, execute time = {}ms'.format( filtered_videos, (et - st)*1000)) def filter_video_viewed(app_type, mid, uid, video_ids, types=(1,)): """ 调用后端接口过滤用户已观看视频 :param app_type: 产品标识 type-int :param mid: mid type-string :param uid: uid type-string :param video_ids: 视频id列表 type-list :param types: 过滤参数 type-tuple, 默认(1, ) 1-已观看 2-视频状态 3-是否进入老年人社区 4-话题状态 5-推荐状态 :return: filtered_videos """ # 调用http接口 request_data = {"appType": app_type, "mid": mid, "uid": uid, "types": list(types), "videoIds": video_ids} result = request_post(request_url=config_.VIDEO_FILTER_URL, request_data=request_data) if result['code'] != 0: log_.info('过滤失败,types: {}'.format(types)) return video_ids filtered_videos = result['data'] return filtered_videos if __name__ == '__main__': filter_video_status([1, 2, 3, 5978661])