diff --git a/content.py b/content.py index 0d0f061..33acf69 100644 --- a/content.py +++ b/content.py @@ -1,38 +1,93 @@ -import aiohttp +import asyncio +import re +import time + +import httpx +import pymysql base_url = "https://dm.video.qq.com/barrage/base/" dm_url = "https://dm.video.qq.com/barrage/segment/p0047eb164c/t/v1/0/30000" async def getTxVideoData(url, video_id): - url = "https://example.com/api/data.json" # 替换成你要请求的JSON数据的URL + # 使用正则表达式获取视频ID p0047eb164c https://v.qq.com/x/cover/mzc00200pppnnhl/p0047eb164c.html + global connection + global cursor + vid = re.findall(r'/([a-zA-Z0-9]+)\.html', url)[0] + print(vid) + url = f"https://dm.video.qq.com/barrage/base/{vid}" # 替换成你要请求的JSON数据的URL json_data = await fetch_json(url) if json_data: # 在这里处理解析后的JSON数据 - print(json_data) + span = json_data['segment_span'] + print(span) + items = json_data["segment_index"].items() + page = len(items) + # 最大数据索引 + max_data_index = (page - 1) * 30000 + # 页数 + print(page) + # 获取的数据量 + data_num = 5000 + # 每页获取的数据量 + number_per_page = int(data_num / page) + print(number_per_page) + total_num = 0 + # 连接数据库 + try: + # 连接数据库 + connection = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='root', db='dm') + cursor = connection.cursor() + except pymysql.Error as e: + # 异常 连接失败 + print("数据库连接失败") + # finally: + # # 关闭数据库连接 + # if connection: + # connection.close() + for i in range(0, page): + data_url_suffix = json_data["segment_index"][str(i * 30000)]["segment_name"] + data_url = f"https://dm.video.qq.com/barrage/segment/{vid}/{data_url_suffix}" + print(data_url) + data_json = await fetch_json(data_url) + if data_json: + barrage_list = data_json["barrage_list"] + data_len = len(barrage_list) + timestamp = int(time.time()) + # 遍历barrage_list + sql = "INSERT INTO `danmaku_list` (`id`, `type`, `text`, `color`, `size`, `videotime`, `ip`, `time`) VALUES " + data_index = 0 + for barrage in barrage_list: + content = barrage["content"].replace("\\", "").replace("'", "\\'") + time_offset = float(barrage["time_offset"]) / 1000 + if data_index == 0: + sql += f"('{video_id}', 'right', '{content}','#FFFFFF', '27.5px', {time_offset}, '127.0.0.1', {timestamp})" + else: + sql += f",('{video_id}', 'right', '{content}','#FFFFFF', '27.5px', {time_offset}, '127.0.0.1', {timestamp})" + data_index += 1 + total_num += data_len + # print(sql) + # cursor.execute(sql) + # connection.commit() + + print(f"总数据量:{total_num}") + async def fetch_json(url): - async with aiohttp.ClientSession() as session: - async with session.get(url) as response: - if response.status == 200: - data = await response.json() - return data - else: - print(f"Failed to fetch data. Status code: {response.status}") - return None + async with httpx.AsyncClient() as client: + response = await client.get(url) + return response.json() + if __name__ == "__main__": - - url = "https://v.qq.com/x/cover/mzc00200pppnnhl/p0047eb164c.html" + url = "https://v.qq.com/x/cover/mzc00200pppnnhl/j00468dc2og.html" if "v.qq.com" in url: # 调用 v.qq.com 对应的接口 - await getTxVideoData(url, "p0047eb164c") - + asyncio.run(getTxVideoData(url, "j00468dc2og")) # 检查是否存在 "rainss.cn" elif "rainss.cn" in url: # 调用 rainss.cn 对应的接口 print("调用 rainss.cn 的接口") - # 检查是否存在 "allms.cn" elif "allms.cn" in url: # 调用 allms.cn 对应的接口 @@ -40,4 +95,4 @@ if __name__ == "__main__": # 如果都不匹配 else: - print("未匹配到任何子字符串") \ No newline at end of file + print("未匹配到任何子字符串") diff --git a/dm.py b/dm.py index c9fd530..8fa2088 100644 --- a/dm.py +++ b/dm.py @@ -54,18 +54,24 @@ class TableWidgetExample(QMainWindow): self.connection = None self.cursor = None self.is_connect = False + self.logger_area = None self.initLogger() self.initUI() def initUI(self): self.setWindowTitle("采集") - self.setGeometry(100, 100, 800, 600) - + self.setGeometry(100, 100, 1000, 600) central_widget = QWidget() - center_layout = QVBoxLayout(central_widget) + central_layout = QHBoxLayout(central_widget) + # central_layout.setSpacing(0) self.setCentralWidget(central_widget) + left_widget = QWidget() + left_layout = QVBoxLayout(left_widget) + left_layout.setContentsMargins(0, 0, 0, 0) + central_layout.addWidget(left_widget, 3) + top_widget = QWidget() top_layout = QVBoxLayout(top_widget) @@ -79,7 +85,7 @@ class TableWidgetExample(QMainWindow): header.setSectionResizeMode(QtWidgets.QHeaderView.Stretch) top_layout.addWidget(self.table) - center_layout.addWidget(top_widget) + left_layout.addWidget(top_widget) # 下部分布局 bottom_widget = QWidget() @@ -126,7 +132,21 @@ class TableWidgetExample(QMainWindow): action_layout.addWidget(button_execute) bottom_layout.addLayout(action_layout) - center_layout.addWidget(bottom_widget) + left_layout.addWidget(bottom_widget) + + right_widget = QWidget() + right_layout = QVBoxLayout(right_widget) + right_layout.setContentsMargins(0, 0, 0, 0) + central_layout.addWidget(right_widget, 1) + + logger_widget = QWidget() + # logger_widget.setFixedHeight(200) + logger_layout = QVBoxLayout(logger_widget) + self.logger_area = QTextEdit() + self.logger_area.setPlaceholderText("日志...") + self.logger_area.setReadOnly(True) + logger_layout.addWidget(self.logger_area) + right_layout.addWidget(logger_widget) def initLogger(self): logging.basicConfig(level=logging.DEBUG) @@ -282,6 +302,7 @@ class TableWidgetExample(QMainWindow): sql = "INSERT INTO `danmaku_list` (`id`, `cid`, `type`, `text`, `color`, `size`, `videotime`, `ip`, `time`) VALUES ('de9d5e3f5b7f9ea2197d35f383530643', NULL, 'right', '不错哦', '#FFFFFF', '27.5px', '48.275', '58.62.32.191', '1666319003')" return sql + if __name__ == "__main__": app = QApplication(sys.argv) window = TableWidgetExample()