|
|
|
|
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(req.request.url)
|
|
|
|
|
# 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
|