138 lines
4.3 KiB
Python
138 lines
4.3 KiB
Python
|
|
"""
|
|||
|
|
小红书Storage State文件管理工具
|
|||
|
|
用于管理和清理storage_state文件
|
|||
|
|
"""
|
|||
|
|
import os
|
|||
|
|
import json
|
|||
|
|
import time
|
|||
|
|
from datetime import datetime, timedelta
|
|||
|
|
from pathlib import Path
|
|||
|
|
|
|||
|
|
|
|||
|
|
STORAGE_DIR = "storage_states"
|
|||
|
|
|
|||
|
|
|
|||
|
|
def get_storage_files():
|
|||
|
|
"""获取所有storage_state文件"""
|
|||
|
|
if not os.path.exists(STORAGE_DIR):
|
|||
|
|
return []
|
|||
|
|
|
|||
|
|
files = []
|
|||
|
|
for filename in os.listdir(STORAGE_DIR):
|
|||
|
|
if filename.endswith('.json'):
|
|||
|
|
filepath = os.path.join(STORAGE_DIR, filename)
|
|||
|
|
stat = os.stat(filepath)
|
|||
|
|
files.append({
|
|||
|
|
'filename': filename,
|
|||
|
|
'filepath': filepath,
|
|||
|
|
'size': stat.st_size,
|
|||
|
|
'modified_time': stat.st_mtime,
|
|||
|
|
'modified_date': datetime.fromtimestamp(stat.st_mtime)
|
|||
|
|
})
|
|||
|
|
return files
|
|||
|
|
|
|||
|
|
|
|||
|
|
def cleanup_old_files(days=30):
|
|||
|
|
"""清理超过指定天数未使用的文件"""
|
|||
|
|
files = get_storage_files()
|
|||
|
|
cutoff_time = time.time() - (days * 24 * 60 * 60)
|
|||
|
|
deleted_count = 0
|
|||
|
|
|
|||
|
|
print(f"\n开始清理{days}天前的storage_state文件...")
|
|||
|
|
for file_info in files:
|
|||
|
|
if file_info['modified_time'] < cutoff_time:
|
|||
|
|
try:
|
|||
|
|
os.remove(file_info['filepath'])
|
|||
|
|
print(f" 已删除: {file_info['filename']} (最后修改: {file_info['modified_date']})")
|
|||
|
|
deleted_count += 1
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f" 删除失败 {file_info['filename']}: {e}")
|
|||
|
|
|
|||
|
|
print(f"\n清理完成!共删除 {deleted_count} 个文件")
|
|||
|
|
return deleted_count
|
|||
|
|
|
|||
|
|
|
|||
|
|
def list_storage_files():
|
|||
|
|
"""列出所有storage_state文件"""
|
|||
|
|
files = get_storage_files()
|
|||
|
|
|
|||
|
|
if not files:
|
|||
|
|
print("\n未找到任何storage_state文件")
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
print(f"\n找到 {len(files)} 个storage_state文件:\n")
|
|||
|
|
print(f"{'文件名':<40} {'大小':<10} {'最后修改时间'}")
|
|||
|
|
print("-" * 80)
|
|||
|
|
|
|||
|
|
for file_info in sorted(files, key=lambda x: x['modified_time'], reverse=True):
|
|||
|
|
size_kb = file_info['size'] / 1024
|
|||
|
|
print(f"{file_info['filename']:<40} {size_kb:>8.1f}KB {file_info['modified_date']}")
|
|||
|
|
|
|||
|
|
total_size = sum(f['size'] for f in files) / 1024 / 1024
|
|||
|
|
print(f"\n总大小: {total_size:.2f} MB")
|
|||
|
|
|
|||
|
|
|
|||
|
|
def validate_storage_file(phone):
|
|||
|
|
"""验证指定手机号的storage_state文件是否有效"""
|
|||
|
|
filepath = os.path.join(STORAGE_DIR, f"xhs_{phone}.json")
|
|||
|
|
|
|||
|
|
if not os.path.exists(filepath):
|
|||
|
|
print(f"\n❌ 文件不存在: {filepath}")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
with open(filepath, 'r', encoding='utf-8') as f:
|
|||
|
|
data = json.load(f)
|
|||
|
|
|
|||
|
|
# 检查必要字段
|
|||
|
|
if 'cookies' not in data:
|
|||
|
|
print(f"\n❌ 文件格式错误: 缺少cookies字段")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
if 'origins' not in data:
|
|||
|
|
print(f"\n⚠️ 文件格式不完整: 缺少origins字段")
|
|||
|
|
|
|||
|
|
cookie_count = len(data.get('cookies', []))
|
|||
|
|
print(f"\n✅ 文件有效")
|
|||
|
|
print(f" Cookie数量: {cookie_count}")
|
|||
|
|
print(f" 文件大小: {os.path.getsize(filepath) / 1024:.1f}KB")
|
|||
|
|
print(f" 最后修改: {datetime.fromtimestamp(os.path.getmtime(filepath))}")
|
|||
|
|
|
|||
|
|
return True
|
|||
|
|
|
|||
|
|
except json.JSONDecodeError:
|
|||
|
|
print(f"\n❌ 文件格式错误: 不是有效的JSON")
|
|||
|
|
return False
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"\n❌ 验证失败: {e}")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
import sys
|
|||
|
|
|
|||
|
|
if len(sys.argv) < 2:
|
|||
|
|
print("用法:")
|
|||
|
|
print(" python storage_state_manager.py list # 列出所有文件")
|
|||
|
|
print(" python storage_state_manager.py cleanup [days] # 清理旧文件(默认30天)")
|
|||
|
|
print(" python storage_state_manager.py validate <phone> # 验证指定手机号的文件")
|
|||
|
|
sys.exit(1)
|
|||
|
|
|
|||
|
|
command = sys.argv[1]
|
|||
|
|
|
|||
|
|
if command == "list":
|
|||
|
|
list_storage_files()
|
|||
|
|
elif command == "cleanup":
|
|||
|
|
days = int(sys.argv[2]) if len(sys.argv) > 2 else 30
|
|||
|
|
cleanup_old_files(days)
|
|||
|
|
elif command == "validate":
|
|||
|
|
if len(sys.argv) < 3:
|
|||
|
|
print("错误: 请提供手机号")
|
|||
|
|
sys.exit(1)
|
|||
|
|
phone = sys.argv[2]
|
|||
|
|
validate_storage_file(phone)
|
|||
|
|
else:
|
|||
|
|
print(f"未知命令: {command}")
|
|||
|
|
sys.exit(1)
|
|||
|
|
|