本文档部分由itchat与wxpy的开发文档修改得出
禁止不规范转载
WechatBot
WechatBot是一个半开源的微信个人号接口,使用python调用微信从未如此简单。
使用不到20行的代码,你就可以完成一个能够处理所有信息的微信机器人。
当然,该api的使用远不止一个机器人,更多的功能等着你来发现。
如今微信已经成为了个人社交的很大一部分,希望这个项目能够帮助你扩展你的个人的微信号、方便自己的生活。
项目地址(开发不易求个star)
配套微信
提取码:abmkinfopensource/WechatBotgithub.com
请优先选择github(最新)诶嘿嘿/WechatBotgitee.com
为啥要整这玩意?
在做一个程序的时候需要用到微信机器人,然后尴尬的发现自己的微信没办法登录网页版,所以itchat,wxpy对我来说全部报废,于是我就基于网上hook微信的易语言代码做了一套类似于酷q的调用模式,封装成了python函数。
怎么使用?
首先,点开我的项目地址,按一下右上角的star按钮(雾),再下载到本地,通过demo.exe启动微信,运行msgDB.py ,此时给这个账号发送消息111就能惊喜的发现机器人可以工作了!注意:强烈建议使用小号作为机器人使用,毕竟谁也没法保证你会不会被封号......
开发者文档(基础)本部分为简单的入门级使用
首先新建一个py文件,可以随便给文件命名。第一步当然是导入模块和初始化机器人:
import msgDB
msgDB.initDB()注意:请确保你所创建的py文件与demo.exe,msgDB.py,add.dll,exchange.db在同一个文件夹下,同时demo.exe已经打开并成功注入微信进程
然后创建一个死循环监听是否有人发来了新消息,用变量res来保存返回值:
import msgDB
msgDB.initDB()
while True:
res=msgDB.listen_wxMsg()#监听一次是否有新消息
listen_wxMsg函数如果监听到了新的消息产生就返回一个列表,无新消息则返回False,所以当listen_wxMsg函数返回False我们就可以开始下一轮监听了。
import msgDB
msgDB.initDB()
while True:
res=msgDB.listen_wxMsg()#监听一次是否有新消息
if res==False:#无新消息产生则开始下一轮监听
continue
那么收到新消息后列表返回的究竟是什么呢?其实在这个列表中我们需要关注的元素只有两个:res[0](消息发送者的微信id)和 res[3](消息内容)。根据以上所说的,如果想对别人发来的某一个关键词进行响应该怎么写?
import msgDB
msgDB.initDB()
while True:
res=msgDB.listen_wxMsg()#监听一次是否有新消息
if res==False:#无新消息产生则开始下一轮监听
continue
if res[3]=="keyword":#res[3]存着别人发来的消息
msgDB.send_wxMsg(res[0],"response")#res[0]是发送消息的人的id
这时运行程序,发现在对机器人发送了消息“keyword”后机器人竟然不断的回复response,是函数出问题了?不要慌,这是因为这一条消息没有从消息列表里删除,我们只需要在每一条处理完的消息后加一个函数delMsg()即可,代码如下:
import msgDB
msgDB.initDB()
while True:
res=msgDB.listen_wxMsg()#监听一次是否有新消息
if res==False:#无新消息产生则开始下一轮监听
continue
if res[3]=="keyword":#res[3]存着别人发来的消息
msgDB.send_wxMsg(res[0],"response")#res[0]是发送消息的人的id
msgDB.delMsg()
那么,如果我想发送图片该怎么做呢?很简单,只要稍微改一改发送消息的函数即可。
import msgDB
msgDB.initDB()
while True:
res=msgDB.listen_wxMsg()#监听一次是否有新消息
if res==False:#无新消息产生则开始下一轮监听
continue
if res[3]=="keyword":#res[3]存着别人发来的消息
msgDB.send_wxPicture(res[0],"本地图片路径")#res[0]是发送消息的人的id
msgDB.delMsg()注意:不要试图传入一个网页图片的URL,这不会奏效
开发者文档(进阶)本部分包括常见的错误及处理方式,响应带参数消息的方法以及其他的奇技淫巧。
上面那个简单的小栗子只是入门级的使用,当我们真正将项目投入生产时就会发现事情远远没有这么简单。下面我们就以我写的一个简单的机器人(节选)为例,了解更多高级功能的使用。
import msgDB
import requests
import urllib3
import random
import time
import sys
import os
urllib3.disable_warnings()
def rest_program():
print('restart')
#python = sys.executable
#os.execl(python, python, * sys.argv)
#return "a"
def is_int(s):
try:
int(s)
return True
except ValueError:
return False
def local_picture(name):
img_url ='https://api.dongmanxingkong.com/suijitupian/acg/1080p/index.php'
img = requests.get(img_url,verify=False)
f = open('C:\\pic\\'+str(name)+'.jpg','ab') #存储图片,多媒体文件需要参数b(二进制文件)
f.write(img.content) #多媒体存储content
f.close()
msgDB.initDB()
msgDB.delMsg()
while True:
try:
res=msgDB.listen_wxMsg()
if res==False:#未监听到消息
continue
if res[3].split()[0]=="小姐姐连抽":
print(res[0])
if len(res[3].split())!=2 or is_int(res[3].split()[1])==False:
msgDB.send_wxMsg(res[0],"参数错误")
msgDB.delMsg()
continue
for i in range(int(res[3].split()[1])):
local_picture("test")
msgDB.send_wxPicture(res[0],"C:\\pic\\"+str(random.randint(0,1000))+".jpg")
#msgDB.send_wxPicture(res[0],"C:\\1.jpg")
msgDB.delMsg()
continue
msgDB.delMsg()
except:
print("error")
exit()
代码总览:
这段代码实现了一个小功能:随机从我预先放在c盘pic文件夹下的1000张二次元图片(具体获取方法见下文)中抽取一部分返回给用户。
图片获取:
通过for循环调用代码中的local_picture函数,存入c:\pic目录,图片由1.jpg-1000.jpg命名。
参数解析:
首先我们要关注的是收到消息后机器人到底应该返回几张图片。这里我采取的方法是让用户在要执行的命令后加一个空格,再写出要获取的图片数量。例如想获取十张图片,应该这么写由于时间仓促来不及全部完成,所以先挖坑,以后补上。
实现原理本部分包括简单的底层实现原理,以及python接口的本质
同样挖坑待填
如果遇到任何问题欢迎知乎私信我或者加我的QQ:2223513246 询问。
最后,点个赞再走吧原作者 @hacktor
本软件功能扩展&维护 @Acclea
获取好友列表功能编写 @Gugi