
ItChat对象与返回值设计AttributeDict与ReturnValue的优雅之道【免费下载链接】ItChatA complete and graceful API for Wechat. 微信个人号接口、微信机器人及命令行微信三十行即可自定义个人号机器人。项目地址: https://gitcode.com/gh_mirrors/it/ItChatItChat 是一款微信个人号接口与微信机器人框架三十行代码即可搭建一个自定义的命令行微信机器人。很多新手写机器人时会被两件事卡住拿到消息后如何优雅地读取字段调用了send_msg、get_contact等函数后怎么判断请求到底成功没有答案就藏在 ItChat 的两个核心数据结构里——AttributeDict 与 ReturnValue。读懂它们的设计意图你的机器人代码会简洁一半。为什么用点号取字段AttributeDict 的设计微信接口返回的数据天然是 dict如{Content: 你好, FromUserName: xxx}。如果每次都要写msg[Content]代码会又长又容易拼错键名。ItChat 在 itchat/storage/templates.py#L9-L21 定义了一个只有十几行的基类class AttributeDict(dict): def __getattr__(self, value): keyName value[0].upper() value[1:] # content - Content try: return self[keyName] except KeyError: raise AttributeError(...)它的规则非常巧妙把属性名首字母大写再当作键去字典里查。于是msg.content等价于msg[Content]msg.from_user_name等价于msg[FromUserName]。这一设计贯穿了整个消息与联系人体系消息对象Message 直接继承 AttributeDict注册回复函数时随手就能写msg.type、msg.text联系人对象好友、群、公众号、群成员User、Chatroom、MassivePlatform、ChatroomMember全部继承自 AbstractUserDict既能friend.nickName点号访问又保留friend[UserName]的 dict 用法兼容细节1.3.0 把msg.isAdmin等字段重命名为首字母大写风格Message.getitem还贴心地对旧键名发出 deprecation 提示这是面向用户改 API的教科书级做法。itchat.msg_register(itchat.content.TEXT) def hello(msg): if msg.text hi: # 点号取字段等价于 msg[Text] itchat.send(Hello, msg.from_user_name)一行 if 判断成败ReturnValue 的设计ItChat 的几乎所有网络请求发消息、加好友、更新群成员……都返回同一个对象——ReturnValue。它是 dict 的子类核心魔法在两个方法上def __nonzero__(self): # Python 2 return self[BaseResponse].get(Ret) 0 def __bool__(self): # Python 3 return self.__nonzero__()请求成功与否被压缩成了一个布尔值Ret 0即为真。写法因此极其干净r itchat.set_alias(userName, 新备注) if r: print(设置成功) else: print(r[BaseResponse][ErrMsg]) # 中文错误提示ReturnValue 还有三个值得新手注意的细节特性说明源码位置中文错误翻译内置TRANSLATION表把-1004 服务器返回异常值、-1006 无效操作等错误码翻译成中文ErrMsgreturnvalues.py#L56-L65直接吃 requests 响应构造函数可传rawResponse非 JSON 返回会自动包成Ret-1004returnvalues.py#L22-L31缺字段兜底没有BaseResponse时自动补-1000 返回值不带BaseResponsereturnvalues.py#L34-L37整个 components 目录中ReturnValue出现了几十次统一的返回契约让调用—判断—取错误三步在所有 API 上完全一致这正是接口优雅的关键。ItChat 对象本体一个可多实例的 Core再往上一层import itchat后你直接调用的itchat.login()、itchat.send_msg()是从哪来的看 itchat/init.py模块内部创建了一个 Core 实例originInstance再把所有功能方法逐个绑定到模块级——login originInstance.login、send originInstance.send……def new_instance(): newInstance Core() instanceList.append(newInstance) return newInstance这个 new_instance() 是进阶彩蛋你可以同时登录多个微信号每个实例各自维护自己的 Storage成员列表、群列表、消息队列配合 dump_login_status / load_login_status 热重载登录态实现改完代码免扫码刷新。新手避坑清单三个高频踩点别用 {}判断返回ReturnValue是 dict但判断成败请用if r:它比较的是Ret 0语义明确且不用记键名。点号属性首字母自动大写msg.content查的是Content键反过来msg.UserName这种写法不生效因为会被转成UserName请用全小写风格msg.userName。群成员不能直接发消息ChatroomMember的send_msg等方法返回Ret-1006的 ReturnValuedo not send message directly需要发消息请拿到群本身再发。延伸阅读完整 API 速查docs/api.md消息类型常量定义TEXT、PICTURE等itchat/content.py官方入门教程docs/intro/start.md理解 AttributeDict 与 ReturnValue你就掌握了 ItChat 数据流的读与判两端——剩下的就是写你的第一个三十行微信机器人了 【免费下载链接】ItChatA complete and graceful API for Wechat. 微信个人号接口、微信机器人及命令行微信三十行即可自定义个人号机器人。项目地址: https://gitcode.com/gh_mirrors/it/ItChat创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考