用微信个人号跑起来的Python小助手:能查天气、讲笑话、自动回消息

该文章已生成可运行项目,

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:这个资源包提供一套可直接运行的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里实现了三层防护:

  1. 超时控制:所有requests请求都设置timeout=(5, 10),即连接超时5秒,读取超时10秒,避免因单个慢请求拖垮整个消息循环。
  2. 指数退避重试:使用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.pyfetch_weather("北京"),打印返回的温度;调用joke.pyget_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.pyWX_MSG_DELAY改为0.51.0;检查itchat.send()返回值是否为None(成功返回消息ID)
天气查询总是返回“城市未找到”城市名未标准化;API Key无权限weather.pyprint(city)确认接收到的城市名;访问和风天气文档,确认城市ID编码是否正确(如“北京”应为101010100);登录和风后台检查Key状态
笑话推送总是重复JOKE_DEQUE_MAXLEN过小;时间戳精度不足JOKE_DEQUE_MAXLEN增大至10;检查系统时间是否准确(误差超过1秒会影响哈希种子)
程序运行几分钟后自动退出,日志显示ConnectionResetError网络不稳定;微信服务器主动断连main.pyitchat.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服务,整个机器人依然流畅运行,这让我彻底理解了“接口抽象”的力量。它不是一个终点,而是一个起点——一个让你亲手触摸、调试、改造、最终真正拥有的数字伙伴。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:这个资源包提供一套可直接运行的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类似库)、配置管理等实用技能。


本文还有配套的精品资源,点击获取
menu-r.4af5f7ec.gif

本文章已经生成可运行项目
内容概要:本文围绕可变桨叶四旋翼无人机的规范控制与点对点运动模拟展开,重点研究优化推力分配策略在翻转动作中的应用与性能比较。通过Matlab代码实现,构建了四旋翼动力学模型,并设计了多种控制算法以实现精确的姿态调整与轨迹跟踪。研究对比了不同推力分配方案在执行高机动性翻转动作时的稳定性、能耗效率与响应速度,旨在提升无人机在复杂飞行任务中的动态性能与控制精度。该仿真研究为无人机飞控系统的设计与优化提供了理论依据和技术支持。; 适合人群:具备一定自动控制理论基础和Matlab编程能力,从事无人机控制、飞行器动力学或机器人系统研究的科研人员及研究生。; 使用场景及目标:① 实现四旋翼无人机在三维空间中的精确点对点运动控制;② 对比分析不同推力分配策略在执行翻转等高难度动作时的控制效果与能耗表现,优化飞行性能;③ 为无人机自主飞行、特技飞行及复杂环境下的机动控制提供算法验证平台。; 阅读建议:此资源以Matlab仿真为核心,建议读者结合相关控制理论知识,深入理解代码实现细节,重点关注动力学建模、控制律设计与推力分配模块。在学习过程中,应动手调试参数,复现文中翻转动作的仿真结果,并尝试拓展至其他复杂飞行任务,以加深对无人机控制机理的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值