一、问题
自己弄了一些账号在网上出售,账号默认使用期限是一个月,每个账号的出售价格也不全部一样,每个账号被购买的时间也不一样。账号数大概10个左右,所以为了方便记录每个账号的账号信息、价格、购买人、上次购买的时间等数据,我就建了个数据库表,然后把这些信息存进去,自己每隔几天查下数据库,看看哪些人到期了,询问下是否续期之类的。
刚开始觉得还ok,能接受,毕竟也就10个左右,手动发几条消息给别人也很容易,将就着用了。
后来就不行了,账号数量达到了20个左右,这数量翻倍了,每次都得一个一个的去对着看,很烦,也很low。所以,我开始了我的计划。
二、计划
既然手动的效率不行,那就得向自动化靠拢了。
之前看哪些过期是数据库查询,查询完了,再通知那些过期的人续费,那么需要自动化的过程就是:
查询数据库里面过期的数据
通知这些过期的人续费
初期的这个计划,我们分析一下可行性
查询数据库,对于python来说,小菜一碟,PyMysql完美解决
通知别人续费,由于现在的沟通方式一般都是微信,这样比较快,所以首选是能用微信通知,而刚好python里面的itchat能帮助我们实现这个。当然邮件通知也并不是不行,只是不符合当前的趋势。
那这个计划,用python是完全可以进行的
三、实施
1、查询数据库里面过期的数据
由于我的数据库里面存的是上次购买的时间,所以在查询过期数据的时候,需要查询上次购买时间,再对比今天回退30天的日期,如果上次付款时间比30天前还早,那就是过期了,反之则没有。说的有点拗口,但总的来说是个很简单的数据库查询,没什么难度。
2、通知续费
上面我们已经计划用微信来通知续费,那么就得研究下itchat这个包。
通过看文档知道,可以通过扫码来登录网页版微信,并支持查询好友,发送消息。可以通过用户名、昵称、备注、微信号等方式查询好友。这里继续来分析下,通过哪种方式比较好:
用户名:这里的用户名是一长串内容,微信后台生成的,以@开头,后面是数字和字母,而且最主要是竟然会变,我之前以为是唯一固定的,但是发现同一个人两次竟然不一样,不知道是和什么有关。总之,存在不固定性,所以可以排除。
昵称:昵称就是每个人给自己取的微信名,例如我的是“慢慢慢慢慢热”,这个就是昵称,但是微信名是可以改的,如果别人自己更改了昵称,就找不到这个人,就发送不了消息了,也存在不固定性,所以可以排除。
备注:备注是自己给对方设置的,这个备注只有自己可以改,也就是说只要自己不改,这个备注是一直不变的,这就符合了我们的要求。
微信号:微信号有的人是没有设置的,这时候系统会自动给他一个,以wxid_开头,这种是查询不到好友的(我在手机版微信中搜索过这种微信号,没有结果),所以可以排除。
那么综上,我们唯一的选择就是使用 备注 来查询微信好友,然后发送消息给他。
也就是说,我们得给每一个购买账号的人,取一个备注,这个备注的特点是得唯一,并且,这些人的备注格式应该保持一致,这样可以更方便的查找,例如:账号@金额,通过这种特定的格式,我们在微信中查找就更容易,只要查找到好友,发送消息就简简单单了。
所以,完成了上两步之后,我做出了一款小工具,并且打包成exe文件,使用的时候双击下就ok。
具体的就是:当我双击运行后,数据库查询截至到今天是否有过期的用户。如果没有,则打印信息到窗口告诉我没有过期的用户;如果有,则itchat开始工作,生成微信登陆二维码,登陆后,通过备注自动在我的微信好友中查找那些过期的人并发送过期的信息给他们。
至此,一个最基本的完成了。将之前手动查询数据库,手动查找好友,手动发送微信消息,全部自动化实现,算是进了一小步。
四、升级
上面的工具,总的来说,用的也还算可以,每天回去双击一下就行,但是我的需求也越来越多了,比如:
1、上面的工具,虽然打包成了exe文件,但我不能带着到处跑吧,我想随时随地的查询
2、总有记不住自己账号信息的人,时不时问我一下,我也记不住啊,全在数据库里,所以除了要能查询过期的数据外,我还想能查询每个账号的信息
3、有人续费了或者不用了,我需要能马上修改购买时间和账号状态
需求是做不完的,以上这些是目前最大的需求,我们来一一实现。想要实现这些,其实很简单,利用flask写一个web应用即可,手机都可以操作,但是我不会前端,所以另谋出路。
再来分析一下,查询过期、查询某个账号信息、修改购买时间、修改账号状态等等,本质上是操作数据库,这个实现起来没有问题,关键是怎么去触发操作数据库。
好在,强大的itchat可以监控好友或群聊消息,比如运行itchat,扫码登陆微信A,微信A的好友微信B给A发送消息,itchat是可以完全监控到的。这就好办了,可以把微信B当成遥控器,微信A是接收器,A接收B发送的关键字,来进行不同的操作(需要注意的是,在代码中,接收关键字时要指定关键字的发送者是遥控器,其他一律不回应,否则任何人都可以操控),比如:
过期:发送关键字 [过期],查询所有过期数据
查询:发送关键字 [查询+账号],查询该账号的数据
更新:发送关键字 [更新+账号+日期],更新该账号的购买日期
删除:发送关键字 [删除+账号],将该账号暂时置为无效
全部:发送关键字 [全部],查询所有账号数据
我们用作为遥控器的微信发送过期、查询、更新、删除、全部这几个关键字,每个关键字需要按特定的格式发送,当作为接收器的微信收到关键字时,再按照程序里面的逻辑去执行不同的操作,程序里的逻辑也就是数据库操作的逻辑,这样就达到了使用手机随地操作的要求了。
但是,还没有达到随时的要求,要想随时,就得在一台电脑上运行程序,把作为接收器的微信永远登陆在上面。显然,如果使用自己家里的电脑,是不太现实的。一个是不可能永远不关机,另一个是程序崩溃了要晚上才能回去重启,无法控制。
所以,云服务器是最好的选择,不管选阿里云还是腾讯云还是自己买的其他VPS都可以。首先安装mysql在服务器上,然后将本地的数据全部复制到云服务器的mysql中,然后安装python,安装必要的包就可以运行了。需要注意的是,需要在服务器上后台运行脚本,否则在断开xshell的时候脚本也会停止运行,这里可以了解学习一下linux的nohub命令。
完成以上这些,作为接收器的微信就永远登陆了,遥控器就可以随时随地操作了,我们上面的需求就基本实现了。
五、总结
针对一个自己实际遇到的问题,然后利用自己已学或未学的知识去解决,这是一个很棒的体验。在这次解决问题的过程中,接触了mysql、python编程及itchat包的运用、打包python脚本为exe文件、linux服务器的相关操作、linux服务器部署python应用等知识;也踩过很多坑,比如itchat获取好友的方式、比如linux部署python应用等等,但是在一番摸索和查找之后,问题也都解决。代码在码云上,代码可能写的不怎么好,但重在思路,以此来分享一下。