Loading... ## 引子 中秋佳节,首先祝大家中秋快乐!希望大家今年都吃到月饼了,边赏月边看我的文章。 在今天的讲解开始之前,我想先问大家一个问题: > 当微信的好友在节日给你发祝福的时候,什么情况下你会回复他/她呢? 其实我的答案是,当朋友单独给我发祝福的时候,我一定会回复。 什么意思?也就是我在祝福的内容中看到了我的大名或者明显看出是专门给我发的称呼的话,那我会觉得给我发祝福的人有心了,是`单独`给我发的,而不是`群发`的。 这年头其实大家朋友列表是很长的,不仅有亲戚、过去的同学、最新交的朋友,还有工作的同事伙伴,各种老总需要好好交流问候。当然如果你更换过工作,前同事,前领导要不要问候? 实话说,如果是手动的方式,我们可能会发送给很多的好友,但可能有些不常联系的朋友会没那么容易想起来要发给他们。但他们也确实是我们需要联系的朋友哦。 这个中秋节,我就在开始思考,是否能够做个小程序,实现指定人的批量发送?其实原理不复杂,就是先准备好一段祝福的模板,这个模板不管发给谁都是适用的,然后里面会填入要祝福的人的称呼和对要祝福的人说自己是哪位的称呼,程序能够实现不同的人替换不同的人名,即可。 ## 可行性分析 刚开始的时候我思考的是通过模拟人工的方式,即通过 PC 微信,左上角搜索对应的人名,进入聊天窗口,发送对应的消息。 后来我记得之前有一个比较不错的 python 库,叫做 `wxpy`,之前尝试过,但我的微信不允许通过网页版登录而告终。前几天我随便测试了一下,没想到竟然登录成功了,于是这几天有时间就在研究对应的帮助文档。由于我要做的仅仅是一个群发器,那登录成功后要做的事情就很简单。 就是如何唯一确认要发送的人(确保不要发错人),然后给对应的人发对应的消息了。 在 `wxpy` 库中,有一个用户的 `puid` 属性,这个属性是该用户的唯一值,但不同的账号可能不同,同一账号可以用它来搜索得到指定的用户。 该库可以很简单的获取登录后的所有好友列表,以及对应的 `puid`,因此初步计划大概是这样的: 1. 首先登录要发送的用户,获取全部好友列表清单,清单显示的名字均为你自己备注的名字,如果你有一个比较好的备注习惯的话应该没啥问题,都能看出来谁是谁。 2. 获取名字和 puid 的值,保存到一个地方,我这里设计保存到 excel 表中。 3. 初始化完毕后,打开保存的 excel 表,根据自己的需要,配置你对别人的称呼、别人对你的称呼、是否要发给这个人等几个关键项,并保存配置表。 4. 读取 excel 配置表,并按照指定的发送模板,自动替换不同的人和称呼,进行发送。在发送的间隙注意设定一定的休息间隔,保证不会触发微信发送条数限制。 于是,我们就可以开始编写代码了。 ## 成品 经过几个小时的编写和测试,最终一个简易版的微信群发器研发成功,而且不仅是在中秋节可以使用,在今后的任意节日需要群发时,都可以进行使用,是真的非常的方便。 下面,我们就来说说使用的方法: 1. 初始化 excel 文件 同一目录新建一个 wxrobot.xlsx 文件,第一行创建对应的列名:朋友备注、puid、你对他的称呼、你对自己的称呼、是否要发送、是否已发送、已发送的内容、失败信息  2. 运行初始化 ```bash python wxrobot.py init ``` 登录并完成运行,会在 A、B 列获取到所有朋友的名称和 puid,puid 值唯一。 (可能会提示登录位置未知,存在风险等,手机确认时请继续确认,不要管提示) 3. 进行发送配置 打开 `wxrobot.xlsx` 文件,`是否要发送` 列,要发送的维护为 `1`,不发的维护为 `0`。`是否已发送` 列,统一维护为 `0`。 当 `是否要发送` 列为 `1` 时,请维护 `你对他的称呼`、`你对自己的称呼` 两个字段到该行。 保存并关闭文件(务必关闭)。 4. 运行批量发送 ```bash python wxrobot.py batch_send ``` 如果需要重新登录,请重新登录。 发送完毕后,如果进入了命令行模式 `embed()`,可以手动输入 `bot.logout()` 登出账号。 5. 查看结果等 打开 `wxrobot.xlsx` 文件查看发送情况和失败信息。 (需注意目前的程序如果发送后发现朋友把自己删掉,会在返回的输出内容中提示,不会写入 excel,下一版本可能会计划优化) 6. 额外可配置项 在脚本开头有几个额外可配置项,这里解释一下,可以根据自己的需要自行配置: * template:发送模板,`{}` 第一个位置为 `你对他的称呼`,第二个 `{}` 位置为 `你对自己的称呼` * switch_send:是否要发送,如果为 `True`,则会真实发送 * switch_update_send_status:是否更新已发送状态,如果为 `True`,则会更新发送状态到 excel * switch_update_send_content:是否更新已发送内容,如果为 `True`,则会更新发送内容到 excel * switch_sleep:是否等待 10 秒左右继续发送,如果为 `True`,则会每发完一个人后,等待 10 秒左右继续发送。该操作是避免微信可能的检测或封禁,以及避免触及一定期限内内容发送的限制。 ## 源码 我用于测试的 python 版本为 3.8.8,涉及到的几个三方库,请自行下载: ```bash pip install wxpy openpyxl alive-progress ``` 下面是我们的源码,你可以自行修改优化,期待你的参与: <div class="hideContent">此处内容需要评论回复后(审核通过)方可阅读。</div> 你,学到了吗?有任何问题,期待你的留言和提问!~ ## 其他 参考资料: * wxpy 帮助文档:[https://wxpy.readthedocs.io/zh/latest/](https://wxpy.readthedocs.io/zh/latest/) * 使用 wxpy 的前提:你能够顺利登录网页微信 [https://wx2.qq.com/](https://wx2.qq.com/) 最后修改:2021 年 09 月 21 日 © 允许规范转载 赞 0 赠人玫瑰,手留余香