Skip to content

CuteCuteYu/the_evil

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

23 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

the-evil(至阴至邪)

⚠️ 警告:本项目AI分析功能会消耗大量Token,建议使用 codingplan模式 的订阅来使用本项目以降低成本。

微博数据爬取与AI智能分析工具

作者:CuteCuteYu

项目简介

the-evil 是一个模块化的微博数据爬取和AI智能分析工具,支持:

  • 爬取微博用户数据(使用 weibo.cn 移动端API)
  • 8个并行AI分析任务 + 5个详细社工方案生成(使用GLM-4模型)
  • 生成Markdown格式的详细分析报告

目录结构

the-evil/
├── src/the_evil/
│   ├── the_evil.py          # 主程序入口
│   ├── __init__.py          # 包初始化
│   └── modules/
│       ├── __init__.py     # 模块初始化
│       ├── crawlers.py     # 爬虫模块(可扩展到其他网站)
│       ├── ai_analyzer.py  # AI分析器(并行任务执行)
│       ├── prompts.py      # AI分析提示词(7种分析类型)
│       ├── quality_checker.py      # 质量检查模块(核心功能,强制启用)
│       ├── quality_check_prompts.py # 质量检查提示词(为每个分析任务定制)
│       └── config.py       # 统一配置模块(集中管理所有模型配置)
├── main.py                  # 程序入口
├── pyproject.toml          # 项目配置
└── README.md               # 说明文档

环境要求

  • Python 3.13+
  • UV 包管理器

安装

# 使用UV安装依赖
uv sync

使用方法

1. 获取Cookie

登录微博后,按以下步骤获取Cookie:

  1. 打开浏览器,访问 weibo.cn
  2. 登录你的微博账号
  3. F12 打开开发者工具
  4. 切换到 Network(网络) 标签
  5. 刷新页面,在请求列表中找到任意一个请求
  6. 点击该请求,在右侧详情中找到 Request Headers
  7. 找到 Cookie: 后面的内容,复制完整Cookie字符串

2. 设置环境变量

# 设置OpenAI API密钥
export OPENAI_API_KEY="your_api_key"

# 设置API地址(可选)
export OPENAI_BASE_URL="https://open.bigmodel.cn/api/coding/paas/v4"

3. 模型选择设置

程序支持多种AI模型,可以通过环境变量配置:

默认模型(智谱GLM-4)

export OPENAI_API_KEY="your_zhipu_api_key"
export OPENAI_BASE_URL="https://open.bigmodel.cn/api/coding/paas/v4"

支持的模型

本项目仅支持兼容 OpenAI Python SDK 格式的 API(必须为 https://xxx/v1 格式)。只要 API 符合 OpenAI 格式,都可以正常使用,包括:

  • 智谱 GLM 系列模型(如 glm-4, glm-4-flash)
  • OpenAI GPT 系列模型(如 gpt-4, gpt-4o)
  • Anthropic Claude 系列模型(如 claude-3)
  • 其他兼容 OpenAI 格式的 API(如硅基流动、阿里的通义等)

自定义模型示例

本项目通过设置 base_urlapi_key 环境变量来使用不同的 AI 模型:

# 使用智谱 GLM-4-Flash(免费快速)
export OPENAI_API_KEY="your_zhipu_api_key"
export OPENAI_BASE_URL="https://open.bigmodel.cn/api/coding/paas/v4"

# 或使用 OpenAI GPT-4
export OPENAI_API_KEY="sk-xxx"
export OPENAI_BASE_URL="https://api.openai.com/v1"

代码中修改默认模型

modules/config.py 中统一修改所有模型相关配置:

# 修改默认模型
DEFAULT_MODEL = "glm-4.7"  # 改为你想使用的模型

# 修改温度参数
DEFAULT_TEMPERATURE = 0.7

# 修改默认API地址
DEFAULT_BASE_URL = "https://open.bigmodel.cn/api/coding/paas/v4"

# 修改并发数
MAX_WORKERS = 7

修改 config.py 后,所有使用这些配置的代码会自动使用新值,无需逐个修改。

4. 运行程序

# 基本用法(所有参数必填)
uv run python main.py <cookie> <uid> <output_file> <max_weibos> <model> <api_key> <base_url>

# 示例:爬取胡歌的微博
uv run python main.py "你的Cookie" 1223178222 output.csv 100 glm-4.7 "your_api_key" "https://open.bigmodel.cn/api/coding/paas/v4"

参数说明

参数 说明 必填
cookie 微博登录Cookie
uid 微博用户ID
output_file 输出CSV文件名
max_weibos 最大获取微博数(建议100,0表示全部)
model AI模型名称
api_key API密钥
base_url API地址

获取UID

在微博用户主页的URL中可以找到UID,例如:

  • https://weibo.com/u/1223178222 → UID = 1223178222
  • https://weibo.com/1223178222 → UID = 1223178222

AI分析功能

程序会自动进行7项并行AI分析,并包含强制启用的质量检查功能:

  1. 统计分析 - 微博数量、互动数据、发布时间分布等
  2. 性格分析 - 从社会工程学角度分析用户性格特征
  3. 兴趣分析 - 从情报收集角度分析用户兴趣爱好
  4. 轨迹分析 - 从OSINT角度分析用户活动轨迹和生活习惯
  5. 社交分析 - 从社交网络角度分析用户社交圈子
  6. 情感分析 - 从心理分析角度用户情感表达方式
  7. 综合报告 - 生成完整的Markdown分析报告
  8. 社工攻击方案 - 基于分析结果生成社会工程学攻击方案(仅供安全研究)
  9. 详细社工方案(5个AI agent) - 基于社工攻击方案生成5个详细实施计划

质量检查功能(强制启用)

每个AI分析任务完成后,会自动进行质量检查:

  • 长度检查 - 确保内容长度达标
  • 完整性检查 - 确保包含所有必需的分析维度
  • 分析依据检查 - 确保每个结论都有数据支撑
  • 自动补充 - 如果检查不通过,自动请求AI补充缺失内容

单个任务报告(强制保存)

每个分析任务通过质量检查后,会自动保存独立的Markdown报告:

  • 文件命名:{基础文件名}_{任务名称}.md
  • 例如:用户名_statistics.md用户名_personality.md
  • 报告包含:质量评分、补充轮数、完整的分析结果

分析依据要求

每个分析结论都要求包含"分析依据"部分,说明:

  • 数据来源(CSV的哪一列)
  • 具体证据(引用具体微博内容)
  • 分析逻辑

输出文件

运行程序后,会生成以下文件:

类型 文件名 说明
数据 {文件名}.csv 微博原始数据
综合报告 {文件名}_report.md 综合分析报告
任务报告 {文件名}_statistics.md 统计分析报告
任务报告 {文件名}_personality.md 性格分析报告
任务报告 {文件名}_interest.md 兴趣分析报告
任务报告 {文件名}_trajectory.md 轨迹分析报告
任务报告 {文件名}_social.md 社交分析报告
任务报告 {文件名}_emotion.md 情感分析报告
社工方案 {文件名}_social_engineering.md 社会工程学攻击方案
详细方案 {文件名}_detailed_identity_disguise.md 身份伪装方案
详细方案 {文件名}_detailed_social_media_channel.md 社交媒体渠道管理方案
详细方案 {文件名}_detailed_script_preparation.md 话术准备方案
详细方案 {文件名}_detailed_scenario_construction.md 场景构建方案
详细方案 {文件名}_detailed_emotion_guidance.md 情感引导方案

流程优化(跳过已有分析)

如果文件夹中已有详细社工方案文件,程序会自动跳过所有分析流程。如果只有综合报告,则直接生成社工攻击方案和5个详细方案。如果只有CSV文件,则执行完整的8项AI分析任务。

输出文件示例

以用户"闫桉"为例,生成的文件列表:

文件名 说明
闫桉_the_evil.csv 微博原始数据
闫桉_output_report.md 综合分析报告
闫桉_output_statistics.md 统计分析报告
闫桉_output_personality.md 性格分析报告
闫桉_output_interest.md 兴趣分析报告
闫桉_output_trajectory.md 轨迹分析报告
闫桉_output_social.md 社交分析报告
闫桉_output_emotion.md 情感分析报告
闫桉_output_social_engineering.md 社会工程学攻击方案
闫桉_output_detailed_identity_disguise.md 身份伪装详细方案
闫桉_output_detailed_social_media_channel.md 社交媒体渠道管理详细方案
闫桉_output_detailed_script_preparation.md 话术准备详细方案
闫桉_output_detailed_scenario_construction.md 场景构建详细方案
闫桉_output_detailed_emotion_guidance.md 情感引导详细方案

相关文档

模块化设计

扩展新的爬虫

本项目采用模块化设计,支持扩展新的网站爬虫。以下是添加自定义爬虫的详细步骤。

1. 数据模型

项目定义了统一的数据模型,用于不同平台的数据标准化:

# 微博数据模型
class WeiboData:
    id: str           # 内容ID
    content: str      # 内容文本
    is_original: bool # 是否原创
    publish_time: str  # 发布时间
    publish_tool: str  # 发布工具
    up_num: int       # 点赞数
    retweet_num: int  # 转发数
    comment_num: int  # 评论数
    publish_place: str # 发布位置
    picture_url: str  # 图片URL
    video_url: str    # 视频URL

# 用户信息模型
class UserInfo:
    id: str           # 用户ID
    nickname: str     # 昵称
    weibo_num: int    # 内容数
    following: int    # 关注数
    followers: int    # 粉丝数
    gender: str       # 性别
    location: str     # 所在地
    birthday: str     # 生日
    description: str  # 简介

2. 创建爬虫类

modules/crawlers.py 中创建新的爬虫类,继承 BaseCrawler

class DouyinCrawler(BaseCrawler):
    """抖音爬虫类"""

    def __init__(self, cookie):
        super().__init__(cookie)
        self.base_url = "https://www.douyin.com"

    def get_user_info(self, user_id):
        """
        获取用户信息

        参数:
            user_id: 用户ID

        返回:
            UserInfo对象
        """
        url = f"{self.base_url}/user/{user_id}"
        # 实现获取用户信息的逻辑
        selector = self._fetch_page(url)
        
        # 解析用户信息并返回UserInfo对象
        nickname = selector.xpath('//span[@class="nickname"]/text()')[0]
        # ... 其他字段解析
        
        return UserInfo(
            id=user_id,
            nickname=nickname,
            # ... 其他参数
        )

    def get_weibos(self, user_id, max_count=0):
        """
        获取用户内容列表

        参数:
            user_id: 用户ID
            max_count: 最大获取数量,0表示全部

        返回:
            WeiboData对象列表
        """
        weibos = []
        page = 1
        
        while True:
            url = f"{self.base_url}/aweme/v1/web/aweme/v1/web/aweme/post/?user_id={user_id}&cursor={page}"
            data = self._fetch_json(url)  # 假设添加了_fetch_json方法
            
            for item in data.get("aweme_list", []):
                weibo = self._parse_weibo(item)
                weibos.append(weibo)
                
                if max_count > 0 and len(weibos) >= max_count:
                    return weibos
            
            if not data.get("has_more"):
                break
            page += 1
        
        return weibos

    def _parse_weibo(self, item):
        """解析单条内容"""
        return WeiboData(
            id=item.get("aweme_id"),
            content=item.get("desc"),
            is_original=True,
            publish_time=item.get("create_time"),
            # ... 其他字段
        )

3. 注册爬虫

create_crawler 函数中注册新的爬虫:

def create_crawler(platform, cookie):
    """
    创建爬虫实例

    参数:
        platform: 平台名称,如"weibo"、"douyin"
        cookie: 登录cookie

    返回:
        对应的爬虫实例
    """
    crawlers = {
        "weibo": WeiboCrawler,
        "douyin": DouyinCrawler,  # 添加新爬虫
        "bilibili": BilibiliCrawler,  # 再添加一个
    }

    crawler_class = crawlers.get(platform.lower())
    if not crawler_class:
        raise ValueError(
            f"不支持的平台: {platform},支持的平台: {list(crawlers.keys())}"
        )

    return crawler_class(cookie)

4. 抽象方法说明

必须实现的抽象方法:

方法 说明 返回值
get_user_info(user_id) 获取用户基本信息 UserInfo 对象
get_weibos(user_id, max_count) 获取用户内容列表 List[WeiboData]

5. 辅助方法

BaseCrawler 提供的辅助方法:

方法 说明
_build_headers() 构建请求头
save_to_csv(user_info, weibos, output_file) 保存数据到CSV

6. 完整示例:添加Twitter/X爬虫

class TwitterCrawler(BaseCrawler):
    """Twitter爬虫类"""

    def __init__(self, cookie):
        super().__init__(cookie)
        self.base_url = "https://twitter.com"

    def get_user_info(self, user_id):
        url = f"{self.base_url}/{user_id}"
        selector = self._fetch_page(url)
        
        nickname = selector.xpath('//div[@data-testid="UserName"]//span/text()')[0]
        # ... 获取其他信息
        
        return UserInfo(id=user_id, nickname=nickname, ...)

    def get_weibos(self, user_id, max_count=0):
        weibos = []
        # 实现获取推文列表的逻辑
        return weibos

然后在 create_crawler 中注册即可使用:

crawler = create_crawler("twitter", "your_cookie")
user_info = crawler.get_user_info("elonmusk")
tweets = crawler.get_weibos("elonmusk", max_count=100)

修改AI分析提示词

modules/prompts.py 中可以修改或添加以下内容:

1. 修改现有分析任务的提示词

每个分析任务的提示词包含两个部分:

  • SYSTEM_PROMPT: 定义AI的角色和身份
  • USER_PROMPT: 定义分析要求和格式
# 修改统计分析的提示词
STATISTICS_SYSTEM_PROMPT = """你是一个xxx专家..."""
STATISTICS_USER_PROMPT = """请分析xxx..."""

# 修改性格分析的提示词
PERSONALITY_SYSTEM_PROMPT = """你是一个社会工程学专家..."""
PERSONALITY_USER_PROMPT = """请从社会工程学角度分析xxx..."""

2. 可修改的分析任务列表

变量名 分析任务 说明
STATISTICS_* 统计分析 微博数量、互动数据、时间分布等
PERSONALITY_* 性格分析 社会工程学角度的性格特征分析
INTEREST_* 兴趣分析 兴趣爱好、关注领域、消费倾向
TRAJECTORY_* 轨迹分析 OSINT角度的活动轨迹和生活习惯
SOCIAL_* 社交分析 社交网络、圈子、影响力分析
EMOTION_* 情感分析 心理分析角度的情感表达方式
REPORT_* 综合报告 整合所有分析生成完整报告
SOCIAL_ENGINEERING_* 社工攻击方案 基于分析结果生成攻击方案
IDENTITY_DISGUISE_* 身份伪装方案 详细社工方案-身份伪装
SOCIAL_MEDIA_CHANNEL_* 社交媒体渠道方案 详细社工方案-渠道管理
SCRIPT_PREPARATION_* 话术准备方案 详细社工方案-话术设计
SCENARIO_CONSTRUCTION_* 场景构建方案 详细社工方案-场景设计
EMOTION_GUIDANCE_* 情感引导方案 详细社工方案-情感引导

3. 添加新的分析任务

prompts.py 中添加新的提示词定义:

# 添加新的分析任务
NEW_TASK_SYSTEM_PROMPT = """你是一个xxx领域的专家..."""
NEW_TASK_USER_PROMPT = """请分析xxx..."""

然后在 ai_analyzer.pycreate_analysis_tasks() 函数中注册新任务:

# 在 tasks 列表中添加新任务
tasks = [
    # ... 现有任务 ...
    {
        "name": "new_task",
        "system_prompt": NEW_TASK_SYSTEM_PROMPT,
        "user_prompt": NEW_TASK_USER_PROMPT,
    },
]

4. 修改质量检查提示词

modules/quality_check_prompts.py 中可以修改每个分析任务的质量检查标准:

# 修改特定任务的质量检查提示词
def get_quality_check_prompt(task_name):
    prompts = {
        "statistics": {
            "system": "你是数据分析专家,请审查分析结果的质量...",
            "user": "请检查统计分析报告是否完整准确..."
        },
        # 添加或修改其他任务...
    }
    return prompts.get(task_name, prompts["default"])

5. 修改质量检查提示词

除了 prompts.py 中的分析提示词,modules/quality_check_prompts.py 中的质量检查提示词也可以修改。这些提示词用于在AI生成分析结果后,检查内容是否完整并补充缺失部分。

# 修改统计分析的质量检查提示词
STATISTICS_QUALITY_SYSTEM_PROMPT = """你是一个数据分析质量检查专家..."""
STATISTICS_QUALITY_USER_PROMPT = """请对以下统计分析结果进行质量检查...

【原始分析结果】
{original_content}

【质量检查标准】
请检查以下项目是否完整:
1. 微博总数统计
2. 原创/转发比例
...
"""

# 修改性格分析的质量检查提示词
PERSONALITY_QUALITY_SYSTEM_PROMPT = """你是一个社会工程学专家..."""
PERSONALITY_QUALITY_USER_PROMPT = """请对以下性格特点分析结果进行质量检查...

【原始分析结果】
{original_content}

【质量检查标准】
请检查以下分析维度是否完整:
1. 性格类型分析
2. 社交媒体行为模式
...
"""

可修改的质量检查提示词列表

变量名 对应分析任务 检查内容
STATISTICS_QUALITY_* 统计分析 数据完整性、数值准确性
PERSONALITY_QUALITY_* 性格分析 分析依据引用、结论深度
INTEREST_QUALITY_* 兴趣分析 分类全面性、具体引用
TRAJECTORY_QUALITY_* 轨迹分析 时间规律、地点证据
SOCIAL_QUALITY_* 社交分析 关系网络、互动数据
EMOTION_QUALITY_* 情感分析 情感倾向、表达方式

每个质量检查提示词包含:

  • SYSTEM_PROMPT: 定义检查专家的角色
  • USER_PROMPT: 定义检查标准和补充要求,包含 {original_content} 占位符

📚 学习参考:B站 AI 分析提示词教程

注意事项

  1. Cookie有效期:Cookie会过期,如遇到登录错误请重新获取
  2. 请求频率:程序已设置合理的请求间隔,避免被封禁
  3. 数据安全:请妥善保管Cookie,不要泄露给他人
  4. 合规使用:请遵守微博服务条款,仅用于学习研究

版本历史

  • v2.1.0 - 详细社工方案版本
    • 新增5个AI Agent详细实施计划(身份伪装、社交媒体渠道管理、话术准备、场景构建、情感引导)
    • 新增智能跳过逻辑,避免重复消耗API tokens
    • 优化工作流程,支持部分文件存在时跳过相应步骤
  • v2.0.0 - 质量检查版本
    • 新增强制启用的质量检查功能
    • 新增单个任务报告自动保存
    • 新增统一配置模块(config.py)
    • 新增任务特定的质量检查提示词
    • 修改默认模型为 glm-4.7
    • 修复导入问题(支持绝对导入和相对导入自动回退)
  • v1.0.0 - 初始版本,支持微博数据爬取和7项AI分析

许可证

仅供学习研究使用

Claude/OpenCode Skill 使用(必须使用二进制版本)

⚠️ 强制要求:本项目的 skill 必须使用编译后的二进制文件,禁止直接运行 Python 源码。使用前请务必完成以下步骤。

第一步:下载或编译二进制文件

方式A:直接使用已编译的二进制文件

下载项目 release 中的 the-evil.exe 文件。

方式B:自行编译二进制文件

# 1. 安装 PyInstaller
uv pip install pyinstaller

# 2. 编译项目
uv run pyinstaller the_evil.spec --noconfirm --distpath .

# 3. 编译完成后,会在当前目录生成 the-evil.exe 文件

第二步:添加到系统环境变量

the-evil.exe 所在目录添加到系统 PATH 环境变量:

Windows PowerShell(管理员模式)

# 假设 the-evil.exe 在 D:\code\python\the-evil 目录
$currentPath = [Environment]::GetEnvironmentVariable("Path", "Machine")
[Environment]::SetEnvironmentVariable("Path", "$currentPath;D:\code\python\the-evil", "Machine")

# 刷新环境变量
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine")

Windows CMD

# 假设 the-evil.exe 在 D:\code\python\the-evil 目录
setx PATH "%PATH%;D:\code\python\the-evil" /M

验证安装

# 在任意目录打开命令行,输入以下命令验证
the-evil.exe

# 如果显示帮助信息,说明安装成功

第三步:安装 Skill

.claude/skills/the-evil 目录复制到 Claude 的全局 skills 目录:

# 复制 skill 目录到全局位置
cp -r .claude/skills/the-evil C:/Users/j4543/.claude/skills/

使用 Skill

当在 Claude/OpenCode 中使用本项目时,AI 会自动加载 skill 并提供以下指导:

  • 检查项目目录是否正确
  • 验证 the-evil.exe 是否在 PATH 中(强制检查)
  • 提示用户使用二进制文件运行程序

Skill 功能

  • 检测 the-evil.exe 是否存在于 PATH 中
  • 如果不存在,提示用户按照上述步骤编译并添加到 PATH
  • 使用 the-evil.exe 命令执行程序