# -*- coding: utf-8 -*-
# @Author: luojunhui
# @Time: 2023/10/13
import json
import os
import random
import sys
import time
import requests
from hashlib import md5
from datetime import datetime

from common.mq import MQ

sys.path.append(os.getcwd())
from common.common import Common
from common.scheduling_db import MysqlHelper
from common.public import get_config_from_mysql, download_rule

proxies = {"http": None, "https": None}


def clean_title(strings):
    return (
        strings.strip()
        .replace("\n", "")
        .replace("/", "")
        .replace("\r", "")
        .replace("#", "")
        .replace(".", "。")
        .replace("\\", "")
        .replace("&NBSP", "")
        .replace(":", "")
        .replace("*", "")
        .replace("？", "")
        .replace("?", "")
        .replace('"', "")
        .replace("<", "")
        .replace(">", "")
        .replace("|", "")
        .replace(" ", "")
        .replace('"', "")
        .replace("'", "")
    )


class ZFZLNRRYJXScheduling:
    def __init__(self, log_type, crawler, rule_dict, env, our_uid):
        self.platform = "祝福中老年人如意吉祥"
        self.log_type = log_type
        self.crawler = crawler
        self.rule_dict = rule_dict
        self.env = env
        self.our_uid = our_uid
        self.mq = MQ(topic_name="topic_crawler_etl_" + self.env)
        self.download_count = 0

    def repeat_video(self, video_id):
        sql = f""" select * from crawler_video where platform in ("{self.crawler}","{self.platform}") and out_video_id="{video_id}"; """
        repeat_video = MysqlHelper.get_values(
            self.log_type, self.crawler, sql, self.env
        )
        return len(repeat_video)

    # 获取视频id_list
    def get_videoList(self, page_id):
        time.sleep(random.randint(5, 10))
        url = "https://api.newboqing.top/index.php?s=mobile/Video/getList&cid=1&page={}&api_version=4&appid=wx65490b687b7c9892&version=1.9.0&env_version=release&scene=1053".format(
            page_id)
        headers = {
            "Host": "api.newboqing.top",
            # "ik": "b326b5062b2f0e69046810717534cb09",
            "xweb_xhr": "1",
            "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36 MicroMessenger/6.8.0(0x16080000) NetType/WIFI MiniProgramEnv/Mac MacWechat/WMPF XWEB/30817",
            # "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE2OTc1MjE0NTMsIm5iZiI6MTY5NzUyMTQ1MywiZXhwIjoxNjk3NTI4NjUzLCJkYXRhIjp7InVzZXJfaWQiOjI1MDQyOTA3fX0.6ciuWEa3MyKATfmo28Sv3auFS8kpjsNqvpnXTKPIvfs",
            "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE2OTc1MjE0NTMsIm5iZiI6MTY5NzUyMTQ1MywiZXhwIjoxNjk3NTI4NjUzLCJkYXRhIjp7InVzZXJfaWQiOjI1MDQyOTA3fX0.6ciuWEa3MyKATfmo28Sv3auFS8kpjsNqvpnXTKPIvfs",
            "Content-Type": "application/json",
            "Accept": "*/*",
            "Referer": "https://servicewechat.com/wx65490b687b7c9892/9/page-frame.html",
            "Accept-Language": "en",
        }
        # data = {
        #     "time": "1696991482000",
        #     "str_data": "A7ZHUDdb",
        #     "page": str(page_id),
        #     "limit": str(page_limit),
        #     "appid": "wx742465c143d1bd2b",
        #     # wx742465c143d1bd2b
        #     "version": "1.4.2",
        #     "openid": "ogEOH5cHAMpi8qrWle_vjtaqT6zw",
        # }
        response = requests.post(url, headers=headers)
        if "data" not in response.text or response.status_code != 200:
            Common.logger(self.log_type, self.crawler).info(
                f"get_videoList:{response.text}\n"
            )
            Common.logging(
                self.log_type,
                self.crawler,
                self.env,
                f"get_videoList:{response.text}\n",
            )
            return
        elif len(response.json()["data"]["list"]) == 0:
            Common.logger(self.log_type, self.crawler).info(f"没有更多数据啦~\n")
            Common.logging(self.log_type, self.crawler, self.env, f"没有更多数据啦~\n")
            return
        elif len(response.json()["msg"]) == "未登录":
            Common.logger(self.log_type, self.crawler).info(f"token 过期啦~\n")
            Common.logging(self.log_type, self.crawler, self.env, f"token 过期啦~\n")
            return
        else:
            data_list = response.json()["data"]["list"]
            for video_obj in data_list:
                try:
                    self.process_video_obj(video_obj)
                except Exception as e:
                    Common.logger(self.log_type, self.crawler).error(f"抓取单条视频异常:{e}\n")
                    Common.logging(
                        self.log_type, self.crawler, self.env, f"抓取单条视频异常:{e}\n"
                    )

    def process_video_obj(self, video_obj):
        # print(type(video_obj))
        video_id = video_obj.get("id", 0)
        video_title = clean_title(video_obj.get("title", "no title"))
        video_time = video_obj.get("v_time", 0)
        publish_time_stamp = int(time.time())
        # date_object = datetime.strptime(publish_time_stamp, "%Y-%m-%d")
        # publish_time_stamp = int(time.mktime(date_object.timetuple()))
        publish_time_str = time.strftime(
            "%Y-%m-%d %H:%M:%S", time.localtime(publish_time_stamp)
        )
        user_name = ""
        video_dict = {
            "video_title": video_title,
            "video_id": video_id,
            "duration": video_time,
            "play_cnt": video_obj.get("visited", 0),
            "like_cnt": 0,
            "comment_cnt": 0,
            "share_cnt": video_obj.get("shared", 0),
            "user_name": user_name,
            "publish_time_stamp": publish_time_stamp,
            "publish_time_str": publish_time_str,
            "video_width": 0,
            "video_height": 0,
            "profile_id": 0,
            "profile_mid": 0,
            # "cover_url": "",
            "session": f"zhufuzhonglaonianrenruyijixiang-{int(time.time())}",
        }
        for k, v in video_dict.items():
            Common.logger(self.log_type, self.crawler).info(f"{k}:{v}")
        Common.logging(
            self.log_type, self.crawler, self.env, f"{video_dict}"
        )
        # 过滤无效视频
        if video_title == "" or video_dict["video_id"] == "":
            Common.logger(self.log_type, self.crawler).info("无效视频\n")
            Common.logging(self.log_type, self.crawler, self.env, "无效视频\n")
            # 抓取基础规则过滤
        elif (
                download_rule(
                    log_type=self.log_type,
                    crawler=self.crawler,
                    video_dict=video_dict,
                    rule_dict=self.rule_dict,
                )
                is False
        ):
            Common.logger(self.log_type, self.crawler).info("不满足抓取规则\n")
            Common.logging(
                self.log_type, self.crawler, self.env, "不满足抓取规则\n"
            )
        elif (
                any(
                    str(word)
                    if str(word) in video_dict["video_title"]
                    else False
                    for word in get_config_from_mysql(
                        log_type=self.log_type,
                        source=self.crawler,
                        env=self.env,
                        text="filter",
                        action="",
                    )
                )
                is True
        ):
            Common.logger(self.log_type, self.crawler).info("已中过滤词\n")
            Common.logging(self.log_type, self.crawler, self.env, "已中过滤词\n")
        elif self.repeat_video(video_dict["video_id"]) != 0:
            Common.logger(self.log_type, self.crawler).info("视频已下载\n")
            Common.logging(self.log_type, self.crawler, self.env, "视频已下载\n")
        else:
            # out_video_id = md5(video_title.encode('utf8')).hexdigest()
            # out_user_id = md5(user_name.encode('utf8')).hexdigest()
            video_dict["out_user_id"] = video_dict["profile_id"]
            video_dict["platform"] = self.crawler
            video_dict["strategy"] = self.log_type
            video_dict["out_video_id"] = str(video_dict["video_id"])
            video_dict["width"] = video_dict["video_width"]
            video_dict["height"] = video_dict["video_height"]
            video_dict["crawler_rule"] = json.dumps(self.rule_dict)
            video_dict["user_id"] = self.our_uid
            video_dict["publish_time"] = video_dict["publish_time_str"]
            video_dict["video_url"] = video_obj['video_url']
            video_dict["avatar_url"] = video_obj['end_cover']
            video_dict["cover_url"] = video_obj['video_cover']
            # print(json.dumps(video_dict, ensure_ascii=False, indent=4))
            self.download_count += 1
            self.mq.send_msg(video_dict)


if __name__ == "__main__":
    ZL = ZFZLNRRYJXScheduling(
        log_type="recommend",
        crawler="zfzlnrjxry",
        rule_dict={},
        our_uid="luojunhuihaoshuai",
        env="dev"
    )
    for i in range(4):
        ZL.get_videoList(page_id=i + 1)
        print(ZL.download_count)
