dingxin_toolbox
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.
 
 
 

92 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(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