Sfoglia il codice sorgente

提交新的看一看的脚本

wangkun 3 anni fa
parent
commit
609cf71637

+ 1 - 0
README.md

@@ -0,0 +1 @@
+看一看+小程序爬虫

+ 3 - 0
chlsfiles/__init__.py

@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+# @Author: wangkun
+# @Time: 2022/4/18

+ 3 - 0
logs/__init__.py

@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+# @Author: wangkun
+# @Time: 2022/4/18

+ 3 - 0
main/__init__.py

@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+# @Author: wangkun
+# @Time: 2022/4/18

+ 258 - 0
main/common.py

@@ -0,0 +1,258 @@
+# -*- coding: utf-8 -*-
+# @Author: wangkun
+# @Time: 2022/4/18
+
+"""
+公共方法,包含:生成log / 删除log / 获取session  / 下载方法 / 读取文件 / 统计下载数
+"""
+import json
+from datetime import date, timedelta
+import datetime
+import logging
+import os
+import time
+import requests
+import urllib3
+
+
+class Common:
+    # 统一获取当前时间 <class 'datetime.datetime'>  2022-04-14 20:13:51.244472
+    now = datetime.datetime.now()
+    # 昨天 <class 'str'>  2022-04-13
+    yesterday = (date.today() + timedelta(days=-1)).strftime("%Y-%m-%d")
+    # 今天 <class 'datetime.date'>  2022-04-14
+    today = date.today()
+    # 明天 <class 'str'>  2022-04-15
+    tomorrow = (date.today() + timedelta(days=1)).strftime("%Y-%m-%d")
+
+    @staticmethod
+    def crawler_log():
+        """
+        生成 log 日志
+        """
+        # 日志路径
+        log_dir = "./logs/"
+        log_path = os.getcwd() + os.sep + log_dir
+        if not os.path.isdir(log_path):
+            os.makedirs(log_path)
+
+        # 日志参数
+        log_format = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
+        date_format = "%Y-%m-%d %p %H:%M:%S"
+        log_name = time.strftime("%Y-%m-%d", time.localtime(time.time())) + '.log'
+
+        # 日志初始化
+        logging.basicConfig(filename=log_path + log_name, level=logging.INFO, format=log_format, datefmt=date_format)
+        crawler_logger = logging.getLogger("crawler-log")
+
+        return crawler_logger
+
+    @classmethod
+    def del_logs(cls):
+        """
+        清除冗余日志文件
+        :return: 保留最近 7 个日志
+        """
+        log_dir = "./logs/"
+        all_files = sorted(os.listdir(log_dir))
+        all_logs = []
+        for log in all_files:
+            name = os.path.splitext(log)[-1]
+            if name == ".log":
+                all_logs.append(log)
+
+        if len(all_logs) <= 7:
+            pass
+        else:
+            for file in all_logs[:len(all_logs) - 7]:
+                os.remove(log_dir + file)
+        cls.crawler_log().info("清除冗余日志成功")
+
+    # 删除 charles 缓存文件,只保留最近的两个文件
+    @classmethod
+    def del_charles_files(cls):
+        # 目标文件夹下所有文件
+        all_file = sorted(os.listdir("./chlsfiles/"))
+        for file in all_file[0:-2]:
+            os.remove("./chlsfiles/" + file)
+
+    @classmethod
+    def download_method(cls, text, d_name, d_url):
+        """
+        下载封面:text == "cover" ; 下载视频:text == "video"
+        需要下载的视频标题:d_title
+        视频封面,或视频播放地址:d_url
+        下载保存路径:"./files/{d_title}/"
+        """
+        # 首先创建一个保存该视频相关信息的文件夹
+        video_dir = "./videos/" + d_name + "/"
+        if not os.path.exists(video_dir):
+            os.mkdir(video_dir)
+
+        # 下载视频
+        if text == "video":
+            # 需要下载的视频地址
+            video_url = d_url
+            # 视频名
+            video_name = "video.mp4"
+
+            # 下载视频
+            urllib3.disable_warnings()
+            response = requests.get(video_url, stream=True, verify=False)
+            try:
+                with open(video_dir + video_name, "wb") as f:
+                    for chunk in response.iter_content(chunk_size=10240):
+                        f.write(chunk)
+                cls.crawler_log().info("==========视频下载完成==========")
+            except Exception as e:
+                cls.crawler_log().info("视频下载失败:{}".format(e))
+
+        # 下载封面
+        elif text == "cover":
+            # 需要下载的封面地址
+            cover_url = d_url
+            # 封面名
+            cover_name = "image.jpg"
+
+            # 下载封面
+            urllib3.disable_warnings()
+            response = requests.get(cover_url, verify=False)
+            try:
+                with open(video_dir + cover_name, "wb") as f:
+                    f.write(response.content)
+                cls.crawler_log().info("==========封面下载完成==========")
+            except Exception as e:
+                cls.crawler_log().info("封面下载失败:{}".format(e))
+
+    @staticmethod
+    def read_txt(t_name):
+        """
+        读取 txt 文件
+        :param t_name: 文件名
+        :return: 文件内容
+        """
+        with open("./txt/" + t_name, "r", encoding="utf8") as f:
+            return f.readlines()
+
+    @classmethod
+    def get_session(cls):
+        # charles 抓包文件保存目录
+        charles_file_dir = "./chlsfiles/"
+
+        if int(len(os.listdir(charles_file_dir))) == 1:
+            Common.crawler_log().info("未找到chlsfile文件,等待60s")
+            time.sleep(60)
+        else:
+            # 目标文件夹下所有文件
+            all_file = sorted(os.listdir(charles_file_dir))
+
+            # 获取到目标文件
+            old_file = all_file[-1]
+
+            # 分离文件名与扩展名
+            new_file = os.path.splitext(old_file)
+
+            # 重命名文件后缀
+            os.rename(os.path.join(charles_file_dir, old_file),
+                      os.path.join(charles_file_dir, new_file[0] + ".txt"))
+
+            try:
+                with open(charles_file_dir + new_file[0] + ".txt", encoding='utf-8-sig', errors='ignore') as f:
+                    contents = json.load(f, strict=False)
+                if "search.weixin.qq.com" in [text['host'] for text in contents]:
+                    for text in contents:
+                        if text["host"] == "search.weixin.qq.com" \
+                                and text["path"] == "/cgi-bin/recwxa/recwxagetunreadmessagecnt":
+                            sessions = text["query"].split("session=")[-1].split("&wxaVersion=")[0]
+                            if "&vid" in sessions:
+                                session = sessions.split("&vid")[0]
+                                return session
+                            elif "&offset" in sessions:
+                                session = sessions.split("&offset")[0]
+                                return session
+                            elif "&wxaVersion" in sessions:
+                                session = sessions.split("&wxaVersion")[0]
+                                return session
+                            elif "&limit" in sessions:
+                                session = sessions.split("&limit")[0]
+                                return session
+                            elif "&scene" in sessions:
+                                session = sessions.split("&scene")[0]
+                                return session
+                            elif "&count" in sessions:
+                                session = sessions.split("&count")[0]
+                                return session
+                            elif "&channelid" in sessions:
+                                session = sessions.split("&channelid")[0]
+                                return session
+                            elif "&subscene" in sessions:
+                                session = sessions.split("&subscene")[0]
+                                return session
+                            elif "&clientVersion" in sessions:
+                                session = sessions.split("&clientVersion")[0]
+                                return session
+                            elif "&sharesearchid" in sessions:
+                                session = sessions.split("&sharesearchid")[0]
+                                return session
+                            elif "&nettype" in sessions:
+                                session = sessions.split("&nettype")[0]
+                                return session
+                            elif "&switchprofile" in sessions:
+                                session = sessions.split("&switchprofile")[0]
+                                return session
+                            elif "&switchnewuser" in sessions:
+                                session = sessions.split("&switchnewuser")[0]
+                                return session
+                            else:
+                                return sessions
+                else:
+                    cls.crawler_log().info("未找到 session,10s后重新获取")
+                    time.sleep(10)
+                    cls.get_session()
+            except Exception as e:
+                cls.crawler_log().info("获取 session 异常,30s后重试:{}".format(e))
+                time.sleep(30)
+                cls.get_session()
+
+    @classmethod
+    def kanyikan_download_count(cls):
+        videoid_path = "./txt/kanyikan_videoid.txt"
+        count = 0
+        for count, line in enumerate(open(videoid_path, "rb").readlines()):
+            count += 1
+        cls.crawler_log().info('累计下载视频数: {}\n'.format(count))
+
+    @classmethod
+    def kanyikan_today_download_count(cls):
+        """
+        统计快手渠道当日下载视频数
+        :return:
+        """
+        # 创建空文件
+        with open("./txt/" + str(cls.today) + "_kanyikan_videoid.txt", "a") as f:
+            f.write("")
+        videoid_path = "./txt/" + str(cls.today) + "_kanyikan_videoid.txt"
+        count = 0
+        for count, line in enumerate(open(videoid_path, "rb").readlines()):
+            count += 1
+        return count
+
+    @classmethod
+    def del_yesterday_kanyikan_videoid_txt(cls):
+        """
+        删除快手渠道昨日下载视频数的 txt 文件
+        :return:
+        """
+        yesterday_kanyikan_videoid_txt_dir = "./txt/"
+        all_files = sorted(os.listdir(yesterday_kanyikan_videoid_txt_dir))
+        for file in all_files:
+            name = os.path.splitext(file)[0]
+            if name == cls.yesterday + "_kanyikan_videoid":
+                os.remove(yesterday_kanyikan_videoid_txt_dir + file)
+        Common.crawler_log().info("删除快手昨天下载统计文件成功")
+
+
+if __name__ == "__main__":
+    common = Common()
+    common.del_yesterday_kanyikan_videoid_txt()
+    print(common.kanyikan_today_download_count())

+ 122 - 0
main/download_play.py

@@ -0,0 +1,122 @@
+# -*- coding: utf-8 -*-
+# @Author: wangkun
+# @Time: 2022/4/18
+
+"""
+下载并上传:播放量视频
+"""
+import os
+import sys
+
+sys.path.append(os.getcwd())
+from main.common import Common
+from main.get_feeds import get_feeds
+from main.publish import Publish
+
+
+class DownloadPlay:
+
+    @staticmethod
+    def play_rule(play_width, play_height, play_duration, play_play_cnt):
+        """
+        1.分辨率,宽或者高 >= 720 or ==0
+        2.600s >= 时长 >= 60s
+        3.视频播放量 >= 150000
+        """
+        if int(play_width) >= 720 or int(play_height) >= 720 or play_width == "0" or play_height == "0":
+            if 600 >= int(play_duration) >= 60:
+                if int(play_play_cnt) >= 150000:
+                    return True
+                else:
+                    return False
+            else:
+                return False
+        else:
+            return False
+
+    @classmethod
+    def download_play_video(cls, env):
+        """
+        下载播放量视频
+        测试环境:env == dev
+        正式环境:env == prod
+        """
+        videos = Common.read_txt("kanyikan_feeds.txt")
+        for video in videos:
+            download_video_id = video.strip().split(" + ")[1]
+            download_video_title = video.strip().split(" + ")[3]
+            download_video_duration = video.strip().split(" + ")[4]
+            download_video_play_cnt = video.strip().split(" + ")[2]
+            download_video_comment_cnt = video.strip().split(" + ")[5]
+            download_video_like_cnt = video.strip().split(" + ")[6]
+            download_video_share_cnt = video.strip().split(" + ")[7]
+            download_video_resolution = video.strip().split(" + ")[8]
+            download_video_width = download_video_resolution.split("*")[0]
+            download_video_height = download_video_resolution.split("*")[-1]
+            download_video_send_time = video.strip().split(" + ")[9]
+            download_user_name = video.strip().split(" + ")[10]
+            download_head_url = video.strip().split(" + ")[11]
+            download_cover_url = video.strip().split(" + ")[12]
+            download_video_url = video.strip().split(" + ")[13]
+            download_video_session = video.strip().split(" + ")[-1]
+
+            if cls.play_rule(download_video_width,
+                             download_video_height,
+                             download_video_duration,
+                             download_video_play_cnt) is True:
+                Common.crawler_log().info("开始下载视频:{}".format(download_video_title))
+                # 下载封面
+                Common.download_method(text="cover", d_name=download_video_title, d_url=download_cover_url)
+                # 下载视频
+                Common.download_method(text="video", d_name=download_video_title, d_url=download_video_url)
+
+                # 保存视频 ID 到 "./txt/kanyikan_videoid.txt"
+                with open("./txt/kanyikan_videoid.txt", "a", encoding="utf8") as f_a:
+                    f_a.write(download_video_id + "\n")
+
+                # 保存视频信息至 "./videos/{download_video_title}/info.txt"
+                with open("./videos/" + download_video_title + "/info.txt", "a", encoding="utf8") as f_a:
+                    f_a.write(str(download_video_id) + "\n" +
+                              str(download_video_title) + "\n" +
+                              str(download_video_duration) + "\n" +
+                              str(download_video_play_cnt) + "\n" +
+                              str(download_video_comment_cnt) + "\n" +
+                              str(download_video_like_cnt) + "\n" +
+                              str(download_video_share_cnt) + "\n" +
+                              str(download_video_resolution) + "\n" +
+                              str(download_video_send_time) + "\n" +
+                              str(download_user_name) + "\n" +
+                              str(download_head_url) + "\n" +
+                              str(download_video_url) + "\n" +
+                              str(download_cover_url) + "\n" +
+                              str(download_video_session))
+
+                # 上传视频
+                Common.crawler_log().info("开始上传视频:{}".format(download_video_title))
+                Publish.upload_and_publish(env, "play")
+
+                # 删除该视频在kanyikan_feeds.txt中的信息
+                Common.crawler_log().info("删除该视频在kanyikan_feeds.txt中的信息:{}".format(download_video_title))
+                with open("./txt/kanyikan_feeds.txt", "r", encoding="utf8") as f_r:
+                    lines = f_r.readlines()
+                with open("./txt/kanyikan_feeds.txt", "w", encoding="utf-8") as f_w:
+                    for line in lines:
+                        if download_video_id in line.split(" + ")[1]:
+                            continue
+                        f_w.write(line)
+            else:
+                # 删除该视频在 recommend.txt中的信息
+                Common.crawler_log().info("该视频不满足下载规则,删除在kanyikan_feeds.txt中的信息:{}".format(download_video_title))
+                with open("./txt/kanyikan_feeds.txt", "r", encoding="utf8") as f_r:
+                    lines = f_r.readlines()
+                with open("./txt/kanyikan_feeds.txt", "w", encoding="utf-8") as f_w:
+                    for line in lines:
+                        if download_video_id in line.split(" + ")[1]:
+                            continue
+                        f_w.write(line)
+
+
+if __name__ == "__main__":
+    download_play = DownloadPlay()
+    get_feeds()
+    download_play.download_play_video("dev")

+ 192 - 0
main/download_sendtime.py

@@ -0,0 +1,192 @@
+# -*- coding: utf-8 -*-
+# @Author: wangkun
+# @Time: 2022/4/18
+"""
+下载并上传:发布时间榜
+规则:
+    1.基本规则:send_time_rule()
+    2.视频发布3日内,播放量大于2万(当前时间 - 发布时间 <= 3 天)
+"""
+import json
+import os
+import random
+import sys
+import time
+import requests
+import urllib3
+sys.path.append(os.getcwd())
+from main.common import Common
+from main.get_feeds import get_feeds
+from main.publish import Publish
+
+
+class DownloadSendtime:
+
+    @staticmethod
+    def send_time_rule(send_time_width, send_time_height, send_time_duration, send_time_share_cnt):
+        """
+        1.分辨率,宽或者高 >= 720 or == 0
+        2.600s >= 时长 >= 60s
+        3.视频播放量 >= 0
+        """
+        if int(send_time_width) >= 720 or int(send_time_height) >= 720 \
+                or send_time_width == "0" or send_time_height == "0":
+            if 600 >= int(send_time_duration) >= 60:
+                if int(send_time_share_cnt) > 0:
+                    return True
+                else:
+                    return False
+            else:
+                return False
+        else:
+            return False
+
+    @classmethod
+    def download_sendtime_video(cls, env):
+        """
+        视频发布3日内,播放量大于2万(当前时间 - 发布时间 <= 3 天)
+        :param env: 测试环境:dev;正式环境:prod
+        :return: 下载并上传视频
+        """
+        get_sendtime_session = Common.get_session()
+        Common.crawler_log().info("获取视频info时,session:{}".format(get_sendtime_session))
+        lines = Common.read_txt("kanyikan_feeds.txt")
+        for line in lines:
+            v_id = line.strip().split(" + ")[1]  # 视频外网 ID
+            # v_send_date = line.strip().split(" + ")[9]  # 发布时间
+            url = "https://search.weixin.qq.com/cgi-bin/recwxa/recwxagetonevideoinfo?"
+            param = {
+                "session": get_sendtime_session,
+                "vid": v_id,
+                "wxaVersion": "3.9.2",
+                "channelid": "208201",
+                "scene": "32",
+                "subscene": "1089",
+                "model": "iPhone 11<iPhone12,1>14.7.1",
+                "clientVersion": "8.0.18",
+                "sharesearchid": "447665862521758270",
+                "sharesource": "-1"
+            }
+            try:
+                urllib3.disable_warnings()
+                r = requests.get(url=url, params=param, verify=False)
+                response = json.loads(r.content.decode("utf8"))
+                if "data" not in response:
+                    Common.crawler_log().info("获取视频info时,session过期,等待 30 秒")
+                    # 如果返回空信息,则随机睡眠 30-35 秒
+                    time.sleep(random.randint(31, 35))
+                else:
+                    data = response["data"]
+                    v_title = data["title"]
+                    v_duration = data["duration"]
+                    v_play_cnt_sendtime = data["played_cnt"]
+                    v_comment_cnt = data["comment_cnt"]
+                    v_liked_cnt = data["liked_cnt"]
+                    v_shared_cnt = data["shared_cnt"]
+                    v_width = data["width"]
+                    v_height = data["height"]
+                    v_resolution = str(v_width) + "*" + str(v_height)
+                    v_send_date = data["upload_time"]
+                    v_username = data["user_info"]["nickname"]
+                    v_user_cover = data["user_info"]["headimg_url"]
+                    v_video_cover = data["cover_url"]
+                    if "items" not in data["play_info"]:
+                        if len(data["play_info"]) > 1:
+                            download_url_up = data["play_info"][2]["play_url"]
+                            # Common.crawler_log().info('视频下载地址:{}'.format(download_url_up))
+                        else:
+                            download_url_up = data["play_info"][0]["play_url"]
+                            # Common.crawler_log().info('视频下载地址:{}'.format(download_url_up))
+                    else:
+                        if len(data["play_info"]["items"]) > 1:
+                            download_url_up = data["play_info"]["items"][2]["play_url"]
+                            # Common.crawler_log().info('视频下载地址:{}'.format(download_url_up))
+                        else:
+                            download_url_up = data["play_info"]["items"][0]["play_url"]
+                            # Common.crawler_log().info('视频下载地址:{}'.format(download_url_up))
+
+                    # 判断基本规则
+                    if cls.send_time_rule(v_width, v_height, v_duration, v_play_cnt_sendtime) is True:
+                        # 满足下载条件:当前时间 - 发布时间 <= 3天,播放量大于2万
+                        if int(time.time()) - int(v_send_date) <= 259200:
+                            if int(v_play_cnt_sendtime) >= 20000:
+                                Common.crawler_log().info("该视频:{}".format(
+                                    v_title) + " " + "在3天内的播放量{}>=20000".format(v_play_cnt_sendtime))
+                                # 下载封面
+                                Common.download_method("cover", v_title, v_video_cover)
+                                # 下载视频
+                                Common.download_method("video", v_title, download_url_up)
+                                # 保存视频 ID 到 "./txt/kanyikan_videoid.txt"
+                                with open("./txt/kanyikan_videoid.txt", "a", encoding="utf8") as f_a:
+                                    f_a.write(v_id + "\n")
+                                # 保存视频信息到 "./files/{视频标题}/videoinfo.txt"
+                                with open("./videos/" + v_title + "/" + "info.txt",
+                                          "a", encoding="utf8") as f_a2:
+                                    f_a2.write(str(v_id) + "\n" +
+                                               str(v_title) + "\n" +
+                                               str(v_duration) + "\n" +
+                                               str(v_play_cnt_sendtime) + "\n" +
+                                               str(v_comment_cnt) + "\n" +
+                                               str(v_liked_cnt) + "\n" +
+                                               str(v_shared_cnt) + "\n" +
+                                               str(v_resolution) + "\n" +
+                                               str(v_send_date) + "\n" +
+                                               str(v_username) + "\n" +
+                                               str(v_user_cover) + "\n" +
+                                               str(download_url_up) + "\n" +
+                                               str(v_video_cover) + "\n" +
+                                               str(get_sendtime_session))
+
+                                # 上传该视频
+                                Common.crawler_log().info("开始上传视频:{}".format(v_title))
+                                Publish.upload_and_publish(env, "send_time")
+
+                                # 删除该视频在kanyikan_feeds.txt中的信息
+                                Common.crawler_log().info("删除该视频在kanyikan_feeds.txt中的信息:{}".format(v_title))
+                                with open("./txt/kanyikan_feeds.txt", "r", encoding="utf8") as f1:
+                                    lines = f1.readlines()
+                                with open("./txt/kanyikan_feeds.txt", "w", encoding="utf-8") as f_w1:
+                                    for line1 in lines:
+                                        if v_id in line1.split(" + ")[1]:
+                                            continue
+                                        f_w1.write(line1)
+                            else:
+                                # 删除之前保存的该视频信息
+                                Common.crawler_log().info("该视频3天播放量:{}<20000".format(
+                                    int(v_play_cnt_sendtime)) + ";" + "不满足下载规则:{}".format(v_title))
+                                with open("./txt/kanyikan_feeds.txt", "r", encoding="utf8") as f_r:
+                                    lines = f_r.readlines()
+                                with open("./txt/kanyikan_feeds.txt", "w", encoding="utf-8") as f_w:
+                                    for line2 in lines:
+                                        if v_id in line2.split(" + ")[1]:
+                                            continue
+                                        f_w.write(line2)
+                        else:
+                            Common.crawler_log().info("视频发布时间大于3天:{}天".format(
+                                int((int(time.time()) - int(v_send_date)) / 86400))
+                                                + ";" + "标题:{}".format(v_title))
+                            with open("./txt/kanyikan_feeds.txt", "r", encoding="utf8") as f_r:
+                                lines = f_r.readlines()
+                            with open("./txt/kanyikan_feeds.txt", "w", encoding="utf-8") as f_w:
+                                for line2 in lines:
+                                    if v_id in line2.split(" + ")[1]:
+                                        continue
+                                    f_w.write(line2)
+                    else:
+                        Common.crawler_log().info("不满足下载规则:{}".format(v_title))
+                        with open("./txt/kanyikan_feeds.txt", "r", encoding="utf8") as f_r:
+                            lines = f_r.readlines()
+                        with open("./txt/kanyikan_feeds.txt", "w", encoding="utf-8") as f_w:
+                            for line3 in lines:
+                                if v_id in line3.split(" + ")[1]:
+                                    continue
+                                f_w.write(line3)
+
+            except Exception as e:
+                Common.crawler_log().error("获取视频info异常:{}".format(e))
+
+
+if __name__ == "__main__":
+    download_sendtime = DownloadSendtime()
+    get_feeds()
+    download_sendtime.download_sendtime_video("dev")

+ 221 - 0
main/download_up.py

@@ -0,0 +1,221 @@
+# -*- coding: utf-8 -*-
+# @Author: wangkun
+# @Time: 2022/4/18
+
+"""
+下载并上传:上升榜视频
+规则:
+    1.满足基本规则
+    2.每隔一小时,检查视频播放量,>=1000,则下载及上传
+    3.超过 2 小时,则删除该视频信息
+"""
+
+import json
+import os
+import random
+import sys
+import time
+import requests
+import urllib3
+sys.path.append(os.getcwd())
+from main.common import Common
+from main.get_feeds import get_feeds
+from main.publish import Publish
+
+
+class DownloadUp:
+
+    @staticmethod
+    def up_rule(up_width, up_height, up_duration, up_play_cnt):
+        """
+        1.分辨率,宽或者高 >= 720 or ==0
+        2.600s >= 时长 >= 60s
+        3.视频播放量 >= 0
+        """
+        if int(up_width) >= 720 or int(up_height) >= 720 or str(up_width) == "0" or str(up_height) == "0":
+            if 600 >= int(up_duration) >= 60:
+                if int(up_play_cnt) >= 0:
+                    return True
+                else:
+                    return False
+            else:
+                return False
+        else:
+            return False
+
+    @classmethod
+    def download_up_video(cls, env):
+        """
+        1.从 kanyikan_feeds.txt 中获取 videoid
+        2.根据 videoid,从 videoinfo 接口,获取当前视频最新的信息
+        3.根据下载规则判断,符合规则进行下载:
+            1 更新视频 ID 到 "./txt/kanyikan_videoid.txt"
+            2 视频信息写入文件 "./videos/{d_title}/info.txt"
+        4.上传完成:
+            1 删除该视频在 "./txt/kanyikan_feeds.txt" 中的信息
+        """
+        get_video_info_session = Common.get_session()
+        Common.crawler_log().info("获取视频info时,session:{}".format(get_video_info_session))
+        lines = Common.read_txt("kanyikan_feeds.txt")
+        for line in lines:
+            v_time = line.strip().split(" + ")[0]  # 第一次获取该视频的时间
+            v_id = line.strip().split(" + ")[1]  # 外网视频 ID
+            v_play_ctn = line.strip().split(" + ")[2]  # 播放量
+            url = "https://search.weixin.qq.com/cgi-bin/recwxa/recwxagetonevideoinfo?"
+            param = {
+                "session": get_video_info_session,
+                "vid": v_id,
+                "wxaVersion": "3.9.2",
+                "channelid": "208201",
+                "scene": "32",
+                "subscene": "1089",
+                "model": "iPhone 11<iPhone12,1>14.7.1",
+                "clientVersion": "8.0.18",
+                "sharesearchid": "447665862521758270",
+                "sharesource": "-1"
+            }
+            try:
+                urllib3.disable_warnings()
+                r = requests.get(url=url, params=param, verify=False)
+                response = json.loads(r.content.decode("utf8"))
+                if "data" not in response:
+                    Common.crawler_log().error("获取视频info时,session过期,等待30秒")
+                    # 如果返回空信息,则随机睡眠 31-35 秒
+                    time.sleep(random.randint(31, 35))
+                else:
+                    data = response["data"]
+                    v_title = data["title"]
+                    v_duration = data["duration"]
+                    v_play_cnt_up = data["played_cnt"]
+                    v_comment_cnt = data["comment_cnt"]
+                    v_liked_cnt = data["liked_cnt"]
+                    v_shared_cnt = data["shared_cnt"]
+                    v_width = data["width"]
+                    v_height = data["height"]
+                    v_resolution = str(v_width) + "*" + str(v_height)
+                    v_send_date = data["upload_time"]
+                    v_username = data["user_info"]["nickname"]
+                    v_user_cover = data["user_info"]["headimg_url"]
+                    v_video_cover = data["cover_url"]
+                    if "items" not in data["play_info"]:
+                        if len(data["play_info"]) > 1:
+                            download_url_up = data["play_info"][2]["play_url"]
+                            # Common.crawler_log().info('视频下载地址:{}'.format(download_url_up))
+                        else:
+                            download_url_up = data["play_info"][0]["play_url"]
+                            # Common.crawler_log().info('视频下载地址:{}'.format(download_url_up))
+                    else:
+                        if len(data["play_info"]["items"]) > 1:
+                            download_url_up = data["play_info"]["items"][2]["play_url"]
+                            # Common.crawler_log().info('视频下载地址:{}'.format(download_url_up))
+                        else:
+                            download_url_up = data["play_info"]["items"][0]["play_url"]
+                            # Common.crawler_log().info('视频下载地址:{}'.format(download_url_up))
+
+                    # 判断基本规则
+                    if cls.up_rule(v_width, v_height, v_duration, v_play_cnt_up) is True:
+                        if int(time.time()) - int(v_time) < 3600:
+                            Common.crawler_log().info("距上次获取该视频时间:{}分钟".format(
+                                int(int(int(time.time()) - int(v_time)) / 60)) + ";{}".format(v_title))
+                        elif 7200 >= int(time.time()) - int(v_time) >= 3600:
+                            if int(v_play_cnt_up) - int(v_play_ctn) >= 1000:
+                                Common.crawler_log().info("该视频:{}".format(
+                                    v_title) + " " + "在1小时内的播放量{}>=1000".format(int(v_play_cnt_up) - int(v_play_ctn)))
+                                # 下载封面
+                                Common.download_method("cover", v_title, v_video_cover)
+                                # 下载视频
+                                Common.download_method("video", v_title, download_url_up)
+                                # 保存视频 ID 到 "./txt/kanyikan_videoid.txt"
+                                with open("./txt/kanyikan_videoid.txt", "a", encoding="utf8") as f_a:
+                                    f_a.write(v_id + "\n")
+                                # 保存视频信息到 "./files/{视频标题}/videoinfo.txt"
+                                with open("./videos/" + v_title + "/" + "info.txt",
+                                          "a", encoding="utf8") as f_a2:
+                                    f_a2.write(str(v_id) + "\n" +
+                                               str(v_title) + "\n" +
+                                               str(v_duration) + "\n" +
+                                               str(v_play_cnt_up) + "\n" +
+                                               str(v_comment_cnt) + "\n" +
+                                               str(v_liked_cnt) + "\n" +
+                                               str(v_shared_cnt) + "\n" +
+                                               str(v_resolution) + "\n" +
+                                               str(v_send_date) + "\n" +
+                                               str(v_username) + "\n" +
+                                               str(v_user_cover) + "\n" +
+                                               str(download_url_up) + "\n" +
+                                               str(v_video_cover) + "\n" +
+                                               str(get_video_info_session))
+
+                                # 上传该视频
+                                Common.crawler_log().info("开始上传视频:{}".format(v_title))
+                                Publish.upload_and_publish(env, "up")
+
+                                # 删除该视频在kanyikan_feeds.txt中的信息
+                                Common.crawler_log().info("删除该视频在kanyikan_feeds.txt中的信息:{}".format(v_title))
+                                with open("./txt/kanyikan_feeds.txt", "r", encoding="utf8") as f1:
+                                    lines = f1.readlines()
+                                with open("./txt/kanyikan_feeds.txt", "w", encoding="utf-8") as f_w1:
+                                    for line1 in lines:
+                                        if v_id in line1.split(" + ")[1]:
+                                            continue
+                                        f_w1.write(line1)
+                            else:
+                                # 删除之前保存的该视频信息,并把现在的信息保存进去
+                                Common.crawler_log().info("该视频1小时内的播放量:{}<1000".format(
+                                    int(v_play_cnt_up) - int(v_play_ctn)) + ";"
+                                                          + "更新该视频在kanyikan_feeds.txt中的信息:{}".format(v_title))
+                                with open("./txt/kanyikan_feeds.txt", "r", encoding="utf8") as f_r:
+                                    lines = f_r.readlines()
+                                with open("./txt/kanyikan_feeds.txt", "w", encoding="utf-8") as f_w:
+                                    for line2 in lines:
+                                        if v_id in line2.split(" + ")[1]:
+                                            continue
+                                        f_w.write(line2)
+                                with open("./txt/kanyikan_feeds.txt", "a", encoding="utf-8") as f_a:
+                                    f_a.write(str(time.time()) + " + "
+                                              + v_id + " + "
+                                              + v_play_cnt_up + " + "
+                                              + v_title + " + "
+                                              + v_duration + " + "
+                                              + v_comment_cnt + " + "
+                                              + v_liked_cnt + " + "
+                                              + v_shared_cnt + " + "
+                                              + v_resolution + " + "
+                                              + v_send_date + " + "
+                                              + v_username + " + "
+                                              + v_user_cover + " + "
+                                              + v_video_cover + " + "
+                                              + download_url_up + " + "
+                                              + get_video_info_session + "\n")
+
+                        elif int(time.time()) - int(v_time) > 7200:
+                            Common.crawler_log().info("距上次获取该视频时间:{}分钟。超过2小时,删除该视频".format(
+                                int((int(time.time()) - int(v_time)) / 60)) + ";" + "标题:{}".format(v_title))
+                            # 删除之前保存的该视频信息
+                            Common.crawler_log().info("删除该视频在kanyikan_feeds.txt中的信息:{}".format(v_title))
+                            with open("./txt/kanyikan_feeds.txt", "r", encoding="utf8") as f_r:
+                                lines = f_r.readlines()
+                            with open("./txt/kanyikan_feeds.txt", "w", encoding="utf-8") as f_w:
+                                for line2 in lines:
+                                    if v_id in line2.split(" + ")[1]:
+                                        continue
+                                    f_w.write(line2)
+                    else:
+                        Common.crawler_log().info("不满足下载规则:{}".format(v_title))
+                        # 删除之前保存的该视频信息
+                        Common.crawler_log().info("删除该视频在kanyikan_feeds.txt中的信息:{}".format(v_title))
+                        with open("./txt/kanyikan_feeds.txt", "r", encoding="utf8") as f_r:
+                            lines = f_r.readlines()
+                        with open("./txt/kanyikan_feeds.txt", "w", encoding="utf-8") as f_w:
+                            for line3 in lines:
+                                if v_id in line3.split(" + ")[1]:
+                                    continue
+                                f_w.write(line3)
+            except Exception as e:
+                Common.crawler_log().error("获取视频info异常:{}".format(e))
+
+
+if __name__ == "__main__":
+    downloadup = DownloadUp()
+    get_feeds()
+    downloadup.download_up_video("dev")

+ 222 - 0
main/get_feeds.py

@@ -0,0 +1,222 @@
+# -*- coding: utf-8 -*-
+# @Author: wangkun
+# @Time: 2022/4/18
+"""
+获取看一看+小程序,首页推荐视频列表
+"""
+import json
+import os
+import random
+import sys
+import time
+import requests
+import urllib3
+sys.path.append(os.getcwd())
+from main.common import Common
+
+
+def get_feeds():
+    """
+    获取视频信息后:
+        1.先在 video.txt 中去重
+        2.再从 basic.txt 中去重
+        3.添加视频信息至 basic.txt
+    """
+    host = "https://search.weixin.qq.com"
+    url = '/cgi-bin/recwxa/recwxavideolist?'
+    get_video_list_session = Common.get_session()
+    Common.crawler_log().info("获取视频list时,session:{}".format(get_video_list_session))
+    header = {
+        "Connection": "keep-alive",
+        "content-type": "application/json",
+        "Accept-Encoding": "gzip,compress,br,deflate",
+        "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_7_1 like Mac OS X) "
+                      "AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.18(0x18001236) "
+                      "NetType/WIFI Language/zh_CN",
+        "Referer": "https://servicewechat.com/wxbb9a805eb4f9533c/234/page-frame.html",
+    }
+    params = {
+        'session': get_video_list_session,
+        "offset": 0,
+        "wxaVersion": "3.9.2",
+        "count": "10",
+        "channelid": "208",
+        "scene": '310',
+        "subscene": '1089',
+        "clientVersion": '8.0.18',
+        "sharesearchid": '0',
+        "nettype": 'wifi',
+        "switchprofile": "0",
+        "switchnewuser": "0",
+    }
+    try:
+        urllib3.disable_warnings()
+        r = requests.get(host + url, headers=header, params=params, verify=False)
+        response = json.loads(r.content.decode("utf8"))
+
+        if "data" not in response:
+            Common.crawler_log().info("获取视频list时,session过期,随机睡眠 31-50 秒")
+            # 如果返回空信息,则随机睡眠 50-100 秒
+            time.sleep(random.randint(31, 50))
+            get_feeds()
+        elif "items" not in response["data"]:
+            Common.crawler_log().info("获取视频list时,返回空信息,随机睡眠 1-3 分钟")
+            # 如果返回空信息,则随机睡眠 1-3 分钟
+            time.sleep(random.randint(60, 180))
+            get_feeds()
+        else:
+            items = response["data"]["items"]
+            for i in range(len(items)):
+                # 如果该视频没有视频信息,则忽略
+                if "videoInfo" not in items[i]:
+                    Common.crawler_log().info("无视频信息")
+                else:
+                    # 获取视频ID
+                    video_id = items[i]["videoId"]
+                    Common.crawler_log().info('视频ID:{}'.format(video_id))
+                
+                    # 获取视频标题
+                    video_title = items[i]["title"].strip().replace("\n", "").replace("/", "")
+                    Common.crawler_log().info('视频标题:{}'.format(video_title))
+                
+                    # 获取视频播放次数
+                    video_play_cnt = items[i]["playCount"]
+                    Common.crawler_log().info('视频播放次数:{}'.format(video_play_cnt))
+                
+                    # 获取视频点赞数
+                    video_liked_cnt = items[i]["liked_cnt"]
+                    Common.crawler_log().info('视频点赞数:{}'.format(video_liked_cnt))
+                
+                    # 获取视频时长
+                    video_duration = items[i]["mediaDuration"]
+                    Common.crawler_log().info('视频时长:{}秒'.format(video_duration))
+                
+                    # 获取视频评论数
+                    video_comment_cnt = items[i]["comment_cnt"]
+                    Common.crawler_log().info('视频评论数:{}'.format(video_comment_cnt))
+                
+                    # 获取视频分享数
+                    video_shared_cnt = items[i]["shared_cnt"]
+                    Common.crawler_log().info('视频分享数:{}'.format(video_shared_cnt))
+                
+                    # 获取视频发布时间
+                    video_send_date = items[i]["date"]
+                    Common.crawler_log().info('视频发布时间:{}'.format(
+                        time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(video_send_date))))
+                
+                    # 获取视频用户名
+                    video_user = items[i]["source"].strip().replace("\n", "")
+                    Common.crawler_log().info('视频用户名:{}'.format(video_user))
+                
+                    # 获取视频宽高
+                    if "short_video_info" not in items[i]:
+                        video_width = "0"
+                        video_height = "0"
+                        video_resolution = str(video_width) + "*" + str(video_height)
+                        Common.crawler_log().info("无分辨率:{}".format(video_resolution))
+                    elif len(items[i]["short_video_info"]) == 0:
+                        video_width = "0"
+                        video_height = "0"
+                        video_resolution = str(video_width) + "*" + str(video_height)
+                        Common.crawler_log().info("无分辨率:{}".format(video_resolution))
+
+                    else:
+                        # 视频宽
+                        video_width = items[i]["short_video_info"]["width"]
+                        # 视频高
+                        video_height = items[i]["short_video_info"]["height"]
+                        video_resolution = str(video_width) + "*" + str(video_height)
+                        Common.crawler_log().info('视频宽高:{}'.format(video_resolution))
+                
+                    # 获取视频用户头像
+                    video_user_cover = items[i]["bizIcon"]
+                    Common.crawler_log().info('视频用户头像:{}'.format(video_user_cover))
+                
+                    # 获取视频封面
+                    if "smartCoverUrl" in items[i]:
+                        video_cover = items[i]["smartCoverUrl"]
+                        Common.crawler_log().info('视频封面:{}'.format(video_cover))
+                    else:
+                        video_cover = items[i]["thumbUrl"]
+                        Common.crawler_log().info('视频封面:{}'.format(video_cover))
+                
+                    # 获取播放地址
+                    if "mpInfo" in items[i]["videoInfo"]["videoCdnInfo"].keys():
+                        if len(items[i]["videoInfo"]["videoCdnInfo"]["mpInfo"]["urlInfo"]) > 2:
+                            url = items[i]["videoInfo"]["videoCdnInfo"]["mpInfo"]["urlInfo"][2]["url"]
+                            Common.crawler_log().info('视频播放地址:{}'.format(url))
+                        else:
+                            url = items[i]["videoInfo"]["videoCdnInfo"]["mpInfo"]["urlInfo"][0]["url"]
+                            Common.crawler_log().info('视频播放地址:{}'.format(url))
+                    elif "ctnInfo" in items[i]["videoInfo"]["videoCdnInfo"]:
+                        url = items[i]["videoInfo"]["videoCdnInfo"]["ctnInfo"]["urlInfo"][0]["url"]
+                        Common.crawler_log().info('视频播放地址:{}'.format(url))
+                    else:
+                        url = items[i]["videoInfo"]["videoCdnInfo"]["urlInfo"][0]["url"]
+                        Common.crawler_log().info('视频播放地址:{}'.format(url))
+
+                    # 过滤无效视频
+                    if str(video_id).strip() == "" or str(video_send_date).strip() == "":
+                        Common.crawler_log().info("无效视频")
+                    else:
+                        # 从 kanyikan_videoid.txt 去重
+                        videoids = Common.read_txt("kanyikan_videoid.txt")
+                        if video_id in [vid.strip() for vid in videoids]:
+                            Common.crawler_log().info("该视频已下载:{}".format(video_title))
+                        else:
+                            Common.crawler_log().info("该视频未下载:{}".format(video_title))
+                            # 获取当前时间
+                            basic_time = int(time.time())
+
+                            # 从 kanyikan_feeds.txt 去重
+                            contents = Common.read_txt("kanyikan_feeds.txt")
+                            # 文件为空时,直接添加该视频
+                            if len(contents) == 0:
+                                Common.crawler_log().info("添加该视频信息至kanyikan_feeds.txt:{}".format(video_title))
+                                # 当前时间、视频 ID、播放量 存储到 kanyikan_feeds.txt
+                                with open("./txt/kanyikan_feeds.txt", "a", encoding="utf8") as f:
+                                    f.write(str(basic_time) + " + "
+                                            + str(video_id) + " + "
+                                            + str(video_play_cnt) + " + "
+                                            + str(video_title) + " + "
+                                            + str(video_duration) + " + "
+                                            + str(video_comment_cnt) + " + "
+                                            + str(video_liked_cnt) + " + "
+                                            + str(video_shared_cnt) + " + "
+                                            + str(video_resolution) + " + "
+                                            + str(video_send_date) + " + "
+                                            + str(video_user) + " + "
+                                            + str(video_user_cover) + " + "
+                                            + str(video_cover) + " + "
+                                            + str(url) + " + "
+                                            + Common.get_session() + "\n")
+                            else:
+                                # 文件不为空时,再做去重
+                                if video_id in [content.split(" + ")[1] for content in contents]:
+                                    Common.crawler_log().info("该视频已在kanyikan_feeds.txt中:{}".format(video_title))
+                                else:
+                                    Common.crawler_log().info("添加该视频信息至kanyikan_feeds.txt:{}".format(video_title))
+                                    # 当前时间、视频 ID、播放量 存储到 kanyikan_feeds.txt
+                                    with open("./txt/kanyikan_feeds.txt", "a", encoding="utf8") as f:
+                                        f.write(str(basic_time) + " + "
+                                                + str(video_id) + " + "
+                                                + str(video_play_cnt) + " + "
+                                                + str(video_title) + " + "
+                                                + str(video_duration) + " + "
+                                                + str(video_comment_cnt) + " + "
+                                                + str(video_liked_cnt) + " + "
+                                                + str(video_shared_cnt) + " + "
+                                                + str(video_resolution) + " + "
+                                                + str(video_send_date) + " + "
+                                                + str(video_user) + " + "
+                                                + str(video_user_cover) + " + "
+                                                + str(video_cover) + " + "
+                                                + str(url) + " + "
+                                                + Common.get_session() + "\n")
+
+    except Exception as e:
+        Common.crawler_log().error("获取视频 list 时异常:{}".format(e))
+
+
+if __name__ == "__main__":
+    get_feeds()

+ 257 - 0
main/publish.py

@@ -0,0 +1,257 @@
+# -*- coding: utf-8 -*-
+# @Author: wangkun
+# @Time: 2022/4/18
+"""
+上传视频到阿里云 OSS
+上传视频到管理后台
+"""
+import json
+import os
+import random
+import time
+
+import oss2
+import requests
+import urllib3
+from main.common import Common
+
+
+class Publish:
+    @classmethod
+    def publish_video_dev(cls, request_data):
+        """
+        loginUid  站内uid (随机)
+        appType  默认:888888
+        crawlerSrcId   站外视频ID
+        crawlerSrcCode   渠道(自定义 KYK)
+        crawlerSrcPublishTimestamp  视频原发布时间
+        crawlerTaskTimestamp   爬虫创建时间(可以是当前时间)
+        videoPath  视频oss地址
+        coverImgPath  视频封面oss地址
+        title  标题
+        totalTime  视频时长
+        viewStatus  视频的有效状态 默认1
+        versionCode  版本 默认1
+        :return:
+        """
+        # Common.crawler_log().info('publish request data: {}'.format(request_data))
+        result = cls.request_post('https://videotest.yishihui.com/longvideoapi/crawler/video/send', request_data)
+        Common.crawler_log().info('publish result: {}'.format(result))
+        if result['code'] != 0:
+            Common.crawler_log().error('pushlish failure msg = {}'.format(result['msg']))
+        else:
+            Common.crawler_log().info('publish success video_id = : {}'.format(request_data['crawlerSrcId']))
+
+    @classmethod
+    def publish_video_prod(cls, request_data):
+        """
+        loginUid  站内uid (随机)
+        appType  默认:888888
+        crawlerSrcId   站外视频ID
+        crawlerSrcCode   渠道(自定义 KYK)
+        crawlerSrcPublishTimestamp  视频原发布时间
+        crawlerTaskTimestamp   爬虫创建时间(可以是当前时间)
+        videoPath  视频oss地址
+        coverImgPath  视频封面oss地址
+        title  标题
+        totalTime  视频时长
+        viewStatus  视频的有效状态 默认1
+        versionCode  版本 默认1
+        :return:
+        """
+        # Common.crawler_log().info('publish request data: {}'.format(request_data))
+        result = cls.request_post('https://longvideoapi.piaoquantv.com/longvideoapi/crawler/video/send', request_data)
+        Common.crawler_log().info('publish result: {}'.format(result))
+        if result['code'] != 0:
+            Common.crawler_log().error('pushlish failure msg = {}'.format(result['msg']))
+        else:
+            Common.crawler_log().info('publish success video_id = : {}'.format(request_data['crawlerSrcId']))
+
+    @classmethod
+    def request_post(cls, request_url, request_data):
+        """
+        post 请求 HTTP接口
+        :param request_url: 接口URL
+        :param request_data: 请求参数
+        :return: res_data json格式
+        """
+        urllib3.disable_warnings()
+        response = requests.post(url=request_url, data=request_data, verify=False)
+        if response.status_code == 200:
+            res_data = json.loads(response.text)
+            return res_data
+
+    # 以下代码展示了基本的文件上传、下载、罗列、删除用法。
+
+    # 首先初始化AccessKeyId、AccessKeySecret、Endpoint等信息。
+    # 通过环境变量获取,或者把诸如“<你的AccessKeyId>”替换成真实的AccessKeyId等。
+    #
+    # 以杭州区域为例,Endpoint可以是:
+    #   http://oss-cn-hangzhou.aliyuncs.com
+    #   https://oss-cn-hangzhou.aliyuncs.com
+    # 分别以HTTP、HTTPS协议访问。
+    access_key_id = os.getenv('OSS_TEST_ACCESS_KEY_ID', 'LTAIP6x1l3DXfSxm')
+    access_key_secret = os.getenv('OSS_TEST_ACCESS_KEY_SECRET', 'KbTaM9ars4OX3PMS6Xm7rtxGr1FLon')
+    bucket_name = os.getenv('OSS_TEST_BUCKET', 'art-pubbucket')
+    # endpoint = os.getenv('OSS_TEST_ENDPOINT', 'oss-cn-hangzhou-internal.aliyuncs.com')
+    endpoint = os.getenv('OSS_TEST_ENDPOINT', 'oss-cn-hangzhou.aliyuncs.com')
+
+    # 确认上面的参数都填写正确了
+    for param in (access_key_id, access_key_secret, bucket_name, endpoint):
+        assert '<' not in param, '请设置参数:' + param
+
+    # 创建Bucket对象,所有Object相关的接口都可以通过Bucket对象来进行
+    bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)
+
+    """
+    处理流程:
+    1. 定时(每天凌晨1点执行一次)循环files文件下的内容 结构:files -> 视频文件夹 -> 视频文件 + 封面图 + 基本信息
+    2. 视频文件和封面上传到oss
+    - 视频文件oss目录  longvideo/crawler_local/video/prod/文件名
+    - 视频封面oss目录  longvideo/crawler_local/image/prod/文件名
+    3. 发布视频
+    - 读取 基本信息 调用发布接口
+    """
+    # env 日期20220225 文件名
+    oss_file_path_video = 'longvideo/crawler_local/video/{}/{}/{}'
+    oss_file_path_image = 'longvideo/crawler_local/image/{}/{}/{}'
+
+    @classmethod
+    def put_file(cls, oss_file, local_file):
+        # Common.crawler_log().info("put oss file = {}, local file = {}".format(oss_file, local_file))
+        cls.bucket.put_object_from_file(oss_file, local_file)
+        Common.crawler_log().info("put oss file = {}, local file = {} success".format(oss_file, local_file))
+
+    # 清除本地文件
+    @classmethod
+    def remove_local_file(cls, local_file):
+        # Common.crawler_log().info("remove local file = {}".format(local_file))
+        os.remove(local_file)
+        Common.crawler_log().info("remove local file = {} success".format(local_file))
+
+    # 清除本地文件夹
+    @classmethod
+    def remove_local_file_dir(cls, local_file):
+        # Common.crawler_log().info("remove local file dir = {}".format(local_file))
+        os.rmdir(local_file)
+        Common.crawler_log().info("remove local file dir = {} success".format(local_file))
+
+    local_file_path = './videos'
+    video_file = 'video'
+    image_file = 'image'
+    info_file = 'info'
+    uids_dev_up = [6267140]
+    uids_dev_play = [6267141]
+    uids_dev_send_time = [6267824]
+    uids_prod_up = [20631208, 20631209, 20631210, 20631211, 20631212,
+                    20631213, 20631214, 20631215, 20631216, 20631217]
+    uids_prod_play = [20631208, 20631209, 20631210, 20631211, 20631212,
+                      20631213, 20631214, 20631215, 20631216, 20631217,
+                      20631223, 20631224, 20631225, 20631226, 20631227]
+    uids_prod_send_time = [20631208, 20631209, 20631210, 20631211, 20631212,
+                           20631213, 20631214, 20631215, 20631216, 20631217,
+                           20631223, 20631224, 20631225, 20631226, 20631227]
+
+    @classmethod
+    def upload_and_publish(cls, env, job):
+        """
+        上传视频到 oss
+        :param env: 测试环境:dev,正式环境:prod
+        :param job: 上升榜:up,播放量:play, send_time:发布时间榜
+        """
+        Common.crawler_log().info("upload_and_publish starting...")
+        today = time.strftime("%Y%m%d", time.localtime())
+        # videos 目录下的所有视频文件夹
+        files = os.listdir(cls.local_file_path)
+        for f in files:
+            try:
+                # 单个视频文件夹
+                fi_d = os.path.join(cls.local_file_path, f)
+                # 确认为视频文件夹
+                if os.path.isdir(fi_d):
+                    Common.crawler_log().info('dir = {}'.format(fi_d))
+                    # 列出所有视频文件夹
+                    dir_files = os.listdir(fi_d)
+                    data = {'appType': '888888', 'crawlerSrcCode': 'KANYIKAN', 'viewStatus': '1', 'versionCode': '1'}
+                    now_timestamp = int(round(time.time() * 1000))
+                    data['crawlerTaskTimestamp'] = str(now_timestamp)
+                    global uid
+                    if env == "dev" and job == "up":
+                        uid = str(random.choice(cls.uids_dev_up))
+                    elif env == "dev" and job == "play":
+                        uid = str(random.choice(cls.uids_dev_play))
+                    elif env == "dev" and job == "send_time":
+                        uid = str(random.choice(cls.uids_dev_send_time))
+                    elif env == "prod" and job == "up":
+                        uid = str(random.choice(cls.uids_prod_up))
+                    elif env == "prod" and job == "play":
+                        uid = str(random.choice(cls.uids_prod_play))
+                    elif env == "prod" and job == "send_time":
+                        uid = str(random.choice(cls.uids_prod_send_time))
+                    data['loginUid'] = uid
+                    # 单个视频文件夹下的所有视频文件
+                    for fi in dir_files:
+                        # 视频文件夹下的所有文件路径
+                        fi_path = fi_d + '/' + fi
+                        Common.crawler_log().info('dir fi_path = {}'.format(fi_path))
+                        # 读取 info.txt,赋值给 data
+                        if cls.info_file in fi:
+                            f = open(fi_path)
+                            # 读取数据 数据准确性写入的时候保证 读取暂不处理
+                            for i in range(14):
+                                line = f.readline()
+                                line = line.replace('\n', '')
+                                if line is not None and len(line) != 0 and not line.isspace():
+                                    Common.crawler_log().info("line = {}".format(line))
+                                    if i == 0:
+                                        data['crawlerSrcId'] = line
+                                    elif i == 1:
+                                        data['title'] = line
+                                    elif i == 2:
+                                        data['totalTime'] = line
+                                    elif i == 8:
+                                        data['crawlerSrcPublishTimestamp'] = line
+                                else:
+                                    Common.crawler_log().warning("{} line is None".format(fi_path))
+                            # remove info.txt
+                            cls.remove_local_file(fi_path)
+                    # 刷新数据
+                    dir_files = os.listdir(fi_d)
+                    for fi in dir_files:
+                        fi_path = fi_d + '/' + fi
+                        Common.crawler_log().info('dir fi_path = {}'.format(fi_path))
+                        # 上传oss
+                        if cls.video_file in fi:
+                            global oss_video_file
+                            if env == "dev":
+                                oss_video_file = cls.oss_file_path_video.format("dev", today, data['crawlerSrcId'])
+                            elif env == "prod":
+                                oss_video_file = cls.oss_file_path_video.format("prod", today, data['crawlerSrcId'])
+                            Common.crawler_log().info("oss_video_file = {}".format(oss_video_file))
+                            cls.put_file(oss_video_file, fi_path)
+                            data['videoPath'] = oss_video_file
+                            Common.crawler_log().info("videoPath = {}".format(oss_video_file))
+                        elif cls.image_file in fi:
+                            global oss_image_file
+                            if env == "dev":
+                                oss_image_file = cls.oss_file_path_image.format("env", today, data['crawlerSrcId'])
+                            elif env == "prod":
+                                oss_image_file = cls.oss_file_path_image.format("prod", today, data['crawlerSrcId'])
+                            Common.crawler_log().info("oss_image_file = {}".format(oss_image_file))
+                            cls.put_file(oss_image_file, fi_path)
+                            data['coverImgPath'] = oss_image_file
+                            Common.crawler_log().info("coverImgPath = {}".format(oss_image_file))
+                        # 全部remove
+                        cls.remove_local_file(fi_path)
+
+                    # 发布
+                    if env == "dev":
+                        cls.publish_video_dev(data)
+                    elif env == "prod":
+                        cls.publish_video_prod(data)
+                    cls.remove_local_file_dir(fi_d)
+
+                else:
+                    Common.crawler_log().error('file not a dir = {}'.format(fi_d))
+            except Exception as e:
+                Common.crawler_log().exception('upload_and_publish error', e)

+ 119 - 0
main/run.py

@@ -0,0 +1,119 @@
+# -*- coding: utf-8 -*-
+# @Author: wangkun
+# @Time: 2022/4/18
+import os
+import random
+import sys
+import time
+sys.path.append(os.getcwd())
+from main.download_sendtime import DownloadSendtime
+from main.download_up import DownloadUp
+from main.common import Common
+from main.download_play import DownloadPlay
+from main.get_feeds import get_feeds
+
+
+class Main:
+
+    @classmethod
+    def download_play_job(cls):
+        """
+        播放量脚本任务
+        """
+        while True:
+            # 指定时间结束抓取视频
+            if 19 >= Common.now.hour >= 0:
+                time.sleep(60)
+                break
+            else:
+                # 获取视频信息,并下载
+                get_feeds()
+                DownloadPlay.download_play_video("prod")
+                # 请求随机间隔时间
+                time.sleep(random.randint(31, 40))
+
+        # 删除 charles 缓存文件
+        Common.del_charles_files()
+        # 删除多余日志
+        Common.del_logs()
+        # 统计累计下载数量
+        Common.kanyikan_download_count()
+
+    @classmethod
+    def download_up_job(cls):
+        """
+        上升榜脚本任务
+        """
+        while True:
+            # 指定时间结束抓取视频
+            if 9 >= Common.now.hour >= 0 or 24 >= Common.now.hour >= 20:
+                time.sleep(60)
+                break
+            else:
+                # 获取视频信息,并下载
+                get_feeds()
+                DownloadUp.download_up_video("prod")
+                # 请求随机间隔时间
+                time.sleep(random.randint(31, 40))
+
+        # 删除 charles 缓存文件
+        Common.del_charles_files()
+        # 删除多余日志
+        Common.del_logs()
+        # 统计累计下载数量
+        Common.kanyikan_download_count()
+
+    @classmethod
+    def download_sendtime_job(cls):
+        """
+        发布时间榜脚本任务
+        """
+        while True:
+            # 指定时间结束抓取视频
+            if 24 >= Common.now.hour >= 10:
+                time.sleep(60)
+                break
+            else:
+                # 获取视频信息,并下载
+                get_feeds()
+                DownloadSendtime.download_sendtime_video("prod")
+                # 请求随机间隔时间
+                time.sleep(random.randint(31, 40))
+
+        # 删除 charles 缓存文件
+        Common.del_charles_files()
+        # 删除多余日志
+        Common.del_logs()
+        # 统计累计下载数量
+        Common.kanyikan_download_count()
+
+    @classmethod
+    def main(cls):
+        """
+        - 1.凌晨0点-10点      3日内播放大于2万 爬取
+        - 2.早上10点-20点     内容上升榜 爬取
+        - 3.晚上20点-24点     15万播放爬取
+        """
+        while True:
+            while True:
+                if 9 >= Common.now.hour >= 0:
+                    Common.crawler_log().info("开始抓取3天榜单视频\n")
+                    time.sleep(1)
+                    cls.download_sendtime_job()
+                elif 19 >= Common.now.hour >= 10:
+                    Common.crawler_log().info("开始抓取上升榜视频\n")
+                    time.sleep(1)
+                    cls.download_up_job()
+                elif 24 >= Common.now.hour >= 20:
+                    Common.crawler_log().info("开始抓取播放量视频\n")
+                    time.sleep(1)
+                    cls.download_play_job()
+                else:
+                    Common.crawler_log().info("结束今天抓取及上传任务\n")
+                    time.sleep(60)
+                    break
+
+
+if __name__ == "__main__":
+    main = Main()
+    main.main()

+ 3 - 0
txt/__init__.py

@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+# @Author: wangkun
+# @Time: 2022/4/18

+ 0 - 0
txt/kanyikan_feeds.txt


+ 3362 - 0
txt/kanyikan_videoid.txt

@@ -0,0 +1,3362 @@
+ugc_12g0qe
+ugc_bnecthl
+i3265cmmnuc
+ugc_sylci4
+ugc_68wvkz
+ugc_bsggpl5
+ugc_b85n0e3
+x3255qbbkl7
+ugc_6pj98u
+ugc_kjrkx0
+ugc_5dehmm
+ugc_69gqga
+i3208ogbrur
+ugc_zwhv8f
+ugc_27c4mx
+ugc_efsm32
+ugc_1xo1pw
+ugc_x9ttil
+ugc_1fhfue
+ugc_1bf76f
+ugc_3idsxb
+ugc_drn1vr
+ugc_b0z2rwi
+ugc_lsap42
+ugc_023pzu
+ugc_bydmb20
+ugc_x892wy
+ugc_1lc2l0
+ugc_by6i6ko
+s3229hr28p3
+ugc_exwtnk
+i3266r824ej
+m3204tdjrrv
+ugc_t6ky4q
+ugc_bkfdg8c
+ugc_b4jqm39
+n3201ed8d00
+ugc_bgbnyxa
+ugc_0bem4x
+x315328oo2r
+f3217d9uiz0
+o324113i7a9
+ugc_bftz0yk
+e3265phvxgo
+u3226iht8qu
+ugc_bhngihd
+ugc_bag3xgl
+j324893ubx0
+u3231p0mjhw
+ugc_bvpbysh
+m3242b24n7s
+ugc_93j7ri
+ugc_bxys1ez
+ugc_cnno5w
+k3237a6hcqz
+ugc_bf36iqt
+ugc_rzsb7
+ugc_lo4dyg
+ugc_bfpiqh2
+ugc_bj45shs
+ugc_r5wxjz
+ugc_2vde5l
+ugc_jzy38z
+ugc_bf6wkem
+ugc_bec2qd0
+ugc_bznya57
+ugc_bsj9c4j
+ugc_b5xhfn
+ugc_bpibdd0
+ugc_hv80n0
+ugc_b48dpz3
+w32588pxsao
+ugc_b49umfp
+ugc_bnayg0a
+ugc_7vyw9f
+j32235dfz2u
+ugc_xr1bd0
+ugc_f6h5zs
+ugc_bsm5pow
+ugc_9up6vk
+ugc_btht8lu
+ugc_btht8lu
+ugc_6806lp
+ugc_bj3rki8
+ugc_ba9v297
+ugc_1258ce
+ugc_b442d25
+ugc_thngc6
+ugc_ea1cxm
+b32383he10l
+ugc_hvg3nr
+ugc_buut41
+ugc_bdhyr71
+ugc_8umqaw
+a3259ujm1f0
+ugc_bcw573i
+ugc_b6h6co2
+ugc_bej4n3i
+ugc_kwgkj1
+ugc_1lahvy
+ugc_r0r4g3
+ugc_btbws2s
+ugc_l7pm1t
+ugc_bxr7nv0
+ugc_9bll3w
+ugc_bi1jwg2
+ugc_uwtthc
+ugc_bjj9cwa
+ugc_bt0yydd
+ugc_5klgjg
+ugc_b1l2p57
+ugc_b3p22c0
+ugc_beeeo5r
+ugc_bi8ai
+ugc_hy6hr6
+ugc_bws64fh
+g3237yz55qo
+ugc_31ng5q
+ugc_b0py9td
+ugc_b5kmtfl
+ugc_h2s282
+ugc_b0ik45i
+w3238tbfg4p
+ugc_btwkqvy
+ugc_w436gq
+ugc_4x3blc
+ugc_b2r5ypn
+ugc_ig05nm
+ugc_33qnum
+ugc_dkic2
+m3214lniqlc
+ugc_jyjnmn
+w3328m7a4ms
+ugc_bx69ivz
+ugc_r9pdnw
+d32526ngenp
+ugc_bnzfvso
+ugc_3fs3es
+ugc_b44l06e
+ugc_sygpx0
+ugc_x79x25
+ugc_of9jpd
+ugc_bew7z3c
+ugc_bxiul1z
+ugc_bp1tkt1
+ugc_bz19ula
+ugc_bjqtbd2
+ugc_bxm1z5t
+ugc_m1s2y8
+ugc_7wg1da
+b3210tecmv9
+ugc_bgaeax3
+c3205wr2d9e
+ugc_b3h4m5z
+ugc_3klm8p
+ugc_qsjsv3
+ugc_r6ohzp
+ugc_b6ojdfn
+ugc_bpztp9k
+ugc_baisfhd
+ugc_by0cs6c
+ugc_qr51ez
+ugc_bycys6u
+f3328o5kkn9
+ugc_bt45o4r
+ugc_wte0vb
+ugc_5o8i4z
+ugc_bir0q4y
+ugc_btd5zw3
+ugc_bjkf3l5
+ugc_b84i47w
+ugc_b4ueddp
+ugc_15vjke
+ugc_sql5eb
+ugc_7aorgu
+ugc_bf30kfs
+ugc_qloy0d
+ugc_bxljkxn
+ugc_ba51qz1
+ugc_54ljp7
+ugc_b1i2oko
+ugc_b8y44r5
+r3234vv09id
+ugc_cbevl7
+ugc_brguk2r
+ugc_bf3e6ag
+ugc_b0i5311
+ugc_bfwp800
+i32588clobm
+ugc_ekc0gp
+ugc_bcxmlmx
+ugc_rwhloq
+ugc_u1rp99
+ugc_8tgjjc
+m3329vl8kli
+v3240bu687v
+ugc_fe7pkn
+ugc_bwaj7w4
+ugc_b2ghbln
+ugc_r6huj5
+o3266tljy4z
+ugc_ectpa5
+c3214l5o4jm
+ugc_bmewfqb
+o3328nm5vq3
+ugc_uwnb1z
+j3248twwn5u
+ugc_bsspzfb
+ugc_x2y8s4
+ugc_id8xfa
+ugc_0tm3y9
+p3209coqp3l
+ugc_j5r9v
+ugc_bcns1yj
+ugc_bm3olsu
+ugc_bw4by1o
+ugc_981wlk
+ugc_c382oi
+ugc_h33d5f
+ugc_b5ak9om
+ugc_f8f3nt
+t32479cjz8c
+ugc_bobklsn
+r32591wydcd
+ugc_bgopzkq
+ugc_6047cj
+ugc_byazlfe
+ugc_ue8qg2
+y32376wde4w
+ugc_biwpp1l
+ugc_b7i5z97
+ugc_l1jsuj
+wxv_2322395661541097472
+ugc_nw1w87
+y3256mrskb2
+ugc_bduz4n3
+ugc_s5pysp
+ugc_w39mtl
+ugc_3usi7s
+ugc_b3lppup
+ugc_xsxpsr
+ugc_btald06
+ugc_bgno14b
+ugc_jpmdx4
+ugc_bfqcj69
+k3256qpqp4k
+ugc_6sqfvg
+ugc_5jr6sp
+ugc_bgerw7y
+ugc_b8cxwq7
+ugc_uj3ixd
+ugc_bap1mxx
+ugc_ik53lk
+ugc_1eumc7
+ugc_byph0fm
+ugc_nyuhu5
+ugc_bfu4gq7
+ugc_bz9jz00
+ugc_bgerw7y
+ugc_b8cxwq7
+ugc_nyuhu5
+ugc_bclxb07
+ugc_b1f1v4n
+ugc_bgerw7y
+ugc_b8cxwq7
+ugc_nyuhu5
+ugc_jp6dif
+ugc_bzsvi7d
+ugc_bj7fo4g
+ugc_0ept3r
+ugc_kq3x9r
+ugc_75abwm
+ugc_bw8m2nw
+ugc_by9ig3t
+ugc_oads7t
+ugc_9367k1
+ugc_b3kg353
+ugc_bserz3
+ugc_9oyi70
+ugc_bez5d1i
+ugc_b0e98br
+ugc_bgdgaqh
+ugc_nswujr
+v3252i59t8t
+wxv_2309844173853933569
+ugc_4zpzdn
+ugc_1p7tk
+ugc_mh6kx1
+ugc_r5mvgo
+ugc_7ndfdm
+ugc_bgcajxg
+ugc_0kvzyf
+ugc_bg99nlr
+e32578472jo
+ugc_bdqd1ls
+k3272xdoy5b
+ugc_qtf1xp
+ugc_y01md6
+ugc_qtbyc5
+ugc_boktioa
+ugc_v0ex8m
+ugc_ni8nk
+ugc_bl940za
+ugc_0osmj0
+ugc_5ly71d
+ugc_bo02xpy
+ugc_b1pxw2x
+ugc_ba0q6g5
+ugc_jmaqir
+ugc_ohkygg
+ugc_2u47h8
+ugc_bhki9vv
+ugc_l4acom
+ugc_bbvvaug
+ugc_byt3fvh
+ugc_rzyey9
+ugc_35dhip
+ugc_bb017mm
+ugc_b71u187
+l3243w4sfti
+ugc_bbqpgoz
+ugc_b2qb9s1
+ugc_bgjevw4
+ugc_blhtf37
+ugc_bgex7ou
+ugc_brhzrk7
+ugc_bapw0gg
+w3215jgva8r
+ugc_xwq448
+wxv_2286477655401136128
+ugc_bab8zb4
+ugc_iu5id8
+ugc_2p3759
+ugc_b9xruf
+ugc_bkhecx9
+ugc_0ezr9d
+ugc_s99i1m
+ugc_bffzhme
+ugc_z3fa2b
+ugc_bug0imr
+ugc_mwuqfq
+ugc_bpcy17c
+ugc_s5ebyr
+ugc_bt8icpo
+ugc_lfkho7
+ugc_rq2jbz
+ugc_b3ukb4s
+ugc_b4x7vl8
+ugc_ngwhvl
+ugc_b5p4632
+ugc_bf4rpwn
+ugc_9gcxv4
+ugc_9cxri5
+ugc_b4bozkn
+ugc_2nhqvr
+ugc_b8vjnqf
+ugc_x1vjqk
+ugc_bc4wv32
+ugc_yct4wq
+ugc_f226lo
+ugc_u93ede
+ugc_rn9jjs
+ugc_b1ji7r9
+ugc_10bpb0
+ugc_bsropx
+ugc_bhn9v55
+ugc_qx5xh0
+ugc_lkjah
+ugc_bvvj2lh
+ugc_dm0tib
+ugc_bdpyz1c
+ugc_rwb1xk
+ugc_b7lqfu9
+ugc_q4fwy7
+ugc_bsi1kks
+ugc_5bujp9
+ugc_3v3e11
+q3210qbx9ag
+ugc_bt42u6u
+ugc_bu10rx4
+ugc_b187yqm
+ugc_d73604
+ugc_hiqayj
+ugc_22v1gs
+ugc_byti8qk
+ugc_8tvfp3
+ugc_5qtmj9
+ugc_b6ab1hr
+ugc_v5e0tz
+ugc_xr7le9
+ugc_0dtpej
+ugc_ur6wxc
+ugc_qjr9rw
+ugc_b3m5f2s
+ugc_5qe4qy
+ugc_bjydvnb
+v3256q9v50j
+ugc_rj16fi
+ugc_k1mhy
+ugc_b70bwz7
+p32640f3lg7
+ugc_x1iby7
+ugc_tzb50i
+ugc_bshmd7a
+ugc_cmexag
+ugc_bglf14n
+ugc_rxk9b0
+w32561q27uu
+ugc_bin8n0w
+ugc_l15ypm
+ugc_xggukc
+ugc_59j65p
+ugc_k6inuo
+ugc_bqnutcf
+ugc_b3xzs5b
+ugc_kn7pq1
+ugc_bf5oj2s
+ugc_bgv9tsv
+ugc_b5lyc9q
+ugc_cf4g4v
+ugc_b6aicu0
+ugc_e84t55
+ugc_0f5ggu
+ugc_bm821yc
+ugc_b1q7ehc
+ugc_bf4bjyc
+ugc_m4eujb
+ugc_bmykae0
+ugc_598ajr
+ugc_bj4cu8y
+ugc_biftg4k
+ugc_5cn5lh
+ugc_bqrh0ok
+ugc_5dilv7
+ugc_vgdrbp
+ugc_bffp710
+ugc_pq1ckq
+ugc_b5x3ht6
+ugc_7g29me
+ugc_g3wa2p
+ugc_bj6jzuc
+l3260z2whya
+h3329lvfmd7
+ugc_xff3z5
+ugc_bpx7f3o
+ugc_bme4sj5
+ugc_74vueh
+ugc_bnya1px
+ugc_jd06fq
+ugc_dslljw
+ugc_be5dqnz
+ugc_2nc7p4
+ugc_bticbxt
+ugc_1u1ypa
+ugc_bujsg6a
+ugc_jyp0v5
+ugc_xgdxtb
+ugc_ba7jgdr
+ugc_g0t2p5
+ugc_b26o2nr
+ugc_fl3jaa
+ugc_bnfev4b
+ugc_h61hhs
+ugc_btcgwjr
+ugc_b3h45ce
+ugc_betwaow
+ugc_sofamr
+ugc_b8ou9hm
+ugc_bsnuag5
+ugc_y51zsb
+ugc_wg7hn8
+ugc_7tz76q
+ugc_4k90p9
+ugc_4nlrx1
+k3211yebjg5
+ugc_blqjv1c
+ugc_0ss2zz
+ugc_blq0msc
+ugc_b4jo02p
+ugc_7maozj
+ugc_bwplafa
+ugc_49jyu9
+r3254grijtl
+ugc_2ifwrh
+ugc_vdl1im
+ugc_xdvmtb
+ugc_bgl7k66
+ugc_z63471
+ugc_bswabem
+ugc_bv6r5aq
+ugc_bp1rslt
+ugc_b7yxuxa
+ugc_b7z2nay
+ugc_hnivvw
+ugc_bpp5lhw
+ugc_b0l2qlf
+ugc_b2ufisv
+ugc_q37pis
+ugc_br8fwh9
+ugc_bqay3j9
+ugc_9rvnmr
+ugc_90awz6
+ugc_0bl8qn
+ugc_bhx48yj
+ugc_tx8xvm
+f321685m1k8
+ugc_bn35dvx
+ugc_2h0dpf
+ugc_36rj9k
+ugc_bqhid93
+ugc_bilehh2
+ugc_ufgdvt
+ugc_b6taj57
+ugc_jqdh3g
+ugc_mx3be7
+ugc_21ur4g
+ugc_6j5bwf
+ugc_vmugd2
+z3209muk4eb
+ugc_bzm5pve
+ugc_bs1k1a6
+ugc_b1z7eww
+ugc_4zwdd
+ugc_bgxziui
+ugc_blt028m
+ugc_b758rbi
+ugc_q5nh2f
+ugc_btle7ax
+ugc_byu9scf
+p32589vx6s4
+ugc_b3090e4
+b3258lav247
+ugc_oeaao7
+ugc_bz85fbk
+ugc_ejo75z
+ugc_xfiu3a
+ugc_bpae8hp
+ugc_d10e2f
+ugc_bdred4k
+ugc_4vupli
+ugc_uu9geo
+ugc_ogxu89
+ugc_bneww0
+ugc_bjgydgm
+ugc_bq7gx3k
+ugc_beptkv6
+t3209g6gxsj
+ugc_txvj1c
+ugc_bsmqx8z
+l3247ihl2o5
+ugc_bl9hzhe
+ugc_beo55ct
+ugc_4r85b6
+ugc_bl38lwh
+t32591vsz3x
+ugc_7swby9
+ugc_42p332
+t3209g6gxsj
+ugc_txvj1c
+ugc_bsmqx8z
+l3247ihl2o5
+ugc_bl9hzhe
+ugc_beo55ct
+ugc_4r85b6
+ugc_rhrwkn
+ugc_bl38lwh
+ugc_fmcsoi
+t32591vsz3x
+ugc_7swby9
+ugc_42p332
+ugc_bq7gx3k
+ugc_beptkv6
+t3209g6gxsj
+ugc_txvj1c
+ugc_bsmqx8z
+l3247ihl2o5
+ugc_bl9hzhe
+ugc_beo55ct
+ugc_4r85b6
+ugc_rhrwkn
+ugc_bo2e4e8
+ugc_bl38lwh
+ugc_fmcsoi
+ugc_bh5c5z5
+t32591vsz3x
+ugc_7swby9
+ugc_42p332
+ugc_smpejj
+ugc_2fl0on
+ugc_wu9f1w
+ugc_b4y7fn0
+ugc_brokn5
+ugc_bcb1c7o
+ugc_b5by0pf
+ugc_b1i7osz
+ugc_txyg43
+ugc_3h10om
+ugc_xsq5le
+ugc_b5pkl68
+ugc_b81b5f0
+ugc_xikpyj
+ugc_b4vwnzv
+ugc_f0jmwn
+ugc_b6dsuya
+ugc_byaywyq
+ugc_bvcdu77
+ugc_bqo3ei9
+ugc_bnsngo1
+ugc_9irk1e
+ugc_fvts6t
+ugc_3if56x
+ugc_7w7w19
+ugc_bhf9hmp
+ugc_7xt9jr
+ugc_pzmxrd
+ugc_bsrrmly
+ugc_brg0mi7
+ugc_bk0ylok
+ugc_b3jrc0s
+ugc_bqi9yii
+ugc_suzzdb
+ugc_bipcp53
+ugc_20ctvn
+ugc_4gb25c
+ugc_bu3h94h
+ugc_7wbpnd
+ugc_bicrkx0
+ugc_5fezez
+ugc_yxqlwc
+ugc_ze1dik
+ugc_cmezo5
+ugc_9yg64w
+ugc_ba38hay
+ugc_b5nf3uq
+ugc_bnyoly9
+ugc_b257kz7
+ugc_biq4l8o
+k3329gm90zp
+ugc_bwokj0y
+ugc_bkjf6ow
+ugc_rutowq
+ugc_bu6tqhq
+ugc_baszfz2
+d316115fnlk
+s322343f4c4
+ugc_b830os6
+ugc_bh8nbwo
+ugc_m9bel4
+ugc_04kdh1
+ugc_b2ignor
+ugc_bvvszg6
+ugc_tr9lay
+ugc_kqlf29
+ugc_bloqvl0
+ugc_ouxesu
+ugc_bovxsw9
+ugc_b10szna
+ugc_btdcqnh
+ugc_blktf81
+ugc_b064mf3
+ugc_batp0ii
+ugc_pduu43
+ugc_k96yvl
+ugc_bl5wif7
+ugc_b7nysy2
+r3264gqangc
+ugc_bs0elr1
+ugc_k5uynp
+ugc_bboozyk
+ugc_jw4ibq
+ugc_bc77xcy
+ugc_bbyamtq
+ugc_bgu2n68
+ugc_6lzw48
+ugc_b5hpz1x
+ugc_b6t4rdc
+n3253d4qkli
+ugc_ctesi4
+ugc_bdoxbg7
+ugc_bg50iiw
+ugc_0ucu9e
+ugc_bplu4xj
+ugc_b418eua
+ugc_bzhxqb8
+ugc_msrgez
+ugc_byxgmzr
+ugc_bzyvvhb
+ugc_buz7e09
+y33299jhb1z
+ugc_b60rsfv
+ugc_bc57w86
+ugc_h118co
+ugc_b0q16r4
+ugc_tfdqdi
+ugc_b2q4x1x
+e3329bmq0pa
+q3329z25d6n
+k3329d8fn07
+ugc_huq5m
+ugc_3w6cds
+ugc_bndqiqa
+ugc_6mcl49
+u3239a18wrm
+ugc_bvznlbd
+ugc_bzhoq2e
+ugc_bekcvjz
+ugc_bmpay3t
+ugc_3r38pi
+ugc_bw53sfq
+ugc_bcy4gco
+ugc_bg2s0pj
+ugc_lmoc6g
+ugc_b0qwog8
+ugc_uh468t
+ugc_brv3mrj
+ugc_bu2obzx
+ugc_k7i9ls
+ugc_bvoy67n
+y3329jbn2tn
+ugc_03v4fy
+ugc_b66oq5t
+ugc_brn61gc
+ugc_bpdqend
+ugc_b2el7ta
+ugc_w97nu3
+ugc_bstrxxx
+ugc_9dp9c
+ugc_bx9v12b
+ugc_bklim2x
+ugc_bhv9zmx
+ugc_vpgz0p
+r32511qidq8
+ugc_bkgcxqt
+ugc_stqqxx
+ugc_bfjtogi
+ugc_x6tzih
+ugc_qirclo
+ugc_e814hk
+ugc_iosuhx
+ugc_cejcw5
+ugc_rirn7p
+ugc_shlffn
+ugc_e8r7nz
+ugc_swmsgo
+ugc_br2w2of
+ugc_7gn7jm
+ugc_dn13s5
+ugc_8lr7yk
+ugc_hyqkfc
+ugc_buikaef
+ugc_qmmvrr
+ugc_99qhe
+ugc_iv9msi
+wxv_2327939767277010945
+ugc_924o6g
+ugc_biglo1a
+ugc_bqt33s6
+ugc_b8i1hb5
+ugc_lfcksn
+ugc_b09tr93
+ugc_ggaljx
+ugc_jdlzaq
+ugc_bc72bsu
+ugc_jgukb5
+ugc_bnr12p1
+i3226z7qj95
+ugc_bzsdhhk
+ugc_b0cbhnw
+ugc_bpwpxc2
+ugc_16rtxt
+ugc_tgs0pw
+ugc_bc0yjhp
+ugc_bilpti9
+ugc_3mv1h7
+ugc_1ffuse
+ugc_wjryzg
+u3227z8nnzc
+ugc_bwllbi2
+ugc_h0jjub
+ugc_bb9fh57
+ugc_bcs9klv
+ugc_baay74w
+ugc_ww89lh
+ugc_bsj3rai
+ugc_b2uyvtt
+ugc_blhh0x2
+ugc_7x4mif
+ugc_vy64dl
+ugc_bi3cjqg
+ugc_boaelfu
+ugc_mqkiem
+ugc_iliuzq
+s3236n6vk4l
+ugc_0j0atc
+ugc_bbftkik
+ugc_8keuhk
+ugc_m8q30m
+ugc_t5oqcc
+ugc_b73b57p
+ugc_7i8hey
+ugc_be51kwb
+ugc_bbepal7
+ugc_bhjrb75
+ugc_bx591i2
+ugc_bnil3mw
+ugc_072o1m
+ugc_bl0ja6r
+ugc_tlkna5
+ugc_0si95m
+ugc_ghycfx
+ugc_wtsy9o
+ugc_bgz6von
+ugc_bcfgega
+ugc_hqnmzd
+ugc_bvvw7c2
+ugc_k9sks3
+ugc_oi5lnf
+ugc_p2k391
+ugc_g56b9y
+ugc_bnnlof0
+ugc_pk2g4g
+ugc_9tzbo6
+ugc_blg83vu
+ugc_bvkbk5i
+ugc_3n073k
+ugc_b2qxx9v
+ugc_99kav
+ugc_gx77or
+ugc_b0od4l6
+ugc_btzc3y0
+ugc_bpfz8q6
+n3204me46l4
+ugc_dstxmo
+ugc_bfv63p5
+ugc_b041yg5
+ugc_bknm63p
+ugc_9cgp79
+ugc_7l2z88
+ugc_bblj18w
+ugc_ba6qjpg
+ugc_47vtc9
+ugc_bb9jrrv
+ugc_bmw32bk
+ugc_czgyo5
+ugc_n7zu53
+ugc_e4ra34
+ugc_b4oe52a
+ugc_d8vasc
+h31614ss50a
+ugc_b8e8ff3
+ugc_cz6h8j
+ugc_bctw61t
+ugc_8b21yx
+ugc_5jui8m
+ugc_btu581j
+ugc_3rt62s
+ugc_toxxsd
+ugc_7z7lcz
+ugc_bdlv3n1
+ugc_bydqsib
+ugc_m2tz8n
+p326440gclf
+ugc_bbmv6wv
+ugc_3h65s5
+ugc_8iff21
+ugc_4pgxq5
+ugc_blnmbwa
+ugc_sbjo9q
+ugc_b50bsdz
+ugc_139nfb
+ugc_cb0obj
+ugc_4ci3x0
+ugc_bnda4aa
+ugc_h52304
+ugc_gjycuo
+ugc_jdfhh0
+ugc_36oahs
+ugc_baab8xw
+ugc_b2pggtb
+ugc_btnldh6
+ugc_bnpeqoj
+ugc_bh92jb1
+ugc_b27wpi2
+ugc_23nit4
+ugc_1cu1cv
+ugc_busykb1
+ugc_b8wuhds
+ugc_nxc0gt
+ugc_jl7gax
+ugc_ba5webj
+ugc_1aaasb
+ugc_2c5z6e
+ugc_bcf0gl7
+ugc_4opxg6
+ugc_nfsxi1
+ugc_zmu3hq
+ugc_ijdr46
+ugc_ylvctr
+ugc_b7xkn47
+v3229lbgv9b
+s3239cn1li7
+ugc_3pjr5d
+ugc_bu3c37l
+ugc_b66j2j7
+ugc_bys9i07
+b3253vug4tk
+ugc_btcvye
+ugc_gyumyq
+ugc_bjezgf7
+h3256dxogfh
+ugc_5iuk85
+ugc_bpnlcpl
+ugc_08lyfz
+ugc_bmhfzeg
+ugc_hli1a3
+ugc_b82q2fj
+ugc_byj6k3
+ugc_wvycqq
+ugc_qv9uo0
+ugc_378p14
+ugc_bjc904m
+ugc_brvqtcb
+ugc_9dgtb5
+ugc_bns1ccu
+p3264pj6582
+ugc_fyil99
+ugc_fs55ub
+ugc_rgnkj8
+ugc_08jgwe
+ugc_84j3um
+ugc_6bbey7
+ugc_rdxhsr
+ugc_fa7c8g
+ugc_ghs5pu
+ugc_b5vdjab
+ugc_bzjj2nh
+ugc_70pxpl
+ugc_bfwt0ll
+ugc_h1531z
+ugc_ba1sr48
+ugc_bx78a8q
+ugc_58o4xa
+ugc_bxnm5tv
+v3255x25zda
+ugc_jczyxh
+ugc_k2kt23
+ugc_bdu2f3w
+ugc_jk2ok
+ugc_bqlc8s0
+ugc_bp24iog
+ugc_boyf0am
+ugc_daiqyn
+ugc_r21h8o
+ugc_s8h9bv
+z3244zbjtbk
+ugc_rd82fl
+ugc_b5g1ewz
+ugc_bld2u59
+e3260irc74g
+ugc_bfjytg4
+ugc_m9ldzw
+ugc_tp2lga
+ugc_bm700ml
+ugc_bcmqrwr
+ugc_bqw62jk
+ugc_b8q3vml
+ugc_b0k0zsh
+ugc_bmlypqj
+ugc_bqlwpvr
+ugc_bh7fczd
+ugc_z61705
+ugc_y4f06n
+ugc_bexrurt
+ugc_rbo791
+ugc_6ow6um
+ugc_btzuvqo
+ugc_bxrphff
+ugc_br8nqbv
+ugc_xi56m1
+ugc_ior26a
+g3240w44322
+ugc_o8w93i
+ugc_bczk7hk
+e3251zhv3di
+ugc_b142lo1
+ugc_bdql4pc
+ugc_bsu6656
+ugc_bcwwym0
+ugc_zwncc
+ugc_365me1
+ugc_ttpfw6
+ugc_k80qdb
+ugc_k2abby
+ugc_brujyeq
+ugc_bf7x5vp
+ugc_bgoa0nz
+ugc_bgtl059
+ugc_r7j4r2
+ugc_b2pvp5o
+ugc_byvtyjv
+ugc_uvzu0d
+ugc_buc6ph5
+ugc_bx5x0hw
+ugc_fckqq9
+ugc_bumv510
+ugc_y4lapy
+ugc_ixiciz
+ugc_hupd4a
+ugc_b5h5yey
+ugc_n5hxb
+ugc_d1dw97
+j3256671u13
+ugc_twt6ty
+ugc_stxja0
+ugc_bx97t94
+ugc_b0x89p8
+ugc_uc2rlh
+ugc_bteq7oj
+ugc_ksx8k2
+ugc_lvgy2p
+ugc_8k5eod
+ugc_bi3tzwq
+ugc_bbyx8v7
+ugc_sf0rph
+ugc_bjp1sgj
+ugc_bd0y7lw
+ugc_6dam76
+ugc_b5i9vv5
+ugc_biw4zfr
+ugc_bctvbqq
+ugc_44b0xe
+ugc_biw1tb7
+ugc_0d6368
+ugc_bx4v021
+ugc_b2966w5
+ugc_bcdh45p
+ugc_oiyry0
+ugc_bb1kzck
+ugc_birto9n
+ugc_b78e1ld
+s3263o0hqkt
+ugc_381e73
+ugc_bkekm9v
+a32375omn8l
+ugc_fy4mtq
+ugc_bbfjygr
+h3232d2zjto
+i312878lmvg
+ugc_b61b488
+ugc_bvxofzm
+ugc_9fwzjv
+ugc_elioua
+ugc_boig5nh
+ugc_3jkc01
+ugc_had1j0
+ugc_bs30gbm
+ugc_b5ink36
+t3251e0gapb
+r3244pvcg67
+ugc_bw0imgh
+ugc_vnt0wq
+ugc_4c2cpd
+ugc_p3k5ls
+ugc_bz4jqa2
+i3163ytgwei
+ugc_gf3bwa
+ugc_33eed
+ugc_o7bhzv
+ugc_b8aese
+ugc_b14l51u
+ugc_s0ibpg
+ugc_bt21nat
+y32195tjwwd
+ugc_bq17ut3
+ugc_xvvif9
+ugc_ehbox1
+ugc_uytva4
+ugc_b9avjt6
+ugc_bzp5fsg
+ugc_b5886sz
+ugc_sjua8b
+ugc_bhvb104
+ugc_18e7xk
+ugc_4oqq7s
+ugc_yb4ket
+h3237833fof
+ugc_0g3lfz
+m323265re9p
+ugc_s2z6vp
+ugc_8mvgyh
+ugc_b5xg3qj
+g3226gv27ia
+ugc_1ssfam
+ugc_bbrf0az
+ugc_bsauo1y
+ugc_3bf26i
+ugc_szmcxg
+ugc_bosm64v
+l3252u3toee
+ugc_et6e52
+ugc_q7ejae
+ugc_9la46p
+ugc_69nomu
+ugc_ogcfzx
+w3225xm75l5
+ugc_b1ofao0
+ugc_2490fq
+l3234me6z6p
+ugc_oih34l
+ugc_b5jzddl
+ugc_xmetnw
+ugc_b68kk5j
+ugc_jy5hs4
+ugc_b7twfxw
+k3268pkkevo
+ugc_b7ayhsp
+ugc_b40h1il
+ugc_bb9aeiw
+ugc_bv5a3hi
+ugc_9bn7nl
+ugc_bz9yxi
+ugc_b5mnvbb
+ugc_6amsvr
+ugc_bu3sl3x
+ugc_biz0fm3
+o3239zu0qvi
+j32395r3fuk
+b32213tqhxv
+ugc_cw4r85
+ugc_b5pqst8
+ugc_lp1zgh
+g3264wwxy88
+ugc_l1xuwb
+ugc_l05ugl
+ugc_cyqpvl
+ugc_npwltf
+ugc_bycz78
+ugc_y0690g
+ugc_bg6etqt
+ugc_bd6mkkm
+ugc_wwc328
+ugc_bdb2s8a
+ugc_bvu4ast
+ugc_bs69l23
+e3221mx599p
+ugc_r7dw0t
+p3245w6ms0r
+ugc_b6t9wxl
+ugc_6wvmrq
+ugc_bv9qpyy
+ugc_buk47zt
+ugc_bs2rxw1
+ugc_sn19ag
+ugc_3v29c0
+ugc_bm15jqm
+ugc_u68r0s
+ugc_bdnv545
+ugc_vk48tb
+ugc_0aixb6
+ugc_b2pbj0v
+ugc_bh7ipby
+ugc_bnluo3a
+ugc_00pz42
+ugc_bpuvi6l
+ugc_50bbb8
+p3248v7848k
+ugc_0l1vhz
+ugc_b8961lk
+ugc_bah1jbq
+ugc_b0diaqb
+ugc_bfig5re
+ugc_f08ffo
+u3257vi36xn
+ugc_b3ny56t
+ugc_emw49z
+ugc_t4u90u
+ugc_7oauvp
+ugc_bl7rvtt
+ugc_bdj24in
+ugc_7e1tlo
+ugc_b0jh51h
+ugc_m7lcc7
+ugc_k3a3tp
+ugc_bl9kq20
+ugc_cpeo1f
+ugc_o6su9z
+ugc_dj0wyi
+ugc_biykxlu
+ugc_bmfx0fz
+ugc_nx2upc
+ugc_bvxuwy0
+ugc_bwnsx30
+c3233n705em
+ugc_b43izb8
+ugc_brbt1n
+ugc_bq8wa15
+ugc_y0x6vm
+ugc_b64ez10
+ugc_bsjtmt
+ugc_0wcakn
+ugc_isp7yq
+ugc_rxzmor
+ugc_bhicdwb
+ugc_bcwmy6a
+ugc_bmo5mhk
+ugc_bjbfpzb
+ugc_bm5qaho
+ugc_bdbk5fz
+ugc_z8rmyp
+l3240edlodb
+ugc_lfqn9b
+ugc_bfed4kl
+ugc_b3yxtzl
+g32087vc4t5
+ugc_bsed3ab
+ugc_b34ljri
+ugc_8tka2o
+ugc_hnxtp4
+ugc_bbjq721
+ugc_b3yra0r
+ugc_uoaq4f
+ugc_btwu4p1
+ugc_i71d8d
+ugc_s3y1cj
+ugc_b1odkg0
+ugc_b26ljuq
+ugc_et13y5
+m3222hn4a3j
+g3255hh0yd1
+ugc_l0d8m7
+ugc_0xqdas
+ugc_dkqrm4
+ugc_osur8u
+ugc_pxolwb
+ugc_be841fi
+ugc_50fsud
+ugc_b8lll7v
+ugc_86wre6
+ugc_luhha3
+ugc_08k926
+ugc_bd5pf8
+ugc_b8fucv7
+ugc_uvposl
+ugc_hctn9o
+ugc_bnjr5g7
+ugc_bca4f23
+t3203eso3t7
+ugc_bodffoe
+ugc_bb56d7u
+ugc_ypaep4
+ugc_yvxmdv
+ugc_bsqf43m
+ugc_b2959uu
+ugc_0ru7su
+ugc_bi962at
+ugc_bk3i3sa
+ugc_4nk62j
+ugc_byxem54
+ugc_b1v9f6v
+ugc_b53h4l2
+ugc_bb0kv6y
+ugc_8tdop3
+ugc_sfraoi
+ugc_b1d9xgj
+ugc_bivua7p
+ugc_b0ubklv
+ugc_86fy5p
+ugc_vvojb
+ugc_bj908ed
+ugc_bfyx6me
+ugc_375msb
+ugc_bq5raql
+ugc_y2f1s3
+ugc_k510mm
+ugc_0533qz
+ugc_6bjerv
+ugc_hfwm7d
+ugc_bzory37
+ugc_sv5x1c
+ugc_fud5tx
+ugc_bwoyqaz
+ugc_bsaulhd
+ugc_bsgtnzj
+z3236isv0f6
+ugc_b2wa3e1
+ugc_bjh3jbt
+ugc_shioy
+s32303u79n8
+ugc_bpladky
+ugc_rwccjp
+ugc_bmlpsbu
+ugc_b54iq6d
+ugc_bws4pkw
+ugc_86ug6b
+v3267y7h6cp
+ugc_0t8xxy
+ugc_b0zlsjr
+ugc_sb2vza
+a32536mi311
+n3265xfptcy
+ugc_fze3zd
+ugc_b25ag21
+ugc_b2wn4uc
+ugc_b572qn
+ugc_b061jzw
+ugc_bow0l4z
+ugc_bkvq1xy
+ugc_b40hvhm
+ugc_v24n4r
+t3242koupwk
+ugc_bjzn3fz
+ugc_b3ezkyn
+ugc_7lxuut
+ugc_o7j9oc
+ugc_dypq9l
+ugc_brbif5a
+ugc_7ged7b
+f3239zwa9cy
+ugc_ntte02
+ugc_x0ebdv
+ugc_vs7w08
+ugc_bxh4oi3
+ugc_9z3g58
+ugc_b51txf7
+ugc_m2zvfq
+ugc_bfifvfx
+ugc_bizootu
+ugc_bizootu
+ugc_b85171c
+ugc_b33jdiy
+p3252eg4sv1
+ugc_llkn06
+ugc_bu6p0gx
+ugc_16g9zm
+ugc_s4psze
+ugc_bs82id4
+ugc_bs82id4
+ugc_b46d5k0
+ugc_bb3tqh7
+ugc_b8fx9uq
+ugc_iibude
+ugc_beasylw
+w3247zvq8ej
+ugc_eushn5
+ugc_b6wizjq
+ugc_80h2pz
+s3260d52rne
+ugc_0k6crm
+ugc_bdvu7t5
+ugc_bhkkg29
+ugc_bzabt0s
+ugc_bphhfrl
+ugc_b1ym20c
+ugc_um2poc
+ugc_t1hz22
+ugc_kydk5p
+ugc_cme7cm
+ugc_l7mqa0
+ugc_bizsug
+ugc_bq5ikml
+ugc_p1kly
+ugc_bipxmey
+ugc_bsdizuk
+ugc_hq4fh0
+ugc_tjqlq1
+ugc_1fnem7
+ugc_bm733kl
+ugc_htgo7c
+ugc_g5mslk
+d3267l05itz
+ugc_o4s1z
+ugc_bnhn8xk
+l322951aubj
+ugc_dw41a5
+ugc_bzw0f42
+ugc_07lc6g
+ugc_e3lj11
+ugc_bqcfzl7
+ugc_b2humom
+ugc_b1rl455
+m3217545k08
+ugc_b6ttfcd
+ugc_nhuhwm
+ugc_b49dgl1
+ugc_4hbse4
+ugc_bioocrx
+ugc_ebndlk
+ugc_br0h4ij
+ugc_s916hu
+ugc_bp8375i
+ugc_4fpk2p
+ugc_1g5dts
+ugc_bktsg6o
+ugc_eav0k2
+ugc_bn4vdsg
+ugc_b5jkn1
+ugc_p2axfz
+g32551d6f9q
+ugc_bsnfu6y
+ugc_kiznbh
+ugc_bhjk7yp
+ugc_bbxdixv
+e3242axn9jw
+ugc_bcp2ffo
+ugc_lztv7f
+ugc_bq4489r
+ugc_5qre4b
+ugc_lielfx
+u32412fe4ow
+a3233jwyg40
+ugc_bhp4hz9
+ugc_b2cpl8r
+ugc_tsakuw
+ugc_ba8m66l
+l32451iu4qn
+q3245izlzud
+ugc_bfx3mu4
+ugc_b18iove
+ugc_bkmeiv1
+s32374xgz4f
+ugc_b034o12
+ugc_b1lb6sv
+a3259pgcndg
+ugc_ga7ygr
+ugc_boq7bek
+ugc_b6o4n85
+ugc_ss8xq5
+ugc_bhjhw1d
+ugc_561h74
+ugc_200l7m
+ugc_5ptk96
+ugc_o6l8lz
+ugc_0iyibw
+ugc_bwj305j
+ugc_bh07hhe
+ugc_ba9scwx
+ugc_bv955gg
+ugc_ebd2ry
+ugc_175oyj
+n3260pqctyp
+v32218jbuyq
+i3251ew5hqi
+ugc_b2k6wp4
+ugc_bqxfztk
+ugc_b9aaq5d
+ugc_2dtqdh
+ugc_omr4em
+ugc_6rm2p1
+ugc_b85hrtv
+ugc_b5z1bq
+ugc_bk5e0lu
+ugc_bqnvge1
+ugc_p6vxwz
+ugc_mbkdjj
+ugc_12alp7
+ugc_gpwz83
+d32571c47pl
+ugc_bl8s0hd
+ugc_n3s8vn
+ugc_ofc5xp
+g3165qrmh0h
+ugc_b1byej0
+ugc_btlmu6f
+ugc_biswhzg
+ugc_p1wtpi
+ugc_bucqdfw
+l3257fa8yk0
+ugc_9wt3sd
+ugc_ks3gw5
+ugc_b6v6gkf
+ugc_7wilt1
+ugc_eh3vk9
+g32462tsyin
+ugc_bfrjf5b
+ugc_bdedexd
+ugc_bzj4a87
+ugc_beepwcc
+ugc_92rv2g
+ugc_bzw4w4h
+ugc_8wcjfd
+ugc_bheeujo
+ugc_7669pt
+u3234g2clgp
+ugc_bzdabng
+ugc_bwvmfy0
+ugc_yvsbqp
+ugc_bebzr2j
+ugc_57gy9z
+k3153io24kn
+ugc_b4rvgdl
+ugc_b3b46q9
+ugc_blc511u
+ugc_bjvufjs
+ugc_8azqgn
+ugc_bqkepmn
+ugc_1djn1y
+ugc_qkj8uw
+ugc_bnur8k2
+ugc_bj4mjwo
+r3267xv61qm
+ugc_d6es9t
+ugc_ffetqi
+ugc_k6sl0t
+ugc_6e30m3
+ugc_b7jdft1
+ugc_bp6l6iy
+ugc_3ambw
+ugc_b74rs89
+a32315sfx0k
+ugc_bt92w5a
+g3249n3osuh
+ugc_bmv09zj
+ugc_bxmvcsm
+q32205xekqy
+ugc_b6dq5o7
+ugc_cxsh5j
+ugc_b3g82uv
+ugc_eocaw7
+ugc_bl2qjj
+ugc_b0ul1fs
+ugc_uuy78o
+ugc_jqim3u
+ugc_zz00kv
+ugc_bot588l
+ugc_b7z4nrd
+ugc_bm55bjv
+ugc_pf2fxo
+ugc_bauwifp
+ugc_wbvog7
+ugc_7ykyuk
+ugc_mdm9ms
+ugc_v34ajq
+ugc_5lqlfx
+ugc_karu6l
+ugc_bj6dkdw
+ugc_qfypr6
+ugc_s7prqs
+ugc_bguypbg
+ugc_bi823n2
+p32430nrkug
+ugc_jvrdhz
+ugc_bhatfxl
+ugc_tu18yb
+ugc_bhmdbkf
+ugc_bkeb1pe
+ugc_bnecjfv
+ugc_bf25agj
+ugc_budhgcb
+ugc_tpl6cd
+ugc_qjzrhd
+ugc_bxbewvb
+ugc_bxankmr
+ugc_bfsrmix
+ugc_p01x36
+ugc_8pb3jh
+ugc_c6k791
+ugc_cprkc
+i325636i69s
+e3244r14fkd
+ugc_i50di7
+ugc_b6huvkh
+ugc_zi8mm6
+ugc_dj2rky
+ugc_1g9kuj
+ugc_nzxu4o
+ugc_bjfqr6r
+ugc_bs8wtq2
+ugc_6upes9
+ugc_bn75moc
+ugc_li085p
+ugc_b8dqz77
+ugc_buj10iq
+ugc_qdq9qx
+ugc_brir4m7
+ugc_bexd6y8
+ugc_8dvmiw
+ugc_b3n7ml6
+ugc_m77olu
+ugc_bbad0r9
+ugc_6dozxe
+ugc_bco7fqy
+ugc_b8fvwaw
+ugc_vsjgcn
+ugc_hg4w50
+ugc_18jh72
+ugc_h6v851
+ugc_w90gwo
+ugc_b89n5m8
+ugc_blimcg8
+ugc_tc2bxy
+ugc_bqwu3px
+ugc_hk3zcx
+ugc_biy2yex
+ugc_j8p44y
+ugc_b0658kv
+ugc_bylqik2
+ugc_r8x6ev
+ugc_5tq4wr
+ugc_bljd9h0
+ugc_wf1qmx
+ugc_b6i9pvg
+ugc_gi3vrl
+ugc_bg8ey8t
+ugc_96ca31
+ugc_80k00g
+ugc_nhwe55
+ugc_4z5yyz
+ugc_bppzbrm
+v32421dxorb
+ugc_inm4pt
+ugc_bmy42x
+ugc_gldo3w
+ugc_byham87
+ugc_bht9oc8
+ugc_ow5stq
+ugc_9f2efu
+ugc_2j2cus
+ugc_bmpyhck
+i3240dgoyh6
+ugc_uuqo5h
+t3254kj5hq2
+s3266blc8qu
+ugc_b2h5ot9
+q3242abctz1
+ugc_qer2kp
+ugc_b4f7ijr
+ugc_bkv6rns
+j3241jk6k41
+k3240y8cx1l
+ugc_f97jmz
+p3261al7h30
+ugc_mameom
+ugc_gfhuuf
+ugc_bl8yztj
+ugc_4sxzhe
+ugc_rfqc46
+ugc_b2vytdq
+ugc_wkefvp
+p3228wogkh0
+ugc_nzw86z
+ugc_bbvzwtf
+ugc_bn21yhy
+ugc_iulv8f
+ugc_b4jwluv
+ugc_bhn0nyw
+ugc_b2twux4
+ugc_b2vtnfw
+ugc_2wvutn
+ugc_dht4hj
+ugc_lt3
+ugc_bqn5a70
+ugc_v6f7wx
+ugc_mc2oem
+ugc_ezbt3q
+ugc_cqcasq
+ugc_blyusu5
+ugc_m6f8kc
+ugc_bpk0mnj
+ugc_b39hb2o
+ugc_bda3uye
+ugc_ddmxh4
+ugc_bfk7ro
+ugc_b3g3ngn
+ugc_bqx6jei
+ugc_o0ljes
+ugc_rt1nr1
+u3263dm7a7i
+ugc_06yagp
+ugc_l74tmo
+ugc_bwwase8
+ugc_ba8z3op
+ugc_blfsrpe
+ugc_bovrl1f
+ugc_hm0ubl
+r3261uvckps
+ugc_9382d
+ugc_zg4lki
+ugc_g6lcfw
+ugc_81idqn
+ugc_bracr0l
+ugc_8ohasm
+ugc_w77jeb
+ugc_bfkejtv
+h3161eqsetv
+ugc_971n99
+ugc_1pquzb
+ugc_bbhznef
+ugc_4lgjos
+ugc_bwslfkz
+ugc_gmd5aa
+ugc_e6zyxe
+ugc_b5x1osm
+ugc_jqj6as
+ugc_b1ggcyx
+e32397wd1lv
+ugc_bc029zn
+ugc_0s0s2y
+ugc_dnlhcq
+j32493bizo7
+ugc_biptmj9
+ugc_bmlv4dc
+ugc_bhw85ky
+ugc_b86dh5i
+ugc_bcuf5j4
+ugc_br7mcqp
+ugc_bw3o90k
+ugc_mw6onh
+ugc_b2ezq9r
+ugc_nrwaoy
+ugc_br7pnh6
+ugc_vlf1sw
+ugc_b0izvk9
+ugc_g9yz8a
+ugc_c40ww2
+ugc_b2h5efn
+ugc_b257zvb
+ugc_bx11w64
+ugc_b5k8f1o
+ugc_bxc0dmh
+ugc_bm4o2ad
+ugc_7nscpj
+ugc_n4rhep
+ugc_bw4gu3
+ugc_br110cx
+ugc_fsk7as
+ugc_bubwz9n
+ugc_b7epr9c
+ugc_bo7nd5g
+ugc_bwcene7
+ugc_mp81fd
+ugc_ch1tc4
+ugc_1ecrds
+ugc_8x0rfl
+ugc_xtla67
+ugc_fmz8xs
+ugc_r0b4xa
+ugc_z9nchw
+ugc_xrclxh
+ugc_blpgvau
+ugc_bt1dz4b
+ugc_qvglc6
+ugc_b1nocwu
+ugc_bhsnrh7
+ugc_1okon3
+ugc_b5vdk0o
+ugc_pzuicf
+ugc_b5efh83
+ugc_bxoc2yc
+t3232h9pdi6
+ugc_bptwg8r
+ugc_8kwhdw
+ugc_yzoxtz
+ugc_xwrpm3
+ugc_bnbcf2n
+ugc_bvya18l
+ugc_b2nbx3j
+ugc_bl3opmi
+ugc_b53165y
+ugc_ucgm94
+ugc_ksjqh8
+ugc_bdihyf6
+ugc_bsu06oj
+ugc_0e8hvc
+ugc_d66xp6
+u326609gxsu
+ugc_c13kb9
+ugc_f3mcip
+ugc_bkb05xf
+ugc_bvhk4yh
+ugc_08vo0w
+ugc_bbnb8c6
+ugc_b5jfetv
+ugc_33rn87
+i32318zxrvx
+ugc_22rfye
+ugc_b38woec
+ugc_psp2w9
+ugc_bmnupl0
+ugc_e8gsse
+ugc_gu5hvl
+ugc_b1sd89d
+g32014u9kwd
+ugc_bp3qa8k
+ugc_b7wusi6
+ugc_b8yh0iv
+ugc_bvb095q
+ugc_nxs7of
+ugc_903wgs
+ugc_hmqpti
+ugc_7o1vtk
+ugc_qjxxsl
+ugc_upoufx
+ugc_6uh4m8
+ugc_bbcgntw
+ugc_bjlfk2g
+ugc_easa1x
+ugc_bdrd6wg
+ugc_jezvip
+ugc_b5ykdhy
+ugc_7f1hls
+ugc_zcjxmo
+ugc_bh140c6
+r3237qzp57n
+s3240p4oh39
+ugc_bforojo
+ugc_9lkocr
+ugc_bdn7bt6
+ugc_bxdbbkn
+ugc_lgfsy
+ugc_bwn1oey
+ugc_bhcmfjm
+z32318786ak
+ugc_ldwn9h
+ugc_b3yne5o
+ugc_b39406z
+ugc_b3zubzv
+ugc_bz24ox5
+ugc_m7vs1a
+ugc_b5ldz1g
+ugc_bvr8w3p
+ugc_b3x0ra5
+ugc_bcq0lxe
+ugc_kfs543
+ugc_2tuuq2
+ugc_ba9i18g
+ugc_pkahsm
+ugc_bvpnsn5
+w32027jjlu2
+ugc_du3lzq
+ugc_4g829p
+h322026j0v1
+ugc_bqqs5id
+ugc_b4fkqkq
+ugc_fpevpn
+ugc_0w8v2w
+r3264y2me8f
+ugc_bfa04g7
+ugc_19qolx
+ugc_6mxvnq
+ugc_6iqq0d
+ugc_oidgil
+t32621i20uy
+ugc_5wrutr
+ugc_f4y8bd
+n3237if8wpj
+ugc_b8baro6
+ugc_m9dfmm
+ugc_zehdij
+r323394dnki
+g3230dhjaog
+ugc_bt6w28h
+ugc_bd86tje
+ugc_bqhc006
+ugc_bgn69uo
+ugc_qi6pg8
+ugc_bdd0le
+a3221tnejmb
+ugc_7rn0j2
+z3267c124p1
+ugc_bckky93
+ugc_nve84u
+ugc_xgxw9d
+ugc_tt7c3x
+ugc_1x2ft0
+ugc_kg2ceg
+ugc_7wo1wo
+ugc_qfd656
+ugc_bnsgv8q
+ugc_brw4avf
+ugc_kksnug
+ugc_12t4fs
+ugc_9f8xr2
+i3246rnkfdf
+ugc_b37zc0a
+ugc_irn6tp
+ugc_h3o9m4
+b3241hn11yu
+ugc_c3tpg
+ugc_1rwtiw
+u3209nhx0ag
+ugc_bzweloi
+ugc_72qh0q
+ugc_xdn495
+m3210oi5f1d
+ugc_biuqogx
+ugc_0x6n7p
+ugc_btddfzd
+ugc_zfq1oa
+ugc_bzyfsw0
+ugc_wdc5rl
+ugc_gkvgbg
+ugc_bqdjcii
+ugc_ut6saf
+ugc_onugp6
+ugc_cvbyh3
+ugc_6lspne
+ugc_bk0xihu
+ugc_znjbgc
+b3164e54s4l
+ugc_x81fh3
+ugc_65kflj
+ugc_gdwjq5
+ugc_3n1yz5
+ugc_brio42r
+ugc_bjf09bg
+ugc_korqxe
+ugc_0uv3w4
+ugc_mu27t3
+ugc_iq3or8
+g32661xj5mr
+ugc_qzrler
+ugc_8vm9l2
+ugc_db23mx
+ugc_b3cycvy
+ugc_nw6ta1
+ugc_bdvu1hw
+ugc_gd2n75
+ugc_bxa3cbd
+ugc_bt6vv9p
+ugc_btv6iz3
+ugc_brzc1sg
+ugc_1kj9hw
+ugc_byfb9rf
+ugc_bybn91h
+ugc_ck3qbm
+ugc_bauvwor
+ugc_s5nb2r
+ugc_gajhjl
+ugc_s1ym2q
+ugc_bpcig2d
+ugc_hl5a3o
+ugc_c2noo6
+ugc_f0qvyg
+ugc_bphzvi9
+ugc_15nz7s
+ugc_bbj76vh
+ugc_bjw881w
+ugc_bwmbl98
+ugc_ek4v6a
+ugc_0ako8w
+r3257tufipm
+ugc_b13h9wb
+ugc_dbhl4i
+ugc_bsntbq6
+ugc_1w5vt9
+ugc_bdpln90
+ugc_bikc55h
+ugc_lj4rtk
+ugc_bhidczg
+ugc_tyiy0k
+o3236p3rpa9
+ugc_3j7eix
+ugc_tyvnrp
+ugc_b870do4
+ugc_bvioo55
+ugc_bmxf1en
+ugc_0w64kx
+ugc_tr3g80
+ugc_10lhvv
+ugc_byvhuy7
+ugc_bpk757n
+ugc_b739fqf
+ugc_bpz149k
+ugc_br3e6ns
+ugc_73e2jt
+w3252zssvgr
+ugc_0qlmjk
+ugc_be4bjgy
+ugc_b8w16ae
+ugc_by92cc6
+ugc_b83a23y
+ugc_synop5
+t3241m2n4ed
+ugc_b0tecch
+ugc_bmwzi23
+ugc_bo712ym
+ugc_b7wx6tw
+ugc_e5pk03
+ugc_7whdcc
+ugc_ykg9s6
+ugc_mmn5cv
+ugc_1xv7eq
+ugc_tojg2k
+ugc_b2yut4p
+ugc_b6ern0j
+ugc_bc8m3fr
+ugc_r8860x
+ugc_jvz3u9
+ugc_boronkn
+ugc_041awl
+ugc_b8vvmd7
+ugc_p4qj44
+ugc_b6r19t5
+ugc_rppyfa
+ugc_bbjtpbs
+ugc_o36m0d
+ugc_9vlnkj
+ugc_h5e7yq
+ugc_b1mnyg4
+ugc_b8jl89n
+ugc_bmp5kj1
+ugc_bekqom
+ugc_bn4kesd
+ugc_w5wrb2
+ugc_s8638c
+ugc_hx0zzi
+ugc_bq2rc52
+ugc_texv0w
+ugc_iwqjhm
+ugc_8txuqm
+ugc_nzup0e
+ugc_xcyg7l
+ugc_bld16dt
+ugc_bolykyn
+ugc_nst207
+ugc_t71ywb
+ugc_ygsdvl
+ugc_bntarqg
+ugc_n48tw5
+ugc_ox5l92
+ugc_kqfh9m
+ugc_w328xq
+ugc_bngs72c
+ugc_5dg8gk
+ugc_bbol9u9
+ugc_bg5q8u9
+ugc_er58ll
+ugc_b6u2q2i
+ugc_bouyxne
+ugc_bwtnuxh
+ugc_b2o67v7
+ugc_bks859i
+ugc_61q69d
+ugc_qesr1k
+ugc_bolbx0v
+ugc_wwiruz
+ugc_b0b6qbv
+ugc_bexe5ya
+ugc_bt1oi0f
+ugc_netjhu
+ugc_n1bssk
+ugc_b4clrie
+ugc_1197zo
+ugc_eiytz6
+ugc_pt996s
+ugc_5a5x4l
+ugc_bom718j
+ugc_d00h6q
+ugc_b5uew7s
+ugc_bh7pim1
+ugc_sro4nf
+ugc_hsne1h
+ugc_brb34ce
+ugc_micqin
+ugc_02ur86
+ugc_0ngwxp
+x32512njbo5
+ugc_k4ccwf
+ugc_eccfie
+ugc_b08rt8j
+ugc_bxwrozg
+ugc_byqzewv
+ugc_bzrw8fs
+ugc_8txtmz
+ugc_bneff5d
+ugc_blzkwf0
+ugc_jmijcl
+ugc_b2qqzzv
+m3157ts7s54
+ugc_14mv1y
+ugc_brsvqh
+ugc_b2ebkz2
+ugc_u3pv98
+ugc_9a8okf
+ugc_9wj3z7
+ugc_b3jm4ny
+ugc_2cqbeg
+ugc_rd9in
+ugc_tr5e00
+ugc_bndndhp
+ugc_b3ai2nr
+ugc_8jn9vz
+ugc_eg6wx0
+ugc_pfy7aw
+ugc_b0yaxf8
+d3239g7seaz
+f3240gl6jvz
+ugc_1lktpx
+ugc_94nj6f
+ugc_e18eak
+ugc_jfvgit
+ugc_r4zc2m
+ugc_bwu8ljt
+ugc_bkj5ryr
+ugc_6lx3gq
+c3254c5zjm7
+ugc_b0qa5gf
+ugc_bdqyg9o
+ugc_bbpu8fx
+ugc_v4yelb
+ugc_bwshr9m
+t3216c7z5re
+ugc_yt4ldz
+ugc_0ge79c
+ugc_9ag2pm
+ugc_b0f3qun
+ugc_bxrlwe4
+ugc_bn0j1rj
+ugc_byg4c7n
+ugc_762978
+ugc_9ujklf
+ugc_b2zxyuu
+ugc_b8mw0kx
+ugc_b5qx639
+ugc_7cl88g
+ugc_bt02i6g
+ugc_bwlpeoz
+ugc_vyysir
+ugc_4i2g50
+ugc_bam722h
+ugc_b4kalkc
+ugc_blc1o8e
+ugc_bvxv0sz
+ugc_bgytc80
+ugc_blsblp0
+ugc_brs0xt8
+ugc_b4n3m6b
+ugc_1w77ap
+ugc_bkoypsr
+ugc_zks1w3
+ugc_k8iqsm
+ugc_bakrg1k
+ugc_by5z4bs
+ugc_xj6xas
+ugc_tr37fb
+ugc_b1jyh8s
+ugc_bdg1nb9
+ugc_52o3i1
+ugc_wpe0xk
+ugc_fu89v5
+ugc_bgycqaq
+ugc_bq34y8a
+ugc_b65r9ij
+ugc_z6nycj
+ugc_bjyenfq
+ugc_d3ofky
+ugc_b604r9
+o3251xw0l81
+ugc_fe5hpn
+ugc_boie3g4
+ugc_ga12jd
+ugc_bctmev4
+ugc_bbkz100
+ugc_bl5r1bk
+ugc_ng1k9a
+ugc_o235l2
+ugc_q1zc19
+ugc_b8uh2yt
+ugc_bf1gaj6
+ugc_qf8pp8
+ugc_bq0frp9
+ugc_b7q4xmy
+ugc_bm3acox
+ugc_fohzof
+ugc_83qsmx
+ugc_b27men
+ugc_bkyahh8
+ugc_b39i12q
+ugc_bloaw8c
+ugc_be83f6l
+ugc_0j6mj6
+ugc_brv58ww
+ugc_f7bt1e
+ugc_b0335cn
+ugc_bjs5tmm
+ugc_bp5pso6
+ugc_bjjm7fd
+ugc_bxmdz2d
+ugc_4gmnbx
+ugc_89z079
+ugc_bfhi47g
+ugc_sg67nr
+ugc_prdvd2
+ugc_b6k88ol
+ugc_bgmfpif
+ugc_1xp7su
+ugc_9hiwti
+ugc_br7xgiw
+ugc_6z2ogo
+ugc_8kcibo
+ugc_bimxjx5
+ugc_iu3n7m
+o3237rervbr
+ugc_9uupk7
+ugc_5k7cl2
+ugc_pbghei
+ugc_bbkces8
+ugc_bkjkut6
+ugc_b51y2x3
+ugc_9ou7md
+ugc_3x591l
+ugc_brtlhtq
+ugc_bxe57ta
+ugc_bozsh82
+ugc_beik0q6
+ugc_eenizb
+ugc_bhexium
+ugc_1pbu74
+ugc_bw05gb3
+ugc_blgqi4j
+ugc_hrlqmu
+ugc_4e6g39
+ugc_b17qbb4
+ugc_bqy9kmz
+ugc_z1ag98
+ugc_s6ma7c
+ugc_z77n23
+ugc_8ki4jt
+ugc_bc270o8
+ugc_brchtk8
+ugc_b6ejccf
+ugc_jsz9x5
+ugc_bd5jryq
+ugc_wfpomw
+n3260ajfk8r
+ugc_brcxpp5
+ugc_wjgwla
+ugc_btsxr7v
+ugc_bybxezo
+ugc_21mm93
+ugc_bco8dp6
+ugc_brky7f6
+ugc_bb3fpwo
+z3219ntie2l
+ugc_79szer
+ugc_be9ilsh
+ugc_p7xnps
+ugc_nb97zs
+ugc_bsqsvwp
+ugc_br9eqnd
+ugc_b3v43af
+ugc_0c51gd
+ugc_x9gbrg
+ugc_bilfzjv
+ugc_r6z98l
+ugc_k9xifj
+ugc_voqfc1
+ugc_bj9auyp
+ugc_b53iin5
+ugc_rb156d
+ugc_bb6xmof
+ugc_bolptuh
+ugc_bios1s6
+x32426s0hlk
+ugc_bbcgxsp
+ugc_gr8rdz
+ugc_b4mq3el
+ugc_bczp3zs
+ugc_batygfd
+ugc_bpx3z17
+ugc_z3lqgp
+ugc_0ueqez
+ugc_bown2q3
+ugc_rzqazx
+ugc_bbg3jq9
+ugc_l732x0
+ugc_n88wdc
+ugc_bi2rrqc
+ugc_7fvulj
+ugc_j1vfuc
+ugc_qrhlqm
+ugc_4ephkw
+ugc_y1kypy
+a3222ve1tp9
+ugc_k009hq
+ugc_bap7ifx
+ugc_bx06qc5
+ugc_bh6oqnj
+ugc_bugdowp
+ugc_bwyqf78
+ugc_9bqdvu
+ugc_m45nj3
+ugc_t3v56v
+x3233xp9ido
+ugc_b3fpml5
+t3253uynmeu
+ugc_14jukc
+ugc_ox6m7c
+ugc_boqbf7c
+d32295icyo3
+ugc_b5338tr
+ugc_b3v412c
+ugc_69tlju
+ugc_p5pe4l
+ugc_rrz8jw
+ugc_dvbpey
+ugc_b5wgxr5
+ugc_b7vsgji
+ugc_d4o5r2
+ugc_409dyg
+ugc_bf9xqzn
+ugc_ilc783
+ugc_x4w7kj
+ugc_rpx1iq
+ugc_bbsvxs3
+ugc_p8pobb
+ugc_bxz9btr
+ugc_is2nm2
+ugc_jmy90w
+ugc_bxm8gby
+ugc_cwtsw3
+ugc_bylpvwm
+ugc_jqq3mi
+ugc_bpxxg1b
+ugc_brcyojp
+ugc_bykduzu
+ugc_6sn0la
+ugc_bq2x82o
+ugc_hunigi
+ugc_4y820e
+ugc_08vjhh
+ugc_bvw2umc
+ugc_g275al
+ugc_9dgsvb
+ugc_i3c75v
+ugc_bz0s9bm
+ugc_pv4a8e
+ugc_br5vv2q
+ugc_c39u2a
+ugc_bq6c40w
+ugc_ban91ty
+ugc_bsosa51
+ugc_brbutlq
+ugc_brv5njd
+ugc_28dfwe
+ugc_bjddtdt
+ugc_b81wdwu
+ugc_vv3hck
+ugc_x67wrp
+ugc_pz4xze
+ugc_k7my
+ugc_vch3a7
+ugc_6xscrc
+ugc_bc297mb
+ugc_bw0w9po
+ugc_k19wpy
+ugc_bipfgg2
+ugc_bt9scty
+ugc_95kt44
+ugc_bozw8g5
+ugc_b3qn07o
+ugc_2969pk
+ugc_sw7w6k
+ugc_3rr3l1
+ugc_bruygto
+ugc_bslezko
+ugc_zywjos
+ugc_66u0k7
+ugc_blgujql
+ugc_bwcchex
+ugc_hj095s
+ugc_cip2wm
+ugc_bqyazw8
+ugc_6er9vl
+ugc_k2sii9
+ugc_jn5chh
+ugc_b1wjv8
+ugc_brxx99f
+ugc_vgw6ka
+ugc_bxz63w3
+ugc_syeemq
+ugc_gcifnh
+ugc_1kw5nx
+ugc_bwfpn6d
+ugc_f0rj2a
+o3205lxe1fw
+ugc_wf2hti
+ugc_cbhs77
+ugc_bmau58t
+ugc_dkwp5
+ugc_qr91bu
+ugc_6fqgzd
+ugc_b304e3j
+ugc_echblj
+ugc_bmt2gxn
+ugc_bhvuk9b
+ugc_qva3zm
+ugc_b86nl1i
+ugc_ba841cm
+ugc_b0ahqeg
+ugc_bhenxqz
+ugc_b0uv7ao
+ugc_bojw050
+ugc_biqfg4y
+ugc_89up8h
+ugc_buxeaho
+ugc_bkz0003
+ugc_eu94oc
+ugc_bro0v7l
+ugc_hceflq
+ugc_b82vjck
+ugc_b1cn1ao
+ugc_bxfbu8f
+ugc_bcnk5u8
+ugc_bvyxp04
+ugc_i7nxkk
+ugc_8hmvp1
+ugc_1gm73m
+ugc_br1l00o
+ugc_bmuw6m5
+ugc_5zjqtf
+ugc_2cjk7f
+ugc_b56v4ck
+ugc_bwhmrp9
+ugc_b7coktp
+ugc_bug9voa
+ugc_bkvjwo5
+ugc_8otr47
+n3233mngug7
+ugc_laiaej
+ugc_btb1cw1
+ugc_uu2h1n
+ugc_1fmo9k
+ugc_5bx3db
+ugc_btkpaxf
+t3234gzoo9d
+ugc_b1cnfey
+ugc_pedacr
+k3066b7vrm3
+ugc_3vttgh
+ugc_wx4opz
+ugc_f4xysw
+ugc_5os7xg
+ugc_bp81kir
+ugc_w7ehlf
+ugc_k5khn0
+ugc_yldi8v
+ugc_byqozv2
+ugc_bi03y0i
+ugc_bfofa70
+ugc_bis220q
+ugc_bsoiu6l
+ugc_b1qriza
+ugc_bp1gpx
+ugc_b3iu1g3
+ugc_bau87y6
+ugc_wxji39
+ugc_u73ij4
+ugc_bwfjwhy
+ugc_h5bpah
+ugc_bb71a6g
+v3218rgw0f5
+ugc_b2qit4q
+ugc_bm2osfi
+ugc_yyn8xj
+ugc_b2puaq2
+ugc_b29uqqv
+ugc_bv4qbui
+ugc_i99501
+ugc_bpv0hun
+ugc_d9s2w
+ugc_bc6vzmf
+ugc_vuwfkh
+z3212oczxu3
+ugc_j5mn59
+ugc_rdgcfs
+h3247l7w4r2
+ugc_nrs99y
+ugc_b1lhdgr
+ugc_btrbaqp
+ugc_bp6n1ku
+ugc_1jqzf3
+ugc_pk7z04
+ugc_blzrf01
+w3238d70m0p
+ugc_rlh8ip
+ugc_blx3o04
+s32230fa39v
+d324967inyp
+ugc_b3gi1rz
+ugc_buay55r
+ugc_b1x6oww
+ugc_b086y4o
+ugc_uym3a4
+ugc_zy828l
+ugc_yy7dgi
+ugc_bcwiabb
+ugc_1md0y5
+ugc_4xe0z2
+k32533dm26t
+ugc_z9r4fd
+ugc_zx44x3
+ugc_87b90t
+ugc_bin06il
+ugc_b869j1g
+ugc_xy6i80
+ugc_pxj4pi
+ugc_4thsi2
+ugc_bpt7mh2
+ugc_bsz8e61
+ugc_6z2ffu
+ugc_fjgtpu
+ugc_beuovhj
+s3248y7a24n
+ugc_wpjtxi
+h3257to05cx
+f3230uohqoh
+ugc_nhv7qj
+ugc_bmcj886
+ugc_r1y8uz
+ugc_bza4e0b
+ugc_bnux1n3
+ugc_pml5ix
+ugc_l4ili6
+ugc_29wfmo
+ugc_bq5rjsf
+ugc_bgt343d
+ugc_sad2sf
+ugc_g3w9ef
+ugc_r1vcxy
+ugc_1wq2vq
+ugc_bsbgo2y
+ugc_8nlmcv
+ugc_bxavnx8
+ugc_bmah1xq
+ugc_3uo3dq
+c324484ww3q
+ugc_bctlbkg
+ugc_bod0jo7
+ugc_6qsy2y
+ugc_eupt77
+ugc_bj7j4y
+ugc_baxbhfl
+m3244w4t8p5
+ugc_u5vw1f
+ugc_5alqz3
+ugc_bgv1lv7
+ugc_7junf7
+ugc_mkzhe0
+ugc_oweqbd
+ugc_b0y6usx
+ugc_bpz8ckh
+ugc_ba8dpww
+ugc_qv6ncs
+ugc_5d8aqt
+ugc_jk2tsr
+ugc_e60v51
+ugc_y7nea0
+ugc_bka03dc
+c3226teyqx6
+ugc_6lgalq
+ugc_3eoevf
+ugc_re2kup
+ugc_e2qn1v
+ugc_bzfq179
+ugc_zgavm9
+ugc_bvi86p5
+ugc_nwl6mp
+ugc_b44tvoh
+ugc_jd8194
+ugc_b5npc0s
+ugc_bb74z10
+ugc_bbb4sjz
+ugc_34kbn7
+ugc_bxn5cvv
+ugc_fmsqy4
+ugc_bjdmt7b
+ugc_b0v9v0p
+ugc_0h2tq2
+c3228macvql
+ugc_5fdo0i
+ugc_bpk6m7m
+ugc_p9f1ht
+ugc_b7zheb0
+ugc_bgtjpc2
+ugc_bk37qpy
+ugc_bdj9nw0
+ugc_bw0776f
+ugc_t9w9bf
+ugc_bbytn02
+n323765ka2p
+ugc_f0gvus
+ugc_bao6ddl
+ugc_bx4boyv
+ugc_br32ws2
+ugc_2xqumq
+ugc_bhlfcj7
+ugc_b4j097i
+ugc_bxrsvun
+ugc_uo5mvr
+ugc_ws1pw2
+ugc_bpdv2nq
+ugc_1mzvm4
+ugc_jocm9z
+ugc_3nbp91
+ugc_bma8m5m
+ugc_0r0x72
+ugc_bu2ybmj
+ugc_uwtmz6
+b32038r6fy4
+ugc_b76s6rk
+d3160y9zd3l
+ugc_b5skueh
+ugc_bndu8mz
+ugc_3mtj9a
+ugc_bwea7l6
+ugc_bn1v2un
+ugc_8q3ybc
+y3250k6qa77
+a3265gdkb83
+ugc_4huj2j
+t32122rea0w
+ugc_yeshsw
+ugc_n5dn2l
+ugc_xgtmm5
+ugc_kzwbg7
+ugc_k4409p
+ugc_b0tmide
+ugc_kepnya
+ugc_bedo4nd
+ugc_b1j1252
+ugc_bpmi7bz
+ugc_bayzj0g
+s3260mifhhp
+f3215kekr2f
+ugc_by1ii8r
+ugc_b1n4ta0
+ugc_5maiyy
+ugc_un57wo
+ugc_bk270fz
+ugc_bswqsf8
+ugc_tx89i5
+ugc_biv034s
+ugc_h05xgx
+ugc_bwzw10i
+ugc_bjd0w2p
+y3252y2tcm4
+z3246nveaow
+g3257bxgyza
+ugc_bhcp6ey
+ugc_k46q07
+ugc_b5v1mra
+ugc_bwrq4ah
+p3152de0bff
+n3257p0a573
+ugc_rvkw74
+ugc_24b39s
+o3230ddlcpx
+ugc_bccs7pg
+t3256lo1cmk
+ugc_byp3wzr
+ugc_cenh37
+ugc_bdoxtak
+ugc_0hme5x
+ugc_b387ot
+ugc_fiucw8
+w3268xwbyd8
+ugc_bv23lj9
+ugc_b6nnar0
+ugc_beopzrs
+ugc_banx2rn
+ugc_bdz4r22
+ugc_bjhizyi
+ugc_bmjyt03
+ugc_bs04z3t
+ugc_bz5loxg
+ugc_b6g0s6w
+ugc_l6flas
+ugc_2ttbzk
+ugc_x0dysl
+ugc_n43j0t
+ugc_bv67dvi
+u3214y8xv50
+ugc_uf30xb
+ugc_b8afzt2
+ugc_f0p2nx
+ugc_bm2qj9b
+ugc_z8fsc9
+ugc_2rjlbg
+ugc_x45yr1
+ugc_bufz4q0
+q3235er6vp5
+ugc_hizydz
+ugc_bbfq4cm
+ugc_bx7eyts
+ugc_jj87c7
+ugc_b6kclnr
+ugc_bk64ymd
+ugc_brefv6l
+ugc_bzw2dyx
+ugc_i4zlm1
+ugc_biqgen9
+ugc_ba5oren
+ugc_m8galg
+ugc_xt2q1h
+ugc_bb7z224
+p3252cxicdz
+ugc_xbmajs
+ugc_bmejn05
+ugc_1qb105
+ugc_tzrjld
+ugc_bf0ahte
+ugc_bwdb0fu
+ugc_l3qfzl
+ugc_69rntg
+ugc_81m3bg
+ugc_bbsm5o
+m3252qyh2ru
+z3241hbr8u6
+k3260ywdduo
+ugc_bjchzej
+ugc_b6e4dqt
+f3253951scb
+ugc_mhefro
+ugc_buebzzh
+ugc_bcg54id
+ugc_bodc3od
+ugc_hc5xu8
+ugc_hp21tz
+ugc_brqzld0
+ugc_54k3m2
+ugc_x0fr77
+ugc_tgnj0g
+ugc_belhwe2
+ugc_bnp37gc
+ugc_buodci6
+ugc_bdzca6z
+ugc_bke9vp9
+ugc_bcmelwp
+ugc_kvxo9q
+ugc_bw1w6md
+ugc_0w31d8
+ugc_b7yyimc
+ugc_wbtgis
+ugc_hwox0b
+ugc_csfdmj
+ugc_rych25
+ugc_djlwuu
+ugc_bbp8mb6
+ugc_beyyja8
+ugc_jfbgw1
+ugc_b7nby1e
+ugc_b1vlogp
+ugc_x80l1r
+ugc_bargx0v
+ugc_bexxder
+ugc_boqectf
+ugc_bys5kp0
+ugc_blran1d
+ugc_wzl51i
+ugc_vbn3jx
+m3263l20467
+ugc_bi4c0dq
+ugc_q9e6ul
+ugc_bz4tbc5
+ugc_dyb6cy
+ugc_44ozl5
+ugc_bxuf42l
+ugc_b3er462
+ugc_b04sa1y
+ugc_bbatt
+ugc_ksyhau
+ugc_bs2bq8p
+ugc_f3ev8p
+ugc_bob8iwf
+ugc_bjbsfj7
+ugc_bbn2s7y
+ugc_cfeh19
+ugc_bhotg2j
+ugc_bojhnfn
+ugc_j6jjls
+ugc_vaz6e1
+ugc_bs3678k
+ugc_inim4v
+ugc_bhurv2p
+ugc_1fv20w
+ugc_br0pb70
+ugc_b8108o2
+ugc_bkzrxup
+ugc_b42wsli
+ugc_b7sefie
+ugc_f9zath
+ugc_bffeud2
+ugc_b4x3qm2
+ugc_bi50yeb
+ugc_bd44023
+ugc_pvvlab
+ugc_4rnhq2
+ugc_b8lrjyf
+ugc_babo413
+ugc_bx20id9
+ugc_v1x2z6
+ugc_fldzno
+ugc_tadzae
+ugc_7fbqry
+ugc_b5lwi24
+ugc_1xe7e2
+j315029vdzp
+ugc_bs4dd61
+ugc_be6jywm
+ugc_bzzuso6
+ugc_c7i2ni
+ugc_bfjm5bb
+e3235hp7t98
+ugc_bsnzuoa
+ugc_doo86c
+ugc_br1wscj
+ugc_bf5fcfw
+b3231tdtqgt
+ugc_b6wtpq3
+ugc_bs8b3p9
+ugc_nb0cjv
+ugc_bfsu294
+ugc_bdoayk4
+ugc_g5w425
+ugc_104o1x
+ugc_jf3knc
+ugc_bergzll
+ugc_ok1x69
+ugc_bgtajz6
+ugc_1y1x69
+ugc_zadrsk
+ugc_uys8g7
+ugc_kn6dw3
+ugc_b5zyh2j
+ugc_3diobk
+ugc_bivw6cb
+ugc_bd0ht3a
+ugc_bdwtr4q
+ugc_hw54mx
+ugc_b2csi24
+ugc_u4qhnd
+ugc_bvdm8pl
+ugc_bcrmvoj
+ugc_57hb0j
+ugc_b3u968g
+ugc_e8sbwh
+ugc_4lqdnn
+ugc_buff3ri
+ugc_b8fvnya
+ugc_5golq8
+ugc_87gqyu
+ugc_b3w7s2a
+ugc_1j4gyr
+ugc_bdkvqmr
+ugc_yeqsdr
+u3242gfli2s
+ugc_bra7ef9
+ugc_bqb7qde
+ugc_7b5mzz
+ugc_x6h0t2
+ugc_bs5du2z
+ugc_phrvtr
+ugc_rum22x
+ugc_btl12r3
+ugc_6k1s0x
+m325031f24h
+ugc_yi7f85
+ugc_qzbpzh
+f3254hvvyyv
+ugc_bxn7s4x
+ugc_bgmzjo9
+ugc_w6a8le
+ugc_bisx7re
+ugc_esum52
+ugc_bqtn5nh
+ugc_ow1jij
+ugc_owoscm
+ugc_hqds66
+ugc_b7yhm0
+ugc_bcha7e0
+ugc_b7kncwf
+ugc_23squg
+h320030zj44
+ugc_b4v6n78
+ugc_bc4stz1
+ugc_byr2ojn
+ugc_ll7du0
+ugc_bh0i1o7
+ugc_bibe2ei
+ugc_t2y1c8
+ugc_jt6udr
+ugc_dwou67
+ugc_b244eki
+ugc_b63597y
+ugc_6aeuf9
+ugc_b35p324
+n3214zfvwmn
+ugc_by9daxp
+ugc_iubi3f
+ugc_oo8lqp
+ugc_55ftu9
+ugc_bwyyk6l
+ugc_boeo57u
+ugc_8nlge7
+ugc_ffj9r7
+ugc_234yqn
+ugc_1uyutp
+ugc_bj5qv8x
+ugc_bwcavom
+ugc_fp08q9
+ugc_gmef5w
+o3268trdi0k
+ugc_bdjuyv5
+ugc_zimyca
+ugc_049z7o
+ugc_bb65c7p
+ugc_ix52hb
+ugc_mxomlr
+ugc_bl7nf29
+ugc_bv4lmso
+ugc_kcsrr1
+ugc_bvvztwf
+ugc_bzm611h
+ugc_nkhevb
+ugc_b25rx8c
+ugc_b7pcdnj
+ugc_67i9ho
+ugc_3di2j0
+ugc_bbdmhvs
+f3059jgq4sd
+ugc_xfy19h
+ugc_qthqmm
+ugc_mshk9o
+ugc_s7th63
+ugc_ea4xic
+ugc_ie6zy6
+ugc_brph12g
+ugc_bgdp1xy
+z32236bjnay
+ugc_bam2yfl
+ugc_ktfbss
+ugc_bz7pe5c
+ugc_89y7j0
+ugc_prrafu
+ugc_bh57zwd
+ugc_br4exsg
+ugc_b7bapgg
+ugc_nttfsm
+ugc_bpa4qej
+ugc_box2hd6
+ugc_bdin0vf
+ugc_bdeag0
+ugc_b3u1omj
+ugc_bakk6ip
+ugc_bn6i5oh
+ugc_b0mwb86
+ugc_pm05w0
+k3321atd2ar
+ugc_lwgjui
+ugc_b2g3xok
+ugc_do9q1v
+ugc_7j65nz
+ugc_k0hykz
+ugc_bq0p6yp
+ugc_4fl7op
+ugc_uh3la9
+ugc_b0f3kzo
+ugc_bs9kewp
+e3226xhiixu
+ugc_1oxzzw
+ugc_5f325t
+ugc_bibrvda
+e3235kmnybr
+ugc_b062skw
+ugc_bu8l1n6
+ugc_gzrok7
+ugc_mk0cny
+ugc_2dazsw
+ugc_bqwhlr1
+ugc_bh9cmrp
+ugc_bk36gbz
+ugc_bxlvcsi
+ugc_o1r9om
+ugc_24n0px
+ugc_s6z9jf
+ugc_sxqznp
+ugc_b0pd5gp
+ugc_bgtd31z
+ugc_k5ae21
+ugc_bx0cjrw
+ugc_krtbjz
+ugc_bbicsxj
+ugc_e2c26c
+ugc_44545g
+ugc_bxudc0x
+ugc_wvqmov
+ugc_byqa9zv
+ugc_bsjvrx8
+ugc_b8ayrt5
+ugc_ih2ye2
+ugc_buk8zol
+ugc_0t4lcq
+ugc_9yafeh
+c3268lo5vc0
+ugc_vq41e
+ugc_bkzx6uv
+ugc_b2ey4li
+ugc_b2l5cao
+ugc_bcq8vlf
+ugc_bd6lq9w
+ugc_bwivb4m
+ugc_e8svcr
+ugc_blhwrtw
+ugc_bxgzxxq
+j3216jaouuz
+ugc_bt31sy2
+ugc_b4lnulu
+ugc_ie15da
+ugc_w10lo5
+ugc_b20qs9q
+ugc_b8gns4a
+ugc_b6899z6
+ugc_b5yuzam
+ugc_brv5b3l
+ugc_w9uwmz
+ugc_brkz8ny
+ugc_bh0jg6g
+ugc_i6xqkk
+ugc_b2rvhkt
+ugc_x2zrj
+ugc_b216yj4
+ugc_b7fiwj4
+ugc_be6fy5d
+ugc_b7i4brk
+ugc_yv6izd
+ugc_bixigso
+ugc_bet544y
+ugc_boj4eed
+ugc_b86r541
+ugc_vt7hhe
+ugc_fg6fma
+ugc_bccubch
+ugc_b9l6ke
+ugc_zy5gmy
+ugc_16dovy
+ugc_biedjyo
+ugc_lobgc0
+ugc_j7j14u
+ugc_usk84m
+h3243tpyt6x
+ugc_mnfhfm
+ugc_ueka7a
+ugc_jz8uji
+ugc_bbenmeg
+ugc_nbav7b
+ugc_bltc7g7
+ugc_zmwpmy
+ugc_jb1czu
+ugc_bcrnmbu
+ugc_91v7to
+ugc_p0mou8
+ugc_ileqn7
+ugc_b4spp50
+ugc_b16xj7d
+ugc_b3jassu
+ugc_lzyqol
+ugc_xjrce7
+ugc_bwrzbgc
+s3243l6kivw
+ugc_b0wriul
+ugc_bw0x338
+ugc_bcyi1ph
+ugc_bv884hq
+ugc_u1mnjs
+ugc_kc8okx
+r3219u4bhht
+j3259zgm3el
+ugc_97g6d1
+ugc_b371x8v
+ugc_basbm6f
+ugc_bclt4cz
+ugc_bvb3clq
+ugc_jlesg2
+ugc_q7xxx4
+ugc_b5xladh
+ugc_bw7yer
+ugc_bcjqmla
+ugc_bae7dzx
+ugc_lahcgo
+ugc_bjuwto6
+ugc_bfs7l47
+ugc_bqd4tav
+ugc_jrijiu
+ugc_q68lfx
+ugc_zezlda
+ugc_2z6vzd
+ugc_bq945sc
+ugc_buf6h4h
+ugc_bm9qm5t
+ugc_0q63do
+ugc_fgeelg
+t3261xdsota
+ugc_ba6rdns
+ugc_bauslr5
+k3224o7xno0
+ugc_t6v690
+ugc_qal740
+ugc_bljtc8e
+ugc_u0rfhd
+ugc_b0r9fur
+ugc_44l1dy
+ugc_o0wqaq
+ugc_bjqgbqv
+ugc_eqyji4
+ugc_5kiuxk
+ugc_by0tcgj
+ugc_b7h6m1p
+ugc_bu1zr1a
+ugc_oauadp
+ugc_bkz4l2q
+ugc_cn1pjh
+ugc_bgofy1a
+ugc_b8yotdc
+ugc_bxhvonh
+ugc_b1o6fiu
+ugc_bvsh5n7
+ugc_b8c4jdk
+ugc_i80dp9
+ugc_jc1gof
+ugc_bkkw6f2
+ugc_bu3smmv
+ugc_bq2uu53
+ugc_berf4qj
+ugc_b43v4sv
+ugc_l77lus
+ugc_rssx8y
+ugc_bxzi73x
+ugc_b5dpyd7
+c3254d5nx0f
+ugc_bkqsl6n
+ugc_b7sck98
+n3254d1gxld
+ugc_gbot2h
+ugc_8dq0hr
+p3211ubqavc
+ugc_bm3l4oa
+ugc_bqu4ic5
+r3239nndk3p
+ugc_b4x375n
+ugc_eji5b8
+ugc_yw0l81
+ugc_m2cmzf
+ugc_bo6k8lw
+ugc_6nllr9
+ugc_7uexob
+ugc_b3me1i2
+ugc_bad6138
+ugc_bklkq4v
+o3258rfddyx
+ugc_bx7ex6x
+ugc_7m4f4u
+ugc_u9om2l
+ugc_bduep85
+ugc_oqnrml
+ugc_bhooe55
+ugc_pkb6jl
+ugc_7g9kns
+ugc_b7216nm
+ugc_b5l4i21
+ugc_kqbkqi
+ugc_64qkuq
+ugc_bz521rh
+ugc_b0040oe
+ugc_qj1f9j
+ugc_bpo2ghr
+ugc_bds7zcc
+ugc_6l8rs5
+ugc_hpuq9z
+ugc_3edct1
+ugc_bm16he3
+ugc_1et9ei
+ugc_ws7ukq
+ugc_5kavzi
+ugc_dlm1fh
+ugc_3l19qc
+ugc_7kfvt5
+ugc_cv2kes
+ugc_b3qix71
+ugc_be8an1f
+ugc_bmn7m57
+ugc_cnc0z8
+ugc_be1zhbi
+ugc_ujssiw
+ugc_bt215tn
+ugc_b6l1zsd
+ugc_b2or7ui
+ugc_bduqsd9
+ugc_ykj1zx
+ugc_bkd9hsl
+ugc_bieuzuc
+ugc_4hx4to
+ugc_b7xlv3o
+w32509nqy7z
+ugc_r1vvrd
+ugc_sh26ey
+h3201ft131m
+ugc_i9ncwo
+a32311ayc7d
+ugc_0rmh96
+ugc_82w9z7
+ugc_b3mr6ep
+ugc_4yl73p
+ugc_b5uvtew
+ugc_55qae5
+ugc_brluvq0
+ugc_bny774e
+k3236o0mc3g
+ugc_349lmw
+ugc_b6e5u8y
+ugc_b0htr9r
+ugc_oqlleh
+ugc_bqzpzfy
+ugc_b0yb8r0
+ugc_n1y4x
+ugc_rjd7os
+ugc_4yioyj
+ugc_n73zme
+ugc_jh7fj3
+ugc_bjpli2e
+ugc_b1cdhtu
+c3227fh2s6k
+ugc_v0nz2
+ugc_omg2sw
+ugc_q58h69
+ugc_b671qqp
+s3244ak8kvy
+ugc_9hwos2
+wxv_2357412098529558528
+ugc_bbcwv6q
+ugc_brfdts
+ugc_pozq3d
+ugc_byh3qup
+ugc_b175kj7
+ugc_idz1it
+ugc_vj2c99
+ugc_5bqvcp
+ugc_uo9d08
+ugc_bvkejrp
+ugc_bktm9um
+ugc_f6jt81
+ugc_bqpu1id
+ugc_bqud2zw
+ugc_bd0nydz
+ugc_xf347q
+ugc_du7jll
+b32274x10om
+ugc_bq70t84
+ugc_k6q6zs
+ugc_b29prox
+n32262z97mb
+ugc_b6o17wu
+ugc_b50fdlo
+q3235t08edr
+ugc_62wgib
+ugc_bwigm0h
+ugc_bwskklh
+c3162ss2ek9
+ugc_bf4y9jf
+ugc_b4cf8yu
+ugc_4ew9zk
+ugc_w1sp42
+ugc_ipigpi
+ugc_b45ecbw
+ugc_bbvg9iz
+ugc_frl81m
+ugc_bsy4fdp
+ugc_bkb5ld9
+ugc_bqi66vr
+ugc_mlsrof
+ugc_rjdypj
+ugc_ttj2n8
+ugc_2ajbmg
+ugc_14nipa
+ugc_bwclkzn
+ugc_bafwvos
+ugc_bf6jiu
+ugc_uj5wuv
+ugc_b46tesr
+ugc_b4svl98
+ugc_b276q2z
+ugc_bwj8v4n
+ugc_brlutpx
+r3233eyua04
+ugc_teq103
+ugc_nghb4h
+ugc_bdx26xd
+ugc_bdayr09
+ugc_bh1idwy
+ugc_bvqxsdp
+l3257ey0s1b
+ugc_37k0ug
+ugc_bmdmru6
+ugc_blgt9xs
+a3233n0iiu7
+ugc_rirwme
+ugc_icotjw
+ugc_bhe2682
+ugc_bjfdkrc
+k3247tg3i11
+ugc_bd30uhb
+ugc_btjmhe8
+ugc_b3w45nm
+ugc_bw4q9r
+ugc_0sb72r
+ugc_y6p79t
+ugc_b880j3o
+ugc_beahpf7
+ugc_bmxvm38
+ugc_b5y2q3j
+ugc_hiw4zj
+ugc_bsklp0r
+ugc_668u19
+ugc_62lnju
+ugc_nd2xiw
+ugc_bxzvm4h
+ugc_b7wthpn
+ugc_boaxppl
+ugc_kwr9wc
+ugc_bi73rbl
+ugc_krh0dc
+ugc_ggfjx2
+ugc_bljfii3
+ugc_kbahe8
+l3229bwi37z
+ugc_bykzfrv
+ugc_k1v8xm
+ugc_1apifp
+ugc_ncfk9x
+ugc_0vkr2c
+ugc_edzmtm
+ugc_7iihza
+ugc_beavgbv
+ugc_bq2g3vz
+ugc_821q6u
+ugc_bhtmhow
+ugc_bb204xs
+ugc_3yzcr4
+ugc_b47mdw7
+ugc_mlh834
+ugc_b2b866v
+ugc_b8ucx4x
+ugc_ie5uet
+ugc_bo9pc3x
+i3227gbzk6b
+ugc_1gu8ag
+ugc_bcqenrh
+ugc_wns9i9
+ugc_bzlyrys
+ugc_bzvqywb
+ugc_b6u5lpe
+ugc_pyafq5
+ugc_b8kvem8
+ugc_tsbcwh
+ugc_bw03u7y
+ugc_bnf26bp
+ugc_eclumq
+ugc_bvapw3a
+ugc_bbczob2
+ugc_le67l
+ugc_b2ub6bo
+ugc_b76v0ms

+ 3 - 0
videos/__init__.py

@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+# @Author: wangkun
+# @Time: 2022/4/18

+ 40 - 0
抓取规则.txt

@@ -0,0 +1,40 @@
+==========2022/4/15===========
+- 视频发布3日内,播放量大于2万(当前时间 - 发布时间 <= 3 天)
+- 视频时长1分钟以上,10分钟以下
+- 分辨率 宽或高大于720
+- 分享量>0
+- 站内标题=看一看视频原标题
+- 站内封面图=看一看视频原封面图
+- 任务执行规则:
+    1.凌晨0点-10点      3日内播放大于2万 爬取
+    2.早上10点-20点     内容上升榜 爬取
+    3.晚上20点-24点     15万播放爬取
+==============================
+
+
+==========2022/3/29===========
+1.凌晨5:00 - 21:00,跑上升榜爬虫(循环隔 1 小时,检查播放量>=1000)
+2.晚上21:00 - 5:00,跑播放量爬虫(播放量>=200000)
+3.视频下载后,立即上传
+==============================
+
+
+==========2022/3/24===========
+1.周一至周五,跑上升榜爬虫(循环隔 1 小时,检查播放量>=1000)
+2.周六至周日,跑播放量爬虫(播放量>=200000)
+3.视频下载后,立即上传
+4.下周一时,暂停播放量爬虫,恢复上升榜爬虫
+==============================
+
+
+==========2022/3/15===========
+1.拿到外网视频 list
+2.去重
+3.获取当前抓取时间、以及播放量、加上基本规则,存储本地:
+	3.1 分辨率,宽或者高 >= 720 或 无分辨
+	3.2 600 >= 时长 >= 60
+4.循环隔 1 小时,检查播放量 >=1000(当前播放量 - 1 小时前的播放量),开始抓取。同时从本地存储中删除,加入到去重文本中。
+5.下载总条数,先不限制
+6.下载时间:早上 8 点 - 晚上 21 点截止
+7.下载完成后立即上传
+==============================