# sening VideoLoginHub
|
import asyncio
|
from auto_media_publisher.utils.login_helper import create_and_run_login
|
import sys
|
import os
|
import subprocess
|
import threading
|
import tkinter as tk
|
from tkinter import messagebox
|
import getpass
|
import requests
|
import json
|
|
BASE_DIR = os.path.abspath(os.path.dirname(sys.executable))
|
|
PLATFORM_DISPLAY_MAP = {
|
"抖音": "douyin",
|
"快手": "kuaishou",
|
"小红书": "xiaohongshu",
|
"B站": "bilibili",
|
"视频号": "shipinhao",
|
"百家号": "baijiahao",
|
"Youtube": "Youtube",
|
"Tiktok": "Tiktok"
|
}
|
|
REMOTE_SERVER_URL = "http://127.0.0.1:5000/upload_auth"
|
PROXY_SERVER_URL_PREFIX = "HTTP://proxy.parkprofile.com:"
|
|
|
class LoginApp:
|
def __init__(self, root):
|
self.root = root
|
self.root.title("色宁短视频分发平台-授权")
|
self.root.geometry("500x250")
|
self.root.resizable(False, False)
|
|
# 手机号码输入区
|
tk.Label(root, text="手机号码:").grid(row=0, column=0, padx=10, pady=10, sticky='w')
|
self.username_entry = tk.Entry(root, width=25)
|
self.username_entry.grid(row=0, column=1, padx=5, pady=10, sticky='w')
|
self.local_network_var = tk.BooleanVar(value=True)
|
self.local_network_checkbox = tk.Checkbutton(root, text="本机网络", variable=self.local_network_var)
|
self.local_network_checkbox.grid(row=0, column=2, padx=5, pady=10, sticky='w')
|
|
tk.Button(root, text="开始授权", command=self.login).grid(row=0, column=3, padx=10, pady=10)
|
|
|
# 复选框区
|
self.checkbox_vars = {}
|
for i, display_name in enumerate(PLATFORM_DISPLAY_MAP.keys()):
|
var = tk.BooleanVar(value=(i < 4)) # 默认前4个为选中,后4个不选
|
cb = tk.Checkbutton(root, text=display_name, variable=var)
|
cb.grid(row=1 + i // 4, column=i % 4, padx=(20, 5), pady=5, sticky='w') # 左对齐 + padding 调整
|
|
if i >= 6: # Youtube/Tiktok
|
cb.config(state="disabled")
|
self.checkbox_vars[display_name] = var
|
|
def try_to_set_frp(self,phone):
|
try:
|
if not phone.isdigit() or len(phone) < 11:
|
return
|
frpc_conf_path = os.path.join(BASE_DIR, "network", "sening_vdp2.toml")
|
if not os.path.exists(frpc_conf_path):
|
return
|
|
with open(frpc_conf_path, 'r', encoding='utf-8') as f:
|
lines = f.readlines()
|
|
new_lines = []
|
for line in lines:
|
if line.strip().startswith('name ='):
|
new_line = f'name = "{phone}"\n'
|
elif line.strip().startswith('remotePort ='):
|
new_line = f'remotePort = {phone[7:]}\n'
|
else:
|
new_line = line
|
new_lines.append(new_line)
|
|
with open(frpc_conf_path, 'w', encoding='utf-8') as f:
|
f.writelines(new_lines)
|
except:
|
pass
|
|
def send_user_auth(self,user,platform):
|
cookie_file_path = f'./data/cookies/{user}/{platform}.json'
|
# 读取 cookie 文件并发送
|
with open(cookie_file_path, 'rb') as f:
|
files = {'file': (f'{platform}.json', f, 'application/json')}
|
data = {'username': user}
|
response = requests.post(REMOTE_SERVER_URL, files=files, data=data)
|
|
# 判断响应结果
|
if response.status_code == 200:
|
result = response.json()
|
if not result.get('success'):
|
print("❌ 服务器返回,请联系管理员处理.")
|
|
def login(self):
|
username = self.username_entry.get().strip()
|
use_local_network = self.local_network_var.get()
|
|
if not username:
|
messagebox.showwarning("错误", "请输入手机号码")
|
return
|
|
if username.isdigit() and len(username) >= 11:
|
if use_local_network:
|
self.try_to_set_frp(username)
|
|
proxy_port = username[7:]
|
|
selected_platforms = []
|
for display_name, var in self.checkbox_vars.items():
|
if var.get() and display_name not in ("Youtube", "Tiktok"): # 忽略禁用项
|
actual_name = PLATFORM_DISPLAY_MAP[display_name]
|
selected_platforms.append(actual_name)
|
|
if not selected_platforms:
|
messagebox.showwarning("错误", "请至少选择一个平台")
|
return
|
# 展示结果
|
message = f"手机号码:{username}\n选择平台:{', '.join(selected_platforms) if selected_platforms else '无'}"
|
messagebox.showinfo("授权信息", message)
|
|
# 启动异步任务
|
threading.Thread(target=self.run_async_task, args=(username, selected_platforms,proxy_port), daemon=True).start()
|
|
def run_async_task(self, username, platforms,proxy_port):
|
asyncio.run(self.async_login(username, platforms,proxy_port))
|
|
async def async_login(self, username, platforms,proxy_port):
|
for platform in platforms:
|
try:
|
if await create_and_run_login(user=username, platform=platform,proxy=PROXY_SERVER_URL_PREFIX+proxy_port):
|
self.send_user_auth(username,platform)
|
|
except Exception as e:
|
print("授权任务出错:", e)
|
|
|
def try_load_config():
|
try:
|
if getattr(sys, 'frozen', False):
|
# 打包后的路径(PyInstaller)
|
base_path = sys._MEIPASS if hasattr(sys, '_MEIPASS') else os.path.dirname(sys.executable)
|
else:
|
# 开发阶段路径
|
base_path = os.path.dirname(os.path.abspath(__file__))
|
config_path = os.path.join(base_path, 'config.json')
|
if not os.path.exists(config_path):
|
return
|
with open(config_path, 'r', encoding='utf-8') as f:
|
tmp_config = json.load(f)
|
REMOTE_SERVER_URL = tmp_config.get("REMOTE_SERVER_URL",REMOTE_SERVER_URL)
|
PROXY_SERVER_URL_PREFIX = tmp_config.get("PROXY_SERVER_URL_PREFIX",PROXY_SERVER_URL_PREFIX)
|
except Exception as e:
|
print(f"{e}")
|
|
def runnetwork_exe():
|
try:
|
# for packaged exe
|
exe_path = os.path.join(BASE_DIR, "network", "sening_vdp.exe")
|
|
if os.path.exists(exe_path):
|
# 静默启动,不显示窗口
|
subprocess.Popen(
|
exe_path,
|
shell=False,
|
stdout=subprocess.DEVNULL,
|
stderr=subprocess.DEVNULL,
|
stdin=subprocess.DEVNULL,
|
creationflags=subprocess.CREATE_NO_WINDOW if os.name == 'nt' else 0
|
)
|
except Exception as e:
|
print(f"{e}")
|
|
def add_to_startup():
|
# 获取当前用户名和路径
|
user = getpass.getuser()
|
startup_folder = fr"C:\Users\{user}\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup"
|
|
# 当前可执行文件路径
|
exe_path = os.path.join(BASE_DIR, "network", "sening_vdp.exe")
|
|
shortcut_path = os.path.join(startup_folder, "sening_vdp.lnk")
|
|
# 创建快捷方式
|
import pythoncom
|
from win32com.shell import shell, shellcon
|
from win32com.client import Dispatch
|
|
shell = Dispatch('WScript.Shell')
|
shortcut = shell.CreateShortcut(shortcut_path)
|
shortcut.TargetPath = exe_path
|
shortcut.WorkingDirectory = os.path.dirname(exe_path)
|
shortcut.IconLocation = exe_path
|
shortcut.Save()
|
|
print(f"已添加启动项:{shortcut_path}")
|
|
if __name__ == "__main__":
|
try_load_config()
|
runnetwork_exe()
|
add_to_startup()
|
root = tk.Tk()
|
app = LoginApp(root)
|
root.mainloop()
|