from hashlib import md5 import requests from ai.models import * import json from django.db.models import Q import datetime # 从BI的日常影片数据接口中获取信息 class MovieData: def __init__(self): self.salt = '53b22eda5938706a34fd9d44f097bec2' self.ts = str(int(datetime.datetime.timestamp(datetime.datetime.now()))) self.url = 'https://nation.bi.piao51.cn/nationDataApi/restful/boxoffice/nation/movieSupportData' # 从BI获取热度数据 def get_data_from_bi(self, movie_code, show_type): # 基本变量定义 today_str = datetime.datetime.today().strftime('%Y-%m-%d') # 当天日期字符串 movie_name = '' # 返回的影片名称,以BI返回为准 hot_title = '' # CSV表头 hot_data = '' # 数据部分 # 如果本地有则读取本地数据 today_obj = datetime.datetime.strptime(today_str, '%Y-%m-%d') if not MovieHotInfo.objects.filter(Q(movie_zz_code=movie_code) & Q(req_date=today_obj)).exists(): params = { 'movieCode': movie_code, 'timeStamp': self.ts, 'sign': self.sign(movie_code) } req = requests.get(self.url, params=params) # print(json.dumps(req.json(), indent=4)) req = req.json() if (req['success'] is True) and req['data']['movieInfo'] != '': # 基础数据 info = req['data']['movieInfo'] movie_name = info['movie_name'] daily = req['data']['movieDailyBox'] if MovieHotInfo.objects.filter(Q(movie_name=movie_name) & Q(req_date=today_str)).exists(): return '', '', '' # 生成标题 hot_info_list = ['影片名称', '想看数量', '鼎新热度指数'] hot_info_list.extend([f"{daily[n]['businessDate']}(销售)" for n in range(4, 6)]) hot_info_list.append(f"{daily[6]['businessDate']}(今日)") hot_info_list.extend([f"{daily[n]['businessDate']}(预售)" for n in range(7, 9)]) hot_title = f"{','.join(hot_info_list)}" # 生成热度指数 hot = int((self.to_number(info['xiaohongshu']) + self.to_number(info['shipinhao']) + self.to_number( info['douyin']) + self.to_number(info['weibo'])) / 10000) # 准备数据部分 data_list = [] for n in range(4, 6): data_list.append({'data': f"{daily[n]['businessDate']}(销售)", 'value': f"{daily[n]['boxRate']}%"}) data_list.append({'data': f"{daily[6]['businessDate']}(今日)", 'value': f"{daily[6]['boxRate']}%"}) for n in range(7, 9): data_list.append({'date': f"{daily[n]['businessDate']}(预售)", 'value': f"{daily[n]['boxRate']}%"}) # 写入数据 MovieHotInfo.objects.create( movie_zz_code=movie_code, movie_name=info['movie_name'], req_date=today_str, api_response=req, show_type=show_type, title=hot_title, wants=info['wish_num'], hots=hot, day1_val=daily[4]['boxRate'], day2_val=daily[5]['boxRate'], day3_val=daily[6]['boxRate'], day4_val=daily[7]['boxRate'], day5_val=daily[8]['boxRate'], day_data=json.dumps(data_list), ) return movie_name, hot_title, hot_data def sign(self, code): _pre = md5((self.salt + f"movieCode={code}&timeStamp={self.ts}").encode()).hexdigest() _sign = md5((_pre + self.salt).encode()).hexdigest() return _sign @staticmethod def to_number(num_str): if num_str == '--': return 0 if '万' in num_str: return int(float(num_str.replace('万', '')) * 10000) if '亿' in num_str: return int(float(num_str.replace('亿', '')) * 100000000) return 0