|
@@ -2,6 +2,8 @@ import random
|
|
|
import re
|
|
|
import time
|
|
|
import json
|
|
|
+
|
|
|
+import cffi
|
|
|
import requests
|
|
|
from urllib.parse import urlencode
|
|
|
|
|
@@ -122,7 +124,7 @@ class PQ:
|
|
|
cover = url["coverImgPath"]
|
|
|
video_url = url["transedVideoPath"]
|
|
|
old_title = url["title"]
|
|
|
- log_data = f"user:{user_id},video_id:{video_id},video_url:{video_url},original_title:{old_title}"
|
|
|
+ log_data = f"user:{user_id},,video_id:{video_id},,video_url:{video_url},,original_title:{old_title}"
|
|
|
AliyunLogger.logging(channel_id, name, user_id, video_id, "扫描到一条视频", "2001", log_data)
|
|
|
|
|
|
if status:
|
|
@@ -284,32 +286,56 @@ class PQ:
|
|
|
print(e)
|
|
|
return None
|
|
|
|
|
|
+ "视频号加密视频解密"
|
|
|
+ @classmethod
|
|
|
+ def decrypt_video(cls, data: bytes, decode_key: int, enc_length: int = 131072) -> bytes:
|
|
|
+ ffi = cffi.FFI()
|
|
|
+ # lib = ffi.dlopen(r'/Users/tzld/Desktop/video_rewriting/libsph_decrypt.dylib')
|
|
|
+ lib = ffi.dlopen(r'/root/video_rewriting/libsph_decrypt.so')
|
|
|
+ ffi.cdef('void decrypt(unsigned char *data, const size_t data_length, const uint32_t key);')
|
|
|
+
|
|
|
+ c_data = ffi.new('unsigned char[]', list(data))
|
|
|
+ lib.decrypt(c_data, enc_length, decode_key)
|
|
|
+ data = bytes(ffi.buffer(c_data, len(data))[:])
|
|
|
+ return data
|
|
|
|
|
|
"""
|
|
|
- 票圈站内视频下载
|
|
|
+ 视频下载
|
|
|
"""
|
|
|
@classmethod
|
|
|
def download_video(cls, video_url, video_path_url, video_id, video, channel_id):
|
|
|
+ if channel_id == '单点视频':
|
|
|
+ if video['source'] == "视频号" and int(video['is_encrypted']) == 1:
|
|
|
+ decode_key = int(video['decode_key'])
|
|
|
+ response = requests.get(url=video_url)
|
|
|
+ data = response.content
|
|
|
+ enc_length = int(response.headers.get('X-enclen', 131072))
|
|
|
+ video_url = cls.decrypt_video(data=data, decode_key=decode_key, enc_length=enc_length)
|
|
|
url_video = video_url
|
|
|
new_video = video_path_url + str(video_id) + '.mp4'
|
|
|
for i in range(3):
|
|
|
try:
|
|
|
- payload = {}
|
|
|
- headers = {}
|
|
|
- response = requests.request("GET", url_video, headers=headers, data=payload)
|
|
|
- if response.status_code == 200:
|
|
|
- with open(f"{new_video}", "wb") as file:
|
|
|
- # 将响应内容写入文件
|
|
|
- file.write(response.content)
|
|
|
- time.sleep(5)
|
|
|
- return new_video
|
|
|
+ if video['source'] == "视频号" and int(video['is_encrypted']) == 1:
|
|
|
+ with open(f"{new_video}", 'wb') as f:
|
|
|
+ f.write(url_video)
|
|
|
+ return new_video
|
|
|
else:
|
|
|
- if channel_id == '单点视频':
|
|
|
- wx_msg = video['wx_msg']
|
|
|
- if wx_msg:
|
|
|
- url_videos = cls.get_dd_video_url(wx_msg)
|
|
|
- if url_videos:
|
|
|
- url_video = url_videos
|
|
|
+ payload = {}
|
|
|
+ headers = {}
|
|
|
+ response = requests.request("GET", url_video, headers=headers, data=payload)
|
|
|
+ if response.status_code == 200:
|
|
|
+ with open(f"{new_video}", "wb") as file:
|
|
|
+ # 将响应内容写入文件
|
|
|
+ file.write(response.content)
|
|
|
+ time.sleep(5)
|
|
|
+ return new_video
|
|
|
+ else:
|
|
|
+ if channel_id == '单点视频':
|
|
|
+ wx_msg = video['wx_msg']
|
|
|
+ if wx_msg:
|
|
|
+ url_videos = cls.get_dd_video_url(wx_msg)
|
|
|
+ if url_videos:
|
|
|
+ url_video = url_videos
|
|
|
except Exception:
|
|
|
if channel_id == '单点视频':
|
|
|
wx_msg = video['wx_msg']
|