You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
4.1 KiB
91 lines
4.1 KiB
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
|
|
|