赠加排片热度和场次占比数据作为提示词

main
rogersun 1 week ago
parent 431c706e57
commit fcb46e448d
  1. 2
      ai/tasks.py
  2. 45
      ai/utils/movie_data.py
  3. 19
      ai/utils/show_database.py
  4. 12
      ai/utils/show_func.py
  5. 71
      ai/utils/show_process.py
  6. 7
      ai/utils/show_prompt.py
  7. 12
      ai/utils/sql.py

@ -3,7 +3,7 @@ from ai.utils.show_process import show_main_process
from ai.utils.basic_func import clear_lock_func from ai.utils.basic_func import clear_lock_func
@shared_task @shared_task(time_limit=18*60, soft_time_limit=18*60)
def ai_show_general(): def ai_show_general():
clear_lock_func() clear_lock_func()
show_main_process() show_main_process()

@ -0,0 +1,45 @@
from hashlib import md5
import requests
import json
from datetime import datetime as dt
# 从BI的日常影片数据接口中获取信息
class MovieData:
def __init__(self):
self.salt = '53b22eda5938706a34fd9d44f097bec2'
self.ts = str(int(dt.timestamp(dt.now())))
self.url = 'https://nation.bi.piao51.cn/nationDataApi/restful/boxoffice/nation/movieSupportData'
def get_data(self, movie_code):
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))
r = ''
req = req.json()
if (req['success'] is True) and req['data']['movieInfo'] != '':
info = req['data']['movieInfo']
hot = f"{info['movie_name']}》 - 想看:{info['wish_num']},热度:小红书{info['xiaohongshu']}、视频号{info['shipinhao']}、抖音{info['douyin']}、微博{info['weibo']}"
print(hot)
daily = req['data']['movieDailyBox']
sales = [f"{daily[n]['businessDate']} {daily[n]['boxRate']}%" for n in range(0, 6)]
print(sales)
pre_sales = [f"{daily[n]['businessDate']} {daily[n]['boxRate']}%" for n in range(7, len(daily))]
print(pre_sales)
r = f"\t{hot}过去六天的票房占比:{''.join(sales)};今天到当前时间的票房占比:{daily[6]['boxRate']}%;未来7天的预售票房占比:{''.join(pre_sales)}"
print(r)
return r
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
if __name__ == '__main__':
md = MovieData()
md.get_data('001105582014')

@ -84,10 +84,14 @@ class GetData:
seconds=59) seconds=59)
end_datetime = datetime.datetime.strptime(date, '%Y-%m-%d') + datetime.timedelta(hours=6) end_datetime = datetime.datetime.strptime(date, '%Y-%m-%d') + datetime.timedelta(hours=6)
black_list = json.loads(TestCinema.objects.filter(zz_code=self.zz_code).first().user_config)['movie_black_list'] black_list = json.loads(TestCinema.objects.filter(zz_code=self.zz_code).first().user_config)['movie_black_list']
print(black_list) if len(black_list) > 0:
sql = GET_HANDLE_MOVIE + ','.join(['%s']*len(black_list)) + ');' sql = GET_HANDLE_MOVIE + ','.join(['%s'] * len(black_list)) + ');'
self.cur.execute(sql, (start_datetime, end_datetime, *black_list)) self.cur.execute(sql, (start_datetime, end_datetime, *black_list))
# print(self.cur.mogrify(sql, (start_datetime, end_datetime, *black_list))) print(self.cur.mogrify(sql, (start_datetime, end_datetime, *black_list)))
else:
sql = GET_HANDLE_MOVIE + '\' \'' + ');'
self.cur.execute(sql, (start_datetime, end_datetime))
print(self.cur.mogrify(sql, (start_datetime, end_datetime)))
available_movie = self.cur.fetchall() available_movie = self.cur.fetchall()
available_movie_list = [ available_movie_list = [
f"\t{m['cinema_movie_alias']}》 - 影片id:{m['cinema_movie_id']},影片时长:{m['cinema_movie_time']},语言:{m['language']},制式:{m['media_type']}, 最早排片开始时间:{m['cinema_movie_start_datetime']}, 最晚排片截止时间:{m['cinema_movie_end_datetime']}" f"\t{m['cinema_movie_alias']}》 - 影片id:{m['cinema_movie_id']},影片时长:{m['cinema_movie_time']},语言:{m['language']},制式:{m['media_type']}, 最早排片开始时间:{m['cinema_movie_start_datetime']}, 最晚排片截止时间:{m['cinema_movie_end_datetime']}"
@ -142,3 +146,10 @@ class GetData:
def get_media_type(self): def get_media_type(self):
self.cur.execute(GET_HALL_MEDIA_TYPE) self.cur.execute(GET_HALL_MEDIA_TYPE)
def get_movie_info(self, date):
start_datetime = datetime.datetime.strptime(date, '%Y-%m-%d') + datetime.timedelta(hours=29, minutes=59,
seconds=59)
end_datetime = datetime.datetime.strptime(date, '%Y-%m-%d') + datetime.timedelta(hours=6)
self.cur.execute(GET_MOVIE_INFO, (start_datetime, end_datetime))
return self.cur.fetchall()

@ -3,6 +3,7 @@ import datetime
from ai.models import * from ai.models import *
from ai.utils.show_database import GetData from ai.utils.show_database import GetData
from ai.utils.datetime_format import * from ai.utils.datetime_format import *
from ai.utils.movie_data import *
def get_cinema_show_result_func(_zz_code, _show_date): def get_cinema_show_result_func(_zz_code, _show_date):
@ -58,3 +59,14 @@ def get_template_show(cinema, show_date):
temp_show = data.get_show_data(temp_start, temp_end) temp_show = data.get_show_data(temp_start, temp_end)
print('get_template_show', temp_date, temp_show) print('get_template_show', temp_date, temp_show)
return temp_show, temp_date return temp_show, temp_date
def get_all_movie_hot_info(cinema, show_date):
data = GetData(cinema)
movie = data.get_movie_info(show_date)
movie_data = MovieData()
movie_info_list = []
for m in movie:
print(m)
movie_info_list.append(movie_data.get_data(m['cinema_movie_num']))
return movie_info_list

@ -33,19 +33,43 @@ def show_main_process(zz_code=None):
template_show, template_date = get_template_show(cinema, show_date) template_show, template_date = get_template_show(cinema, show_date)
prompt = show_ai.general_prompt() prompt = show_ai.general_prompt()
start = datetime.datetime.now() # 开始计时 start = datetime.datetime.now() # 开始计时
result, message, tokens = show_ai.get_show_result_ai() # result, message, tokens = show_ai.get_show_result_ai()
end = datetime.datetime.now() # 结束计时 # end = datetime.datetime.now() # 结束计时
print('prompt:', prompt) # print('prompt:', prompt)
print('result:', result) # print('result:', result)
print('message:', message) # print('message:', message)
print('tokens:', tokens) # print('tokens:', tokens)
# 获取排片数据 # # 获取排片数据
result_obj = json.loads(result) # result_obj = json.loads(result)
# 预测排片数据 # # 预测排片数据
_show = result_obj['show'].replace('```', '').replace('csv', '').strip() # _show = result_obj['show'].replace('```', '').replace('csv', '').strip()
# 预测销售数据 # # 预测销售数据
_sales = str(result_obj['income']).strip() # _sales = str(result_obj['income']).strip()
# # 方式一 #
# # 处理返回结果
# try:
# AiShow.objects.create(
# cinema=cinema.name,
# zz_code=cinema.zz_code,
# show_date=show_date,
# is_ai_show=True,
# template = template_show,
# temp_date=template_date,
# show=_show,
# sales=_sales,
# prompt=prompt,
# result=result,
# message=message,
# take_times=int((end - start).seconds),
# take_tokens=tokens,
# prompt_version=prompt_ver,
# )
# except Exception as e:
# print(e)
return True
# # 方式一
# _show = next((s for s in result.split('------') if s.startswith('\n影厅别名,影厅id')), '') # _show = next((s for s in result.split('------') if s.startswith('\n影厅别名,影厅id')), '')
# _show = _show.strip() # _show = _show.strip()
# # 方式二 # # 方式二
@ -64,24 +88,3 @@ def show_main_process(zz_code=None):
# _sales = next((s for s in result.split('\n') if re.search(r'\d{3,6}元', s)), '') # _sales = next((s for s in result.split('\n') if re.search(r'\d{3,6}元', s)), '')
# _sales = str(re.findall(r'\d{3,6}元', _sales)[-1]) # _sales = str(re.findall(r'\d{3,6}元', _sales)[-1])
# print('_sales:', _sales) # print('_sales:', _sales)
# 处理返回结果
try:
AiShow.objects.create(
cinema=cinema.name,
zz_code=cinema.zz_code,
show_date=show_date,
is_ai_show=True,
template = template_show,
temp_date=template_date,
show=_show,
sales=_sales,
prompt=prompt,
result=result,
message=message,
take_times=int((end - start).seconds),
take_tokens=tokens,
prompt_version=prompt_ver,
)
except Exception as e:
print(e)
return True

@ -2,6 +2,7 @@ from django.db.models import Q
from ai.models import PromptTemplate from ai.models import PromptTemplate
from ai.utils.show_database import GetData from ai.utils.show_database import GetData
from ai.utils.datetime_format import (get_data_datetime, get_date_type) from ai.utils.datetime_format import (get_data_datetime, get_date_type)
from ai.utils.show_func import get_all_movie_hot_info
import datetime import datetime
import random import random
import json import json
@ -65,6 +66,12 @@ class ShowAI:
f'\t{h}' for h in free_hall)) # 处理不可排片影厅 f'\t{h}' for h in free_hall)) # 处理不可排片影厅
prompt_list.append(movie_hall) prompt_list.append(movie_hall)
# 影片热度和排片占比
movie_hot = PromptTemplate.objects.filter(
Q(del_flag=False) & Q(prompt_type='show') & Q(prompt_key='Hot')).first().prompt_val # 获取提示词模板
movie_hot = movie_hot.replace('{movie_hot}', '\n'.join(get_all_movie_hot_info(self.cinema, self.show_date)))
prompt_list.append(movie_hot)
# 处理具体要求 # 处理具体要求
rules = PromptTemplate.objects.filter( rules = PromptTemplate.objects.filter(
Q(del_flag=False) & Q(prompt_type='show') & Q(prompt_key='Rules')).first().prompt_val # 获取提示词模板 Q(del_flag=False) & Q(prompt_type='show') & Q(prompt_key='Rules')).first().prompt_val # 获取提示词模板

@ -111,6 +111,7 @@ WHERE scvm.system_const_sub_module = 'new_media_type'
# 获取指定日期的可用于排片的影片 # 获取指定日期的可用于排片的影片
GET_HANDLE_MOVIE = f""" GET_HANDLE_MOVIE = f"""
SELECT cmi.cinema_movie_alias, SELECT cmi.cinema_movie_alias,
cmi.cinema_movie_num,
cmi.cinema_movie_id, cmi.cinema_movie_id,
cmi.cinema_movie_time, cmi.cinema_movie_time,
cmlt.cinema_movie_lang_type_desc as language, cmlt.cinema_movie_lang_type_desc as language,
@ -198,3 +199,14 @@ FROM (
AND ms.cinema_del_flag = 1 AND ms.cinema_del_flag = 1
AND NOT (ms.cinema_movie_show_sold_num = 0 AND ms.cinema_movie_show_status <> 1)) md AND NOT (ms.cinema_movie_show_sold_num = 0 AND ms.cinema_movie_show_status <> 1)) md
""" """
# 获取指定日期的可用于排片的影片
GET_MOVIE_INFO = f"""
SELECT cmi.cinema_movie_cn_name,
cmi.cinema_movie_num
FROM cinema_movie_info cmi
WHERE cmi.cinema_movie_start_datetime <= %s
AND cmi.cinema_movie_end_datetime > %s
GROUP BY cmi.cinema_movie_num;
"""
Loading…
Cancel
Save