first commit
This commit is contained in:
273
app/core/export_manager.py
Normal file
273
app/core/export_manager.py
Normal file
@@ -0,0 +1,273 @@
|
||||
# -*- coding: UTF-8 -*-
|
||||
'''
|
||||
@Project :domainScanDemo
|
||||
@File :export_manager.py
|
||||
@IDE :PyCharm
|
||||
@Author :梦伴
|
||||
@Date :2026/4/8 23:54
|
||||
@explain : 导出管理器
|
||||
'''
|
||||
|
||||
import os
|
||||
from loguru import logger
|
||||
from app.utils.database import Database
|
||||
|
||||
|
||||
class ExportManager:
|
||||
"""
|
||||
导出管理器
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
"""
|
||||
初始化导出管理器
|
||||
"""
|
||||
self.db = Database()
|
||||
|
||||
def export_domains(self, filter_conditions, output_file):
|
||||
"""
|
||||
导出域名
|
||||
|
||||
:param filter_conditions: 筛选条件
|
||||
:param output_file: 输出文件路径
|
||||
:return: int - 导出的域名数量
|
||||
"""
|
||||
try:
|
||||
# 查询符合条件的域名
|
||||
domains = self.db.get_domains_by_conditions(filter_conditions)
|
||||
|
||||
if not domains:
|
||||
logger.warning("没有符合条件的域名")
|
||||
return 0
|
||||
|
||||
# 导出到文件
|
||||
with open(output_file, 'w', encoding='utf-8') as f:
|
||||
for domain in domains:
|
||||
f.write(domain['domain'] + '\n')
|
||||
|
||||
logger.info(f"成功导出 {len(domains)} 个域名到 {output_file}")
|
||||
return len(domains)
|
||||
except Exception as e:
|
||||
logger.error(f"导出域名出错: {e}")
|
||||
return 0
|
||||
|
||||
def export_with_details(self, filter_conditions, output_file):
|
||||
"""
|
||||
导出域名及其详细信息
|
||||
|
||||
:param filter_conditions: 筛选条件
|
||||
:param output_file: 输出文件路径
|
||||
:return: int - 导出的域名数量
|
||||
"""
|
||||
try:
|
||||
# 查询符合条件的域名及其详细信息
|
||||
domains = self.db.get_domains_with_details(filter_conditions)
|
||||
|
||||
if not domains:
|
||||
logger.warning("没有符合条件的域名")
|
||||
return 0
|
||||
|
||||
# 导出到文件
|
||||
with open(output_file, 'w', encoding='utf-8') as f:
|
||||
# 写入表头
|
||||
f.write('域名,注册状态,使用状态,检测状态,备案历史,备案年份,快照年份,友情链接数量\n')
|
||||
|
||||
# 写入数据
|
||||
for domain in domains:
|
||||
line = f"{domain['domain']},{domain['register_status']},{domain['use_status']},{domain['detect_status']},{domain['has_beian']},{domain['beian_year']},{domain['snapshot_years']},{domain['backlink_count']}\n"
|
||||
f.write(line)
|
||||
|
||||
logger.info(f"成功导出 {len(domains)} 个域名及其详细信息到 {output_file}")
|
||||
return len(domains)
|
||||
except Exception as e:
|
||||
logger.error(f"导出域名详细信息出错: {e}")
|
||||
return 0
|
||||
|
||||
def batch_update_status(self, domain_ids, status_type, status_value):
|
||||
"""
|
||||
批量更新域名状态
|
||||
|
||||
:param domain_ids: 域名ID列表
|
||||
:param status_type: 状态类型
|
||||
:param status_value: 状态值
|
||||
:return: int - 更新成功的域名数量
|
||||
"""
|
||||
try:
|
||||
success_count = 0
|
||||
for domain_id in domain_ids:
|
||||
if self.db.update_domain_status(domain_id, status_type, status_value):
|
||||
success_count += 1
|
||||
|
||||
logger.info(f"成功更新 {success_count} 个域名的状态")
|
||||
return success_count
|
||||
except Exception as e:
|
||||
logger.error(f"批量更新域名状态出错: {e}")
|
||||
return 0
|
||||
|
||||
def get_filtered_domains(self, filter_conditions, limit=1000):
|
||||
"""
|
||||
获取符合条件的域名
|
||||
|
||||
:param filter_conditions: 筛选条件
|
||||
:param limit: 限制数量
|
||||
:return: list - 域名列表
|
||||
"""
|
||||
try:
|
||||
domains = self.db.get_domains_by_conditions(filter_conditions, limit)
|
||||
logger.info(f"获取到 {len(domains)} 个符合条件的域名")
|
||||
return domains
|
||||
except Exception as e:
|
||||
logger.error(f"获取符合条件的域名出错: {e}")
|
||||
return []
|
||||
|
||||
def generate_report(self, output_file):
|
||||
"""
|
||||
生成统计报告
|
||||
|
||||
:param output_file: 输出文件路径
|
||||
:return: bool - 是否生成成功
|
||||
"""
|
||||
try:
|
||||
# 获取域名统计信息
|
||||
domain_stats = self.db.get_domain_statistics()
|
||||
|
||||
# 获取任务统计信息
|
||||
task_stats = self.db.get_task_statistics()
|
||||
|
||||
# 生成报告
|
||||
with open(output_file, 'w', encoding='utf-8') as f:
|
||||
f.write('域名库系统统计报告\n')
|
||||
f.write('=' * 50 + '\n')
|
||||
|
||||
f.write('\n域名统计:\n')
|
||||
f.write(f'总域名数: {domain_stats.get("total", 0)}\n')
|
||||
f.write(f'可注册域名: {domain_stats.get("available", 0)}\n')
|
||||
f.write(f'已注册域名: {domain_stats.get("registered", 0)}\n')
|
||||
f.write(f'黑名单域名: {domain_stats.get("blacklisted", 0)}\n')
|
||||
|
||||
f.write('\n任务统计:\n')
|
||||
f.write(f'总任务数: {task_stats.get("total", 0)}\n')
|
||||
f.write(f'待执行任务: {task_stats.get("pending", 0)}\n')
|
||||
f.write(f'执行中任务: {task_stats.get("running", 0)}\n')
|
||||
f.write(f'已完成任务: {task_stats.get("completed", 0)}\n')
|
||||
f.write(f'失败任务: {task_stats.get("failed", 0)}\n')
|
||||
|
||||
logger.info(f"成功生成统计报告到 {output_file}")
|
||||
return True
|
||||
except Exception as e:
|
||||
logger.error(f"生成统计报告出错: {e}")
|
||||
return False
|
||||
|
||||
def export_to_excel(self, domains, output_file):
|
||||
"""
|
||||
导出域名到Excel文件
|
||||
|
||||
:param domains: 域名列表
|
||||
:param output_file: 输出文件路径
|
||||
:return: int - 导出的域名数量
|
||||
"""
|
||||
try:
|
||||
# 尝试导入openpyxl
|
||||
try:
|
||||
from openpyxl import Workbook
|
||||
except ImportError:
|
||||
# 如果没有安装openpyxl,使用CSV格式作为替代
|
||||
logger.warning("openpyxl库未安装,将使用CSV格式导出")
|
||||
return self.export_to_csv(domains, output_file.replace('.xlsx', '.csv'))
|
||||
|
||||
# 创建工作簿
|
||||
wb = Workbook()
|
||||
ws = wb.active
|
||||
|
||||
# 写入表头
|
||||
headers = ['域名', '注册状态', '使用状态', '检测状态', '人工复核状态', '过期时间', '单位性质', '网站首页网址', '检测时间', '备案历史', '备案年份', '快照年份', '百度历史', '百度Site', '是否中文标题', '360 Site', 'Google Site', '友情链接数量']
|
||||
ws.append(headers)
|
||||
|
||||
# 写入数据
|
||||
for domain in domains:
|
||||
row = [
|
||||
domain.get('domain', ''),
|
||||
domain.get('register_status', ''),
|
||||
domain.get('use_status', ''),
|
||||
domain.get('detect_status', ''),
|
||||
domain.get('review_status', ''),
|
||||
domain.get('expire_date', ''),
|
||||
domain.get('company_type', ''),
|
||||
domain.get('website_url', ''),
|
||||
domain.get('detect_time', ''),
|
||||
domain.get('has_beian', ''),
|
||||
domain.get('beian_year', ''),
|
||||
domain.get('snapshot_years', ''),
|
||||
domain.get('baidu_history', ''),
|
||||
domain.get('baidu_site', ''),
|
||||
domain.get('is_chinese_title', ''),
|
||||
domain.get('qihu360_site', ''),
|
||||
domain.get('google_site', ''),
|
||||
domain.get('backlink_count', '')
|
||||
]
|
||||
ws.append(row)
|
||||
|
||||
# 保存文件
|
||||
wb.save(output_file)
|
||||
|
||||
logger.info(f"成功导出 {len(domains)} 个域名到Excel文件: {output_file}")
|
||||
return len(domains)
|
||||
except Exception as e:
|
||||
logger.error(f"导出Excel文件出错: {e}")
|
||||
# 尝试使用CSV格式作为替代
|
||||
try:
|
||||
csv_file = output_file.replace('.xlsx', '.csv')
|
||||
logger.info(f"尝试使用CSV格式导出到: {csv_file}")
|
||||
return self.export_to_csv(domains, csv_file)
|
||||
except Exception as e2:
|
||||
logger.error(f"导出CSV文件也失败: {e2}")
|
||||
raise
|
||||
|
||||
def export_to_csv(self, domains, output_file):
|
||||
"""
|
||||
导出域名到CSV文件
|
||||
|
||||
:param domains: 域名列表
|
||||
:param output_file: 输出文件路径
|
||||
:return: int - 导出的域名数量
|
||||
"""
|
||||
try:
|
||||
import csv
|
||||
|
||||
# 写入文件
|
||||
with open(output_file, 'w', encoding='utf-8', newline='') as f:
|
||||
writer = csv.writer(f)
|
||||
|
||||
# 写入表头
|
||||
headers = ['域名', '注册状态', '使用状态', '检测状态', '人工复核状态', '过期时间', '单位性质', '网站首页网址', '检测时间', '备案历史', '备案年份', '快照年份', '百度历史', '百度Site', '是否中文标题', '360 Site', 'Google Site', '友情链接数量']
|
||||
writer.writerow(headers)
|
||||
|
||||
# 写入数据
|
||||
for domain in domains:
|
||||
row = [
|
||||
domain.get('domain', ''),
|
||||
domain.get('register_status', ''),
|
||||
domain.get('use_status', ''),
|
||||
domain.get('detect_status', ''),
|
||||
domain.get('review_status', ''),
|
||||
domain.get('expire_date', ''),
|
||||
domain.get('company_type', ''),
|
||||
domain.get('website_url', ''),
|
||||
domain.get('detect_time', ''),
|
||||
domain.get('has_beian', ''),
|
||||
domain.get('beian_year', ''),
|
||||
domain.get('snapshot_years', ''),
|
||||
domain.get('baidu_history', ''),
|
||||
domain.get('baidu_site', ''),
|
||||
domain.get('is_chinese_title', ''),
|
||||
domain.get('qihu360_site', ''),
|
||||
domain.get('google_site', ''),
|
||||
domain.get('backlink_count', '')
|
||||
]
|
||||
writer.writerow(row)
|
||||
|
||||
logger.info(f"成功导出 {len(domains)} 个域名到CSV文件: {output_file}")
|
||||
return len(domains)
|
||||
except Exception as e:
|
||||
logger.error(f"导出CSV文件出错: {e}")
|
||||
raise
|
||||
Reference in New Issue
Block a user