⚠️ 警告:本项目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登录微博后,按以下步骤获取Cookie:
- 打开浏览器,访问 weibo.cn
- 登录你的微博账号
- 按 F12 打开开发者工具
- 切换到 Network(网络) 标签
- 刷新页面,在请求列表中找到任意一个请求
- 点击该请求,在右侧详情中找到 Request Headers
- 找到
Cookie:后面的内容,复制完整Cookie字符串
# 设置OpenAI API密钥
export OPENAI_API_KEY="your_api_key"
# 设置API地址(可选)
export OPENAI_BASE_URL="https://open.bigmodel.cn/api/coding/paas/v4"程序支持多种AI模型,可以通过环境变量配置:
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_url 和 api_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 后,所有使用这些配置的代码会自动使用新值,无需逐个修改。
# 基本用法(所有参数必填)
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地址 | 是 |
在微博用户主页的URL中可以找到UID,例如:
https://weibo.com/u/1223178222→ UID = 1223178222https://weibo.com/1223178222→ UID = 1223178222
程序会自动进行7项并行AI分析,并包含强制启用的质量检查功能:
- 统计分析 - 微博数量、互动数据、发布时间分布等
- 性格分析 - 从社会工程学角度分析用户性格特征
- 兴趣分析 - 从情报收集角度分析用户兴趣爱好
- 轨迹分析 - 从OSINT角度分析用户活动轨迹和生活习惯
- 社交分析 - 从社交网络角度分析用户社交圈子
- 情感分析 - 从心理分析角度用户情感表达方式
- 综合报告 - 生成完整的Markdown分析报告
- 社工攻击方案 - 基于分析结果生成社会工程学攻击方案(仅供安全研究)
- 详细社工方案(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 |
情感引导详细方案 |
本项目采用模块化设计,支持扩展新的网站爬虫。以下是添加自定义爬虫的详细步骤。
项目定义了统一的数据模型,用于不同平台的数据标准化:
# 微博数据模型
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 # 简介在 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"),
# ... 其他字段
)在 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)必须实现的抽象方法:
| 方法 | 说明 | 返回值 |
|---|---|---|
get_user_info(user_id) |
获取用户基本信息 | UserInfo 对象 |
get_weibos(user_id, max_count) |
获取用户内容列表 | List[WeiboData] |
BaseCrawler 提供的辅助方法:
| 方法 | 说明 |
|---|---|
_build_headers() |
构建请求头 |
save_to_csv(user_info, weibos, output_file) |
保存数据到CSV |
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)在 modules/prompts.py 中可以修改或添加以下内容:
每个分析任务的提示词包含两个部分:
SYSTEM_PROMPT: 定义AI的角色和身份USER_PROMPT: 定义分析要求和格式
# 修改统计分析的提示词
STATISTICS_SYSTEM_PROMPT = """你是一个xxx专家..."""
STATISTICS_USER_PROMPT = """请分析xxx..."""
# 修改性格分析的提示词
PERSONALITY_SYSTEM_PROMPT = """你是一个社会工程学专家..."""
PERSONALITY_USER_PROMPT = """请从社会工程学角度分析xxx..."""| 变量名 | 分析任务 | 说明 |
|---|---|---|
STATISTICS_* |
统计分析 | 微博数量、互动数据、时间分布等 |
PERSONALITY_* |
性格分析 | 社会工程学角度的性格特征分析 |
INTEREST_* |
兴趣分析 | 兴趣爱好、关注领域、消费倾向 |
TRAJECTORY_* |
轨迹分析 | OSINT角度的活动轨迹和生活习惯 |
SOCIAL_* |
社交分析 | 社交网络、圈子、影响力分析 |
EMOTION_* |
情感分析 | 心理分析角度的情感表达方式 |
REPORT_* |
综合报告 | 整合所有分析生成完整报告 |
SOCIAL_ENGINEERING_* |
社工攻击方案 | 基于分析结果生成攻击方案 |
IDENTITY_DISGUISE_* |
身份伪装方案 | 详细社工方案-身份伪装 |
SOCIAL_MEDIA_CHANNEL_* |
社交媒体渠道方案 | 详细社工方案-渠道管理 |
SCRIPT_PREPARATION_* |
话术准备方案 | 详细社工方案-话术设计 |
SCENARIO_CONSTRUCTION_* |
场景构建方案 | 详细社工方案-场景设计 |
EMOTION_GUIDANCE_* |
情感引导方案 | 详细社工方案-情感引导 |
在 prompts.py 中添加新的提示词定义:
# 添加新的分析任务
NEW_TASK_SYSTEM_PROMPT = """你是一个xxx领域的专家..."""
NEW_TASK_USER_PROMPT = """请分析xxx..."""然后在 ai_analyzer.py 的 create_analysis_tasks() 函数中注册新任务:
# 在 tasks 列表中添加新任务
tasks = [
# ... 现有任务 ...
{
"name": "new_task",
"system_prompt": NEW_TASK_SYSTEM_PROMPT,
"user_prompt": NEW_TASK_USER_PROMPT,
},
]在 modules/quality_check_prompts.py 中可以修改每个分析任务的质量检查标准:
# 修改特定任务的质量检查提示词
def get_quality_check_prompt(task_name):
prompts = {
"statistics": {
"system": "你是数据分析专家,请审查分析结果的质量...",
"user": "请检查统计分析报告是否完整准确..."
},
# 添加或修改其他任务...
}
return prompts.get(task_name, prompts["default"])除了 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 分析提示词教程
- Cookie有效期:Cookie会过期,如遇到登录错误请重新获取
- 请求频率:程序已设置合理的请求间隔,避免被封禁
- 数据安全:请妥善保管Cookie,不要泄露给他人
- 合规使用:请遵守微博服务条款,仅用于学习研究
- v2.1.0 - 详细社工方案版本
- 新增5个AI Agent详细实施计划(身份伪装、社交媒体渠道管理、话术准备、场景构建、情感引导)
- 新增智能跳过逻辑,避免重复消耗API tokens
- 优化工作流程,支持部分文件存在时跳过相应步骤
- v2.0.0 - 质量检查版本
- 新增强制启用的质量检查功能
- 新增单个任务报告自动保存
- 新增统一配置模块(config.py)
- 新增任务特定的质量检查提示词
- 修改默认模型为 glm-4.7
- 修复导入问题(支持绝对导入和相对导入自动回退)
- v1.0.0 - 初始版本,支持微博数据爬取和7项AI分析
仅供学习研究使用
⚠️ 强制要求:本项目的 skill 必须使用编译后的二进制文件,禁止直接运行 Python 源码。使用前请务必完成以下步骤。
下载项目 release 中的 the-evil.exe 文件。
# 1. 安装 PyInstaller
uv pip install pyinstaller
# 2. 编译项目
uv run pyinstaller the_evil.spec --noconfirm --distpath .
# 3. 编译完成后,会在当前目录生成 the-evil.exe 文件将 the-evil.exe 所在目录添加到系统 PATH 环境变量:
# 假设 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")# 假设 the-evil.exe 在 D:\code\python\the-evil 目录
setx PATH "%PATH%;D:\code\python\the-evil" /M# 在任意目录打开命令行,输入以下命令验证
the-evil.exe
# 如果显示帮助信息,说明安装成功将 .claude/skills/the-evil 目录复制到 Claude 的全局 skills 目录:
# 复制 skill 目录到全局位置
cp -r .claude/skills/the-evil C:/Users/j4543/.claude/skills/当在 Claude/OpenCode 中使用本项目时,AI 会自动加载 skill 并提供以下指导:
- 检查项目目录是否正确
- 验证 the-evil.exe 是否在 PATH 中(强制检查)
- 提示用户使用二进制文件运行程序
- 检测 the-evil.exe 是否存在于 PATH 中
- 如果不存在,提示用户按照上述步骤编译并添加到 PATH
- 使用
the-evil.exe命令执行程序