python hook微信_基于hook的python机器人,彻底取代itchat

本文档部分由itchat与wxpy的开发文档修改得出

禁止不规范转载

WechatBot

WechatBot是一个半开源的微信个人号接口,使用python调用微信从未如此简单。

使用不到20行的代码,你就可以完成一个能够处理所有信息的微信机器人。

当然,该api的使用远不止一个机器人,更多的功能等着你来发现。

如今微信已经成为了个人社交的很大一部分,希望这个项目能够帮助你扩展你的个人的微信号、方便自己的生活。

项目地址(开发不易求个star)

配套微信

提取码:abmkinfopensource/WechatBot​github.com

请优先选择github(最新)诶嘿嘿/WechatBot​gitee.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

你可能感兴趣的:(python,hook微信)