ad_no_ad_videos_update.py 4.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import datetime
  2. import json
  3. import traceback
  4. from my_utils import RedisHelper, data_check, get_feature_data, send_msg_to_feishu_new
  5. from my_config import set_config
  6. from log import Log
  7. config_, _ = set_config()
  8. log_ = Log()
  9. def top_n_videos_update(dt):
  10. """更新各端的topN视频"""
  11. top_n_videos = {}
  12. # 获取topN数据
  13. top_n_videos_project = config_.no_ad_videos['topN'].get('project')
  14. top_n_videos_table = config_.no_ad_videos['topN'].get('table')
  15. n_list = config_.no_ad_videos['topN'].get('n_list')
  16. top_n_videos_features = [
  17. 'apptype', 'videoid', 'rank'
  18. ]
  19. data_count = data_check(project=top_n_videos_project, table=top_n_videos_table, dt=dt)
  20. if data_count > 0:
  21. top_n_videos_df = get_feature_data(project=top_n_videos_project, table=top_n_videos_table,
  22. features=top_n_videos_features, dt=dt)
  23. top_n_videos_df['videoid'] = top_n_videos_df['videoid'].astype(int)
  24. top_n_videos_df['rank'] = top_n_videos_df['rank'].astype(int)
  25. app_type_list = list(set(top_n_videos_df['apptype'].tolist()))
  26. for app_type in app_type_list:
  27. app_type_df = top_n_videos_df[top_n_videos_df['apptype'] == app_type]
  28. app_type_item = {}
  29. for n in n_list:
  30. n_df = app_type_df[app_type_df['rank'] <= n]
  31. n_videos = list(n_df['videoid'].tolist())
  32. app_type_item[f'top{n}'] = n_videos
  33. top_n_videos[app_type] = app_type_item
  34. return top_n_videos
  35. def update_to_redis(no_ad_videos_mapping_list):
  36. """分端合并数据,更新到redis"""
  37. redis_data = {}
  38. for no_ad_videos_mapping in no_ad_videos_mapping_list:
  39. for app_type, item in no_ad_videos_mapping.items():
  40. if app_type not in redis_data:
  41. redis_data[app_type] = item
  42. else:
  43. for k, val in item.items():
  44. redis_data[app_type][k] = val
  45. # to redis
  46. no_ad_app_type_list = []
  47. redis_helper = RedisHelper()
  48. for app_type, data in redis_data.items():
  49. key_name = f"{config_.KEY_NAME_PREFIX_NO_AD_VIDEOS}{app_type}"
  50. redis_helper.set_data_to_redis(key_name=key_name, value=json.dumps(data), expire_time=int(24*3600))
  51. log_.info(f"to redis: app_type={app_type}, data={data}, key_name={key_name}")
  52. no_ad_app_type_list.append(int(app_type))
  53. # 此次无符合要求数据的app_type清空对应数据
  54. for _, app_type in config_.APP_TYPE.items():
  55. if app_type not in no_ad_app_type_list:
  56. key_name = f"{config_.KEY_NAME_PREFIX_NO_AD_VIDEOS}{app_type}"
  57. redis_helper.del_keys(key_name=key_name)
  58. log_.info(f"del from redis: app_type={app_type}, key_name={key_name}")
  59. def main():
  60. try:
  61. now_date = datetime.datetime.today()
  62. dt = datetime.datetime.strftime(now_date, '%Y%m%d%H')
  63. log_.info(f"now_date: {dt}")
  64. # 当小时分享当小时回流topN视频更新
  65. top_n_videos = top_n_videos_update(dt=dt)
  66. log_.info(f"topN: {top_n_videos}")
  67. # 数据更新至redis
  68. no_ad_videos_mapping_list = [top_n_videos]
  69. update_to_redis(no_ad_videos_mapping_list=no_ad_videos_mapping_list)
  70. log_.info(f"to redis finished!")
  71. except Exception as e:
  72. log_.error(f"特定视频不出广告数据更新失败, exception: {e}, traceback: {traceback.format_exc()}")
  73. msg_list = [
  74. f"env: rov-offline {config_.ENV_TEXT}",
  75. f"now time: {datetime.datetime.strftime(datetime.datetime.now(), '%Y%m%d %H:%M:%S')}",
  76. f"exception: {e}",
  77. f"traceback: {traceback.format_exc()}",
  78. ]
  79. send_msg_to_feishu_new(
  80. webhook=config_.FEISHU_ROBOT['ad_video_update_robot'].get('webhook'),
  81. key_word=config_.FEISHU_ROBOT['ad_video_update_robot'].get('key_word'),
  82. title='特定视频不出广告数据更新失败',
  83. msg_list=msg_list
  84. )
  85. if __name__ == '__main__':
  86. main()