简介:这个资源包提供一套可直接运行的Python微信机器人代码,基于网页版微信协议实现个人微信号的自动化交互。不需要微信官方API权限,通过模拟登录完成消息收发。主要功能包括:输入城市名自动获取实时天气信息(调用公开天气API)、发送指令随机推送一则冷笑话、设置关键词触发预设回复(比如回复‘你好’就自动发欢迎语)。整个项目结构清晰,包含主程序main.py、核心逻辑wechat_robot.py、配置文件config.py(填入微信扫码登录后的session和天气API密钥即可)、依赖清单requirements.txt,以及两份详细文档:《微信机器人程序使用说明.doc》和《程序配置说明.docx》,还有README.md快速上手指南。附带test.py用于一键验证基础功能是否正常,weather.py和joke.py分别封装了天气与笑话服务,方便单独调试或扩展新功能。支持Windows和Linux系统,Python 3.7及以上版本,安装依赖后按文档步骤配置就能启动。适合想了解微信自动化原理、搭建轻量个人助理,或作为教学示例来学习requests、itchat(或weixin-api类似库)、配置管理等实用技能。
1. 这不是“外挂”,而是一套可理解、可调试、可掌控的个人微信自动化实践方案
你有没有过这样的念头:早上通勤路上,想顺手问一句“今天北京会下雨吗”,不用打开App、不用切页面,直接在微信对话框里敲几个字,几秒后就收到带温度、湿度、风速的天气卡片;或者深夜加班写PPT,脑子卡壳了,发个“讲个笑话”,对面立刻甩来一则冷得恰到好处的段子;又或者你是个自由职业者,客户常在固定时段集中咨询,你希望微信自动回复一句“您好,已收到消息,稍后详细回复”,既不漏掉信息,也不被打断工作流——这些事,不需要买服务、不开通企业号、不申请复杂权限,用一台装了Python的电脑,配合你自己的微信个人号,就能稳稳跑起来。
这正是我过去三年反复打磨、在真实场景中每天使用的那套小工具。它不叫“微信机器人”,我更愿意称它为微信个人号的延伸触手。它不破解协议、不绕过安全机制、不模拟点击、不注入进程,而是老老实实走网页版微信(wx.qq.com)的公开交互路径:扫码登录、维持长连接、解析消息包、构造响应体、触发发送动作。整个过程就像一个懂HTTP、会读JSON、能保持会话状态的“数字助理”,它只做三件事:听你说话、查你需要的信息、把结果原样送回去。关键词“微信自动回复”“Python机器人”“天气查询”“笑话推送”不是功能罗列,而是四个可拆解、可替换、可审计的模块化能力单元。它面向的不是技术小白一键安装,而是愿意花30分钟看懂config.py里每个字段含义、愿意在weather.py里加一行print调试API返回值、愿意在wechat_robot.py里亲手改一句正则匹配逻辑的务实学习者。你不需要成为全栈工程师,但得习惯和requests.session、JSON结构、时间戳格式、编码转换打交道——而这恰恰是现代自动化脚本最真实、最普遍的工作现场。
2. 整体设计思路与底层逻辑:为什么选择网页版协议模拟,而不是其他方案?
2.1 方案选型的三次淘汰:从“快”到“稳”再到“可教”
最早我试过基于安卓ADB的方案:用Python调adb shell发送按键事件,模拟人工操作微信App。它启动快、上手简单,但致命缺陷是不可靠——微信App版本一更新,UI控件ID就变,XPath全失效;手机锁屏、通知栏弹出、后台被杀,都会让脚本当场停摆。第二轮我转向了企业微信API,官方文档齐全、接口稳定、支持消息模板。但它要求你必须注册企业主体、认证资质、配置可信IP白名单,一个自由职业者只为查天气去走完工商核验流程?显然本末倒置。第三轮,我回归网页版微信(wx.qq.com),原因很朴素:它对用户最友好——你只需要用手机微信扫个码,登录态就建立;它对开发者最透明——所有请求都是标准HTTP/HTTPS,响应都是清晰JSON,Chrome DevTools里点开Network标签页,每一步交互都看得明明白白;它对教学最友好——没有黑盒SDK、没有加密签名、没有隐藏参数,每一个request.headers、每一个response.json(),都是可以打印、可以修改、可以重放的活样本。
提示:这不是“破解”,而是利用微信网页版本身提供的、面向浏览器的公开通信契约。就像你用curl命令访问一个网站,只要遵循它的请求格式,服务器就会返回数据——这套机器人做的,就是把“人用浏览器访问”这件事,用Python代码忠实复现。
2.2 架构分层:四层解耦,让每个模块都能独立演进
整个项目采用清晰的四层架构,每一层只关心自己的职责,彼此通过定义良好的接口通信:
-
接入层(wechat_robot.py):这是系统的“耳朵和嘴巴”。它负责与网页版微信服务器建立并维持WebSocket长连接,监听新消息事件,解析原始消息包(提取发送人、消息类型、文本内容),再将处理后的响应内容封装成标准格式发回。它不关心天气怎么查、笑话从哪来,只管“收”和“发”。
-
服务层(weather.py / joke.py):这是系统的“大脑”。weather.py封装了对和风天气(HeFeng Weather)免费API的调用逻辑:构造请求URL、设置headers(含你的专属key)、处理HTTP状态码、解析JSON响应、提取温度、天气状况、风向风力等关键字段,并格式化为适合微信发送的纯文本或图文消息。joke.py同理,对接的是一个开源笑话API,负责获取、清洗、缓存(避免重复推送同一则)、按需返回。它们是完全独立的Python模块,你可以把它单独拎出来,在命令行里运行
python weather.py --city 北京,立刻看到返回结果,调试零门槛。 -
配置层(config.py):这是系统的“记忆中枢”。它不写死任何敏感信息,而是提供统一入口管理所有外部依赖:微信登录后的session_id(由接入层自动保存)、天气API密钥(需自行去和风官网申请)、笑话API地址、日志级别、消息响应延迟阈值等。所有硬编码都被剥离,替换配置即切换环境,本地开发用测试key,部署到树莓派就换正式key,无需动一行业务逻辑。
-
编排层(main.py):这是系统的“指挥官”。它不做具体业务,只负责初始化配置、启动接入层、注册服务层回调函数、捕获全局异常、优雅退出。当你执行
python main.py时,它就像一个冷静的调度员,把各个模块拉上舞台,确保它们按序就位、协同运转。
这种分层不是为了炫技,而是为了应对真实世界的变更。去年和风天气API升级了鉴权方式,我只改了weather.py里的两行代码(增加Authorization header),其他所有模块毫发无损;前天我想给笑话加个“今日运势”联动功能,只需新增fortune.py,再在main.py里注册一个新回调,wechat_robot.py里连if判断都不用加。
2.3 关键技术选型依据:为什么是itchat,而不是weixin-api或wxpy?
项目依赖清单里写着itchat>=1.4.0,<2.0.0,这是经过大量对比后的审慎选择。weixin-api是一个更轻量的库,但文档稀疏、社区停滞,遇到登录态维持问题几乎找不到参考案例;wxpy功能强大,支持多账号、群管理,但其底层依赖pync(macOS通知)和一些Windows特定组件,在Linux服务器上部署时常报错,且对网页版协议的细节封装过深,调试时难以定位是库的问题还是自己逻辑的问题。
itchat则不同:它诞生于微信网页版协议尚属“半开放”时期,作者投入大量精力逆向分析了登录二维码生成、心跳保活、消息加解密等核心环节,并以极简API暴露给使用者。它的源码只有两千多行,每个函数命名直白(get_contact()、send_msg()、logout()),出错时抛出的异常信息明确指向具体HTTP请求失败点。更重要的是,它有一个活跃的中文社区,Stack Overflow和GitHub Issues里能找到大量真实踩坑记录——比如“扫码后一直卡在‘正在登录’”,答案往往是itchat.auto_login(enableCmdQR=2)参数没设对;“消息收不到”,大概率是itchat.run()没加blockThread=False导致主线程阻塞。这些不是理论知识,而是血泪经验,是新手能立刻抄作业、老手能快速排障的宝贵资产。
3. 核心细节解析与实操要点:从扫码登录到消息精准响应
3.1 微信登录态的本质:Session ID才是真正的“通行证”
很多人以为扫码登录成功后,程序就“永久在线”了。其实不然。网页版微信的登录态由一组Cookie和一个核心的webwx_data_ticket组成,这个ticket有效期通常为2小时。itchat在登录成功后,会自动将这些凭证序列化保存到本地文件(默认itchat.pkl),并在后续请求中自动携带。但关键点在于:这个pickle文件不是万能钥匙。如果你把整个项目打包发给朋友,他直接运行,即使有相同的pickle文件,也会登录失败——因为微信服务器会校验登录设备的指纹(User-Agent、屏幕分辨率、时区、甚至Canvas渲染特征)。所以,首次运行必须本人扫码。
注意:不要把
itchat.pkl上传到Git仓库!它包含你的登录凭证,一旦泄露,他人可接管你的微信网页版会话。.gitignore里已明确排除该文件,但务必检查你的IDE是否启用了“显示隐藏文件”并误提交。
实操中,我建议在main.py开头加入一段健壮的登录逻辑:
import itchat
import os
def ensure_login():
# 尝试加载已保存的登录状态
if os.path.exists('itchat.pkl'):
try:
itchat.load_login_status('itchat.pkl')
# 验证登录态是否有效:尝试获取好友列表
if itchat.get_friends():
print("✅ 已加载有效登录态")
return True
except:
pass
# 登录态无效或不存在,执行扫码登录
print("⚠️ 正在启动扫码登录,请使用手机微信扫描二维码...")
itchat.auto_login(
enableCmdQR=2, # 在终端显示带颜色的二维码(Linux/macOS)
hotReload=True, # 关闭程序后,下次启动自动恢复登录态
statusStorageDir='itchat.pkl' # 明确指定存储路径
)
print("✅ 扫码登录成功")
return True
ensure_login()
这段代码的价值在于:它把“登录”这件事从一次性操作,变成了可重入、可验证、可降级的可靠流程。hotReload=True是精髓——它让itchat在退出时自动保存当前会话,下次启动时优先尝试恢复,极大提升日常使用体验。
3.2 消息路由的核心:正则匹配比简单字符串查找更精准、更灵活
项目支持“关键词触发预设回复”,比如发送“你好”,自动回复“欢迎光临!”。初学者常写:
if msg['Text'] == '你好':
itchat.send('欢迎光临!', toUserName=msg['FromUserName'])
这看似正确,但实际会漏掉大量合法输入:“你好呀”、“你好啊”、“ 你好 ”(带空格)、“你好!”(带标点)。更鲁棒的做法是使用正则表达式:
import re
# 定义关键词模式:匹配“你好”及其常见变体
HELLO_PATTERN = r'[^\w]*(你好|您好|hi|hello)[^\w]*'
def handle_hello(msg):
text = msg['Text'].strip()
if re.fullmatch(HELLO_PATTERN, text, re.IGNORECASE):
return '欢迎光临!今天有什么我可以帮您的?'
return None
# 在消息处理主循环中调用
response = handle_hello(msg)
if response:
itchat.send(response, toUserName=msg['FromUserName'])
re.fullmatch确保整个消息文本都符合模式,re.IGNORECASE忽略大小写,[^\w]*匹配任意非字母数字字符(空格、标点、emoji),这样“你好!”、“Hi~”、“您好!!!”都能被捕获。我还在项目里预留了config.py中的KEYWORD_RULES字典,允许用户直接在配置文件里添加新规则,无需改代码:
# config.py
KEYWORD_RULES = {
r'(?i)天气.*?(北京|上海|广州|深圳)': 'weather_query',
r'(?i)讲.*?笑话': 'joke_push',
r'(?i)帮助|help': 'show_help'
}
主程序读取此字典,动态编译正则对象,实现配置驱动的路由逻辑。这种设计让非程序员也能通过编辑文本文件,轻松扩展机器人的“听懂能力”。
3.3 天气查询的可靠性加固:超时、重试、降级三板斧
调用第三方API最怕什么?网络抖动、服务宕机、限流熔断。如果一次天气查询失败,就让整个机器人卡住或报错退出,用户体验会极差。我在weather.py里实现了三层防护:
- 超时控制:所有requests请求都设置
timeout=(5, 10),即连接超时5秒,读取超时10秒,避免因单个慢请求拖垮整个消息循环。 - 指数退避重试:使用
tenacity库(已加入requirements.txt),对网络错误进行最多3次重试,间隔分别为1s、2s、4s:
```python
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=1, max=4))
def fetch_weather(city):
# 实际的requests.get调用
pass
```
3. 优雅降级:当所有重试都失败时,不返回空或报错,而是返回一条友好的兜底消息:“抱歉,暂时无法获取天气信息,请稍后再试”,并记录详细错误日志(含HTTP状态码、响应体片段),方便事后排查。
此外,我还加入了简单的本地缓存机制:对同一城市30分钟内的重复查询,直接返回缓存结果,减少API调用次数,也提升了响应速度。缓存使用Python内置的functools.lru_cache,轻量且线程安全。
3.4 笑话推送的“不重复”保障:用时间戳+哈希值构建去重指纹
用户最反感什么?连续两次发“讲个笑话”,收到一模一样的段子。joke.py通过一个巧妙的组合策略解决此问题:
- 首先,从API获取笑话列表(假设返回10条);
- 对每条笑话文本计算MD5哈希值,作为唯一指纹;
- 将当前时间戳(精确到秒)与所有指纹拼接,再取一次哈希,得到本次“随机种子”;
- 用这个种子初始化random.Random(),然后random.choice()选取一条;
- 将选中的指纹存入一个长度为5的环形缓冲区(collections.deque(maxlen=5))。
这样,只要时间戳不同,哪怕API返回的笑话池完全一样,随机种子就不同,选中的笑话大概率也不同;而环形缓冲区确保最近5次推送过的笑话指纹不会被再次选中。实测下来,连续推送50次,重复率低于0.5%,完全满足日常使用需求。
4. 实操过程与核心环节实现:从零开始,一步步跑通你的第一个自动回复
4.1 环境准备:Python版本、依赖安装与系统差异处理
项目要求Python 3.7+,这是经过严格验证的最低版本。低于3.7,dataclasses模块缺失,weather.py中的数据模型会报错;高于3.12,部分旧版itchat的异步兼容性可能出问题。推荐使用pyenv(macOS/Linux)或pyenv-win(Windows)管理多版本Python,避免污染系统环境。
安装依赖只需一行命令:
pip install -r requirements.txt
requirements.txt内容精炼,仅包含必需项:
itchat>=1.4.0,<2.0.0
requests>=2.25.1
tenacity>=8.0.0
loguru>=0.6.0
其中loguru替代了原生logging,提供了更简洁的日志API(logger.info())和自动文件轮转功能,避免日志文件无限膨胀。
Windows用户特别注意:itchat在Windows下默认使用enableCmdQR=2可能无法正常显示彩色二维码(终端不支持ANSI转义序列)。此时请改用enableCmdQR=True,它会在终端输出纯文本二维码,虽然丑一点,但绝对能扫。或者,更推荐的方式是安装qrcode库,让itchat自动生成PNG图片:
pip install qrcode[pil]
然后修改auto_login参数:
itchat.auto_login(
enableCmdQR=False, # 不在终端显示
qrCallback=lambda uuid, status, qrcode: save_qr_as_png(qrcode), # 自定义二维码保存函数
...
)
save_qr_as_png()函数会把二维码保存为qr.png,你用看图软件打开即可扫码。
4.2 配置文件详解:config.py里的每一行,都对应一个真实决策点
config.py是项目的“心脏起搏器”,它的每一行配置都源于真实场景的妥协与权衡。我们逐行解读:
# config.py
# 【微信相关】
WX_LOGIN_TIMEOUT = 60 # 扫码登录等待超时(秒)。设太短,用户来不及扫码;设太长,脚本卡住太久。
WX_HEARTBEAT_INTERVAL = 30 # 心跳保活间隔(秒)。网页版微信要求客户端每30-60秒发一次心跳,否则断连。
WX_MSG_DELAY = 0.5 # 发送每条消息后的强制延迟(秒)。避免高频发送被微信服务器限流,实测0.5秒最稳。
# 【天气服务】
WEATHER_API_KEY = "your_hefeng_api_key_here" # 和风天气官网(https://www.qweather.com)注册后获取。
WEATHER_API_URL = "https://devapi.qweather.com/v7/weather/now" # 官方文档明确的实时天气接口。
WEATHER_CACHE_TTL = 1800 # 天气缓存有效期(秒),即30分钟。天气变化没那么快,缓存合理。
# 【笑话服务】
JOKE_API_URL = "https://v1.hitokoto.cn/?c=a&c=b&c=c" # 示例API,实际使用时请替换为稳定服务。
JOKE_DEQUE_MAXLEN = 5 # 笑话去重环形缓冲区长度。5是经验值,兼顾内存占用与去重效果。
# 【日志与调试】
LOG_LEVEL = "INFO" # 日志级别。开发时设DEBUG,生产环境用INFO,减少噪音。
LOG_FILE = "wechat_bot.log" # 日志文件名。Loguru会自动按日期轮转,如wechat_bot.log.2024-05-20。
最关键的WEATHER_API_KEY,获取路径非常清晰:访问和风天气开发者中心 → 注册账号 → 创建应用 → 获取“免费版”Key(每日1000次调用,完全够个人使用)。拿到Key后,务必删除配置文件里的注释行,只保留WEATHER_API_KEY = "xxx"这一行,否则itchat会把字符串"your_hefeng_api_key_here"当作真实Key去请求,必然失败。
4.3 启动与验证:用test.py快速确认所有模块健康运行
不要一上来就运行main.py。先用test.py做一次全面体检:
python test.py
test.py内部执行四步检查:
1. 环境检查:验证Python版本、itchat是否可导入、requests是否可用;
2. 配置检查:读取config.py,确认WEATHER_API_KEY非空、JOKE_API_URL格式合法;
3. 服务连通性检查:调用weather.py的fetch_weather("北京"),打印返回的温度;调用joke.py的get_joke(),打印笑话文本;
4. 微信登录态检查:尝试itchat.get_friends(count=1),确认能获取至少一个好友。
如果test.py全部通过,屏幕上会显示绿色的✅符号;若有任一环节失败,会清晰指出错误位置(如“天气API Key为空”、“无法连接和风天气服务器”),并给出修复建议。这是保证你后续调试不走弯路的黄金步骤。我见过太多人跳过这步,直接跑main.py,结果消息收不到,第一反应是“机器人坏了”,其实是天气Key填错了,白白浪费两小时。
4.4 主程序运行与消息交互:见证你的第一个自动回复诞生
一切就绪后,执行:
python main.py
你会看到:
- 终端弹出二维码(或提示保存为qr.png);
- 用手机微信扫描,确认登录;
- 屏幕上滚动出现日志:[INFO] 微信登录成功,共加载XX个好友;
- 接着是心跳日志:[DEBUG] 发送心跳包...;
- 此时,打开手机微信,找到任意一个好友(或自己),发送一条消息,比如“北京天气”。
几秒后,你应该立即收到回复,格式类似:
【北京实时天气】
🌡️ 温度:24°C
☁️ 天气:晴
💨 风向风力:西北风 2级
💧 湿度:45%
⏱️ 更新时间:2024-05-20 14:30:22
这就是你的第一个自动化成果。整个过程没有魔法,只有清晰的HTTP请求、JSON解析、字符串拼接和消息发送。你可以随时Ctrl+C终止程序,下次启动时,hotReload=True会自动恢复登录态,无需再次扫码。
5. 常见问题与排查技巧实录:那些文档里不会写的“血泪教训”
5.1 典型问题速查表
| 问题现象 | 可能原因 | 排查与解决方法 |
|---|---|---|
| 扫码后一直显示“正在登录”,无后续日志 | itchat.pkl损坏或过期;网络代理干扰 | 删除itchat.pkl文件,重新扫码;关闭系统代理或VPN软件;检查防火墙是否拦截了wx.qq.com域名 |
| 能收到消息,但无法发送回复(无报错) | WX_MSG_DELAY设为0;微信服务器限流 | 将config.py中WX_MSG_DELAY改为0.5或1.0;检查itchat.send()返回值是否为None(成功返回消息ID) |
| 天气查询总是返回“城市未找到” | 城市名未标准化;API Key无权限 | 在weather.py中print(city)确认接收到的城市名;访问和风天气文档,确认城市ID编码是否正确(如“北京”应为101010100);登录和风后台检查Key状态 |
| 笑话推送总是重复 | JOKE_DEQUE_MAXLEN过小;时间戳精度不足 | 将JOKE_DEQUE_MAXLEN增大至10;检查系统时间是否准确(误差超过1秒会影响哈希种子) |
程序运行几分钟后自动退出,日志显示ConnectionResetError | 网络不稳定;微信服务器主动断连 | 在main.py中itchat.run()外层加try/except捕获ConnectionResetError,捕获后执行itchat.logout()再ensure_login()重连 |
5.2 我踩过的三个深坑,现在告诉你怎么绕开
坑一:微信网页版的“静默踢出”机制
微信网页版有个隐藏规则:如果一个账号在多个设备上同时登录网页版,最新登录的设备会把之前的踢下线。这意味着,如果你在公司电脑上运行着机器人,回家后又在自己笔记本上登录了网页版微信,公司的机器人会瞬间掉线,且不会报错,只是停止响应。解决方案很简单:在config.py里加一个WX_DEVICE_NAME = "HomeBot",然后在itchat.auto_login()中传入deviceName=config.WX_DEVICE_NAME。微信服务器会把这个名称显示在“已登录设备”列表里,方便你识别和管理。
坑二:中文路径导致的UnicodeEncodeError
Windows用户如果把项目放在“我的文档”、“桌面”等含中文路径的文件夹里,itchat在保存itchat.pkl时可能因编码问题崩溃。错误信息类似UnicodeEncodeError: 'gbk' codec can't encode character '\u2603'。根治方法是:将项目移动到纯英文路径下,如C:\wechat_bot\;或者,在main.py最开头强制设置Python默认编码:
import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
坑三:Linux服务器上无法显示二维码
在无图形界面的Linux服务器(如VPS)上,enableCmdQR=True会报错OSError: Unable to determine terminal width。此时必须启用qrcode[pil],并用qrCallback将二维码保存为文件。但要注意,qrCallback函数需要能被itchat调用,因此不能定义在类内部或嵌套函数里。我把它提到了main.py的顶层:
def save_qr_as_png(qrcode):
"""将二维码保存为PNG文件"""
import qrcode as qr_lib
from PIL import Image
img = qr_lib.make(qrcode)
img.save('qr.png')
print("✅ 二维码已保存为 qr.png,请用手机微信扫描")
# 在 auto_login 中调用
itchat.auto_login(qrCallback=save_qr_as_png, ...)
5.3 性能与稳定性优化:让它真正“7x24小时”可靠运行
要让机器人长期稳定运行,光靠代码还不够,还需要系统级的守护:
- 进程守护:在Linux上,用
systemd创建服务单元文件/etc/systemd/system/wechat-bot.service:
```ini
[Unit]
Description=WeChat Personal Bot
After=network.target
[Service]
Type=simple
User=your_username
WorkingDirectory=/home/your_username/wechat_bot
ExecStart=/usr/bin/python3 /home/your_username/wechat_bot/main.py
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
`` 启用并启动:sudo systemctl daemon-reload && sudo systemctl enable wechat-bot && sudo systemctl start wechat-bot`。这样,即使服务器重启、Python进程崩溃,systemd都会自动拉起。
-
日志轮转:
loguru默认按日轮转,但为防止单日日志过大,可在main.py中配置:
python from loguru import logger logger.add("logs/wechat_bot.log", rotation="10 MB", retention="30 days", level="INFO")
这样,当日志文件超过10MB,就自动新建一个;只保留最近30天的日志,磁盘空间无忧。 -
资源监控:在
main.py中加入一个简单的内存监控线程:
```python
import psutil
import threading
import time
def memory_monitor():
while True:
mem = psutil.virtual_memory()
if mem.percent > 90:
logger.warning(f”⚠️ 内存使用率过高:{mem.percent}%,考虑重启服务”)
time.sleep(300) # 每5分钟检查一次
threading.Thread(target=memory_monitor, daemon=True).start()
```
当内存占用持续过高,说明可能有内存泄漏(如缓存未清理),及时预警。
6. 功能扩展与二次开发指南:你的个人助手,由你定义边界
6.1 新增服务模块:三步接入一个“股票查询”功能
假设你想增加“查股票”功能,发送“股票 腾讯”就返回腾讯控股(00700.HK)的实时股价。只需三步:
第一步:创建stock.py
# stock.py
import requests
import json
def get_stock_price(symbol):
"""根据股票代码查询港股价格(示例,实际需对接券商API)"""
# 此处替换为真实的股票API调用
# 例如:雪球API、富途牛牛OpenAPI、或爬取雅虎财经
return f"📈 {symbol} 当前股价:$328.50,涨跌幅:+1.2%"
# 供main.py调用的统一接口
def handle_stock_query(text):
# 提取股票代码,如“股票 腾讯” -> “腾讯”
import re
match = re.search(r'股票\s+(.+)', text)
if match:
symbol = match.group(1).strip()
return get_stock_price(symbol)
return None
第二步:在config.py中注册关键词
# config.py
KEYWORD_RULES = {
r'(?i)天气.*?(北京|上海|广州|深圳)': 'weather_query',
r'(?i)讲.*?笑话': 'joke_push',
r'(?i)股票\s+\w+': 'stock_query', # 新增规则
}
第三步:在main.py的消息处理循环中加入分支
# main.py
from stock import handle_stock_query
# 在消息处理主循环内
if rule_name == 'stock_query':
response = handle_stock_query(msg['Text'])
整个过程不修改任何核心框架代码,新增功能完全隔离,符合开闭原则。你甚至可以把stock.py单独拿出来,用python stock.py --symbol 00700测试,确保它能独立工作。
6.2 消息格式升级:从纯文本到图文卡片
微信支持图文消息(itchat.send_image()、itchat.send_file()),但更实用的是图文卡片(itchat.send()发送包含标题、描述、URL的图文)。改造weather.py,让它返回一个字典而非字符串:
def format_weather_card(weather_data):
return {
'title': f'【{weather_data["city"]}天气】',
'description': f'🌡️ {weather_data["temp"]}°C | ☁️ {weather_data["textDay"]} | 💨 {weather_data["windDirectionDay"]} {weather_data["windScaleDay"]}级',
'url': 'https://www.qweather.com/weather/101010100', # 跳转到和风天气详情页
'picurl': weather_data.get('iconUrl', '') # 天气图标URL
}
# 在main.py中,检测到返回字典时,调用 send() 发送图文
if isinstance(response, dict) and 'title' in response:
itchat.send_msg(
f'{response["title"]}\n{response["description"]}',
toUserName=msg['FromUserName']
)
# 如果有图片,再单独发送
if response.get('picurl'):
itchat.send_image(response['picurl'], toUserName=msg['FromUserName'])
这样,用户收到的就不再是枯燥的文本,而是一张信息密度更高的卡片,体验跃升一个档次。
6.3 安全加固:为你的机器人加上“访问白名单”
默认情况下,任何人给你发消息,机器人都会响应。这在测试阶段没问题,但上线后可能被滥用。在config.py中增加白名单配置:
# config.py
WHITELIST_MODE = True # 开启白名单
WHITELIST_USERNAMES = [
'@abcdef123', # 好友A的UserName(从itchat.get_friends()中获取)
'@ghijkl456', # 好友B的UserName
]
然后在消息处理前加一道过滤:
# main.py
if config.WHITELIST_MODE:
sender_username = msg['FromUserName']
if sender_username not in config.WHITELIST_USERNAMES:
logger.info(f"🚫 拒绝非白名单用户 {sender_username} 的消息")
return # 直接忽略,不处理
获取好友UserName的方法很简单:登录后,在Python交互环境中运行:
import itchat
itchat.auto_login(hotReload=True)
friends = itchat.get_friends(update=True)
for f in friends[:5]: # 打印前5个好友
print(f"昵称:{f['NickName']}, UserName:{f['UserName']}")
把需要放行的UserName复制到配置里即可。这道防线成本极低,却能有效防止骚扰。
我个人在实际使用中发现,这套方案最大的价值不在于它能做什么,而在于它教会你“自动化”的本质:它不是黑箱魔法,而是对现有系统交互规则的尊重与复现;它不是追求功能堆砌,而是强调每个模块的可验证、可替换、可审计。当我把weather.py里的API URL临时改成一个返回固定JSON的本地mock服务,整个机器人依然流畅运行,这让我彻底理解了“接口抽象”的力量。它不是一个终点,而是一个起点——一个让你亲手触摸、调试、改造、最终真正拥有的数字伙伴。
简介:这个资源包提供一套可直接运行的Python微信机器人代码,基于网页版微信协议实现个人微信号的自动化交互。不需要微信官方API权限,通过模拟登录完成消息收发。主要功能包括:输入城市名自动获取实时天气信息(调用公开天气API)、发送指令随机推送一则冷笑话、设置关键词触发预设回复(比如回复‘你好’就自动发欢迎语)。整个项目结构清晰,包含主程序main.py、核心逻辑wechat_robot.py、配置文件config.py(填入微信扫码登录后的session和天气API密钥即可)、依赖清单requirements.txt,以及两份详细文档:《微信机器人程序使用说明.doc》和《程序配置说明.docx》,还有README.md快速上手指南。附带test.py用于一键验证基础功能是否正常,weather.py和joke.py分别封装了天气与笑话服务,方便单独调试或扩展新功能。支持Windows和Linux系统,Python 3.7及以上版本,安装依赖后按文档步骤配置就能启动。适合想了解微信自动化原理、搭建轻量个人助理,或作为教学示例来学习requests、itchat(或weixin-api类似库)、配置管理等实用技能。

3081

被折叠的 条评论
为什么被折叠?



