企业微信机器人检测图片消息

#想实现依托企业微信的机器人,实现当检测到该群有人发图片时,能触发机器人自动回复“你好,图片已收到”代码在pycharm上运行起来好像没问题,但是我在群里发图片时,并没有触发机器人自动回复。


#import requests
import json

webhook_url = "这是填的是我的机器人地址"

def send_message(content):
    headers = {'Content-Type': 'application/json'}
    data = {
        "msgtype": "text",
        "text": {
            "content": content
        }
    }
    response = requests.post(webhook_url, headers=headers, data=json.dumps(data))
    if response.status_code == 200:
        print("消息发送成功")
    else:
        print("消息发送失败")

def listen_group_chat():
    while True:
        # 调用企业微信机器人接口,获取群聊消息
        response = requests.get(webhook_url)
        if response.status_code == 200:
            data = response.json()
            if data["errcode"] == 0:
                for message in data["messages"]:
                    if message["type"] == "image":
                        # 当群中有人发送图片消息时,自动回复你好
                        send_message("你好")
            else:
                print("获取消息失败")
        else:
            print("请求失败")

if __name__ == "__main__":
    listen_group_chat()

#求求了~各位大佬帮忙解答下。

在27行上行加入一行打印,确定是否收到正确的群聊图片信息。
如果是没有收到群聊信息,应该检查24行网络请求失败的原因,很有可能因为白名单或权限问题造成的。

那应该是哪一步判断没走吧,log一下

解决方法

1、使用以下代码,再跑一遍
2、看下输出结果是什么,将输出结果发出来 或者
自己根据输出的文字来判断逻辑为什么没有正常运行。

import requests
import json

webhook_url = "这是填的是我的机器人地址"


def send_message(content):
    headers = {'Content-Type': 'application/json'}
    data = {
        "msgtype": "text",
        "text": {
            "content": content
        }
    }
    response = requests.post(webhook_url, headers=headers, data=json.dumps(data))
    if response.status_code == 200:
        print("消息发送成功")
    else:
        print("消息发送失败")


def listen_group_chat():
    while True:
        # 调用企业微信机器人接口,获取群聊消息
        print(f"****************************")
        response = requests.get(webhook_url)
        if response.status_code == 200:
            print(f"status_code:200")
            data = response.json()
            if data["errcode"] == 0:
                print(f"data:0")
                for message in data["messages"]:
                    if message["type"] == "image":
                        # 当群中有人发送图片消息时,自动回复你好
                        print(f"已收到图片,开始发送你好")
                        send_message("你好")
                        print(f"图片发送成功")
                    else:
                        print(f"非图片信息,跳过")
            else:
                print("获取消息失败")
        else:
            print("请求失败")
        print(f"****************************\n")


if __name__ == "__main__":
    listen_group_chat()

如有问题随时沟通
如有帮助欢迎采纳

引用chatgpt内容作答:
从您提供的代码中,我注意到一些问题可能会影响机器人的预期行为。以下是一些建议来帮助您进行调试和改进代码:

1、未导入 requests 模块: 代码中注释掉了 import requests,但实际上您的代码使用了 requests 模块。确保取消注释 import requests,以确保您的代码能够正确地使用 requests 模块。

2、获取消息的方法问题: 从您的代码中看不到具体的机器人接收消息的方式。企业微信机器人一般是通过发送 POST 请求到机器人的 webhook 地址来接收消息,而不是通过发送 GET 请求。您的 listen_group_chat 函数中的 requests.get 可能需要更改为使用 requests.post。

3、机器人接收消息格式: 企业微信机器人接收到的消息格式与您的代码中构建的 data 格式可能不匹配。您需要根据企业微信机器人的文档,正确构建消息体的格式。

4、处理消息延迟: 您的 listen_group_chat 函数中似乎是一个无限循环,但在每次循环中只发送一次 GET 请求。这可能会导致您没有实时获取消息。建议您添加适当的延迟,以避免过于频繁地请求企业微信机器人接口。

5、合适的触发条件: 您的代码中检测到图片消息时,只是自动回复了一个固定的 "你好" 消息。如果您希望机器人能够在群中某人发送图片消息时触发自动回复,您可能需要更具体的触发条件。

6、错误处理: 您的代码缺少对请求错误的适当错误处理。在请求失败时,您可以添加一些错误处理代码,以便更好地理解发生了什么问题。

7、Webhook 地址验证: 请确保您的机器人 webhook 地址已经正确设置,并且能够正常接收 POST 请求。
我已经根据您的代码进行了一些修改。请注意,以下代码只是一个示例,您可能需要根据实际情况进行进一步的调整和测试。

import requests
import json
import time

webhook_url = "这是填的是我的机器人地址"

def send_message(content):
    headers = {'Content-Type': 'application/json'}
    data = {
        "msgtype": "text",
        "text": {
            "content": content
        }
    }
    response = requests.post(webhook_url, headers=headers, data=json.dumps(data))
    if response.status_code == 200:
        print("消息发送成功")
    else:
        print("消息发送失败")

def listen_group_chat():
    last_message_time = None

    while True:
        # 调用企业微信机器人接口,获取群聊消息
        response = requests.post(webhook_url)
        if response.status_code == 200:
            data = response.json()
            if data.get("Type") == "message":
                message = data.get("Message")
                message_time = message.get("CreateTime")
                
                if message_time != last_message_time:
                    last_message_time = message_time
                    
                    if message.get("MsgType") == "image":
                        # 当群中有人发送图片消息时,自动回复你好
                        send_message("你好,图片已收到")

        else:
            print("请求失败")

        # 添加适当的延时,避免过于频繁地请求接口
        time.sleep(5)

if __name__ == "__main__":
    listen_group_chat()

在这个示例代码中,我根据企业微信机器人的一般工作原理进行了一些修改。注意,企业微信机器人的接口和消息格式可能会根据版本和设置的不同而有所变化,所以您可能需要根据您的实际情况进一步调整代码。

确保您已经正确设置了机器人的 webhook 地址,并且您的企业微信机器人支持接收消息的操作。同时,我添加了一个 last_message_time 变量,用于跟踪上一条消息的时间,以避免处理重复的消息。最后,我添加了一个适当的延时,以防止过于频繁地请求接口。

请在实际使用之前,仔细检查和测试代码,确保它符合您的需求并能够正常工作。

参考结合GPT4.0、文心一言,如有帮助,恭请采纳。

有几个地方需要调整。首先,你需要使用requests.get()方法来获取企业微信机器人传来的消息。
然后,你需要检查消息中的msgtype字段来确定消息的类型。如果消息类型是image,那么就调用send_message()函数发送回复。
另外,企业微信的webhook请求是异步的,也就是说,当你发送图片时,机器人不会立即收到消息。你需要等待一段时间,或者使用轮询的方式来不断检查是否有新的消息。
下面是修改后的代码:

import requests  
import json  
import time  
  
webhook_url = "这是填的是我的机器人地址"  
  
def send_message(webhook_url, content):  
    headers = {'Content-Type': 'application/json'}  
    data = {  
        "msgtype": "text",  
        "text": {  
            "content": content  
        }  
    }  
    response = requests.post(webhook_url, headers=headers, data=json.dumps(data))  
    print(response.status_code, response.text)  
  
def listen_group_chat():  
    while True:  
        time.sleep(1)  # 等待一段时间再获取消息,也可以使用轮询的方式不断获取新的消息  
        response = requests.get(webhook_url)  
        data = response.json()  
        if data["errcode"] == 0:  
            for message in data["messages"]:  
                if message["msgtype"] == "image":  # 检查消息类型是否为图片  
                    send_message(webhook_url, "你好,图片已收到")  # 发送回复消息  
        else:  
            print("获取消息失败")  
  
if __name__ == "__main__":  
    listen_group_chat()

调用一下,打个断点看看运行到哪里里,把日志打出来看看就行了

【以下回答由 GPT 生成】

问题所在是在获取群聊消息的部分。从代码中可以看出,在listen_group_chat()函数中使用的是requests.get()方法来获取机器人接口返回的群聊消息。但是实际上,企业微信机器人的接口是一个POST请求的接口,而不是GET请求。所以需要修改代码中的请求方式为POST请求。

此外,在发送自动回复消息之前,需要调用企业微信机器人接口,将消息标记为已读,否则机器人将会持续收到未读消息,导致自动回复重复发送。

代码优化如下所示:

import requests
import json

webhook_url = "这里填写我的机器人地址"

def send_message(content):
    headers = {'Content-Type': 'application/json'}
    data = {
        "msgtype": "text",
        "text": {
            "content": content
        }
    }
    response = requests.post(webhook_url, headers=headers, data=json.dumps(data))
    if response.status_code == 200:
        print("消息发送成功")
    else:
        print("消息发送失败")

def mark_message_as_read():
    headers = {'Content-Type': 'application/json'}
    response = requests.post(webhook_url + "/markasread", headers=headers)
    if response.status_code == 200:
        print("消息标记为已读")
    else:
        print("消息标记失败")

def listen_group_chat():
    while True:
        # 调用企业微信机器人接口,获取群聊消息
        headers = {'Content-Type': 'application/json'}
        response = requests.post(webhook_url + "/get_latest_message", headers=headers)
        if response.status_code == 200:
            data = response.json()
            if data["errcode"] == 0:
                for message in data["messages"]:
                    if message["type"] == "image":
                        # 当群中有人发送图片消息时,自动回复"你好,图片已收到"
                        send_message("你好,图片已收到")
                        mark_message_as_read()
            else:
                print("获取消息失败")
        else:
            print("请求失败")

if __name__ == "__main__":
    listen_group_chat()

在优化后的代码中,我新增了mark_message_as_read()函数来调用企业微信机器人接口,将消息标记为已读。然后在检查到群聊有图片消息并发送自动回复之后,调用mark_message_as_read()函数来标记消息为已读,避免重复回复。

请测试以上优化后的代码,并注意设置合适的机器人地址和相关权限。如果依然无法触发机器人自动回复,请检查是否为企业微信机器人接口的配置问题,或者联系企业微信的技术支持。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

你看看接口给你返回了什么,这个企业微信机器人接口是不是过期了

试试

import requests
import json
import time

webhook_url = "这是填的是我的机器人地址"
token = "这是填的是我的token"

def send_message(content):
    headers = {'Content-Type': 'application/json'}
    data = {
        "msgtype": "text",
        "text": {
            "content": content
        }
    }
    response = requests.post(webhook_url, headers=headers, data=json.dumps(data, ensure_ascii=False))
    if response.status_code == 200:
        print("消息发送成功")
    else:
        print("消息发送失败")

def listen_group_chat():
    while True:
        # 调用企业微信机器人接口,获取群聊消息
        headers = {'token': token}
        response = requests.post(webhook_url, headers=headers)
        if response.status_code == 200:
            data = response.json()
            if data["errcode"] == 0:
                for message in data["messages"]:
                    if message["type"] == "image":
                        # 当群中有人发送图片消息时,自动回复你好
                        send_message("你好,图片已收到")
            else:
                print("获取消息失败")
        else:
            print("请求失败")
        # 添加延时
        time.sleep(1)

if __name__ == "__main__":
    listen_group_chat()


python接入图灵机器人微信自动回复


import time
import requests
import json
import itchat
from threading import Timer
from itchat.content import *
# 调用图灵机器人的api,采用爬虫的原理,根据聊天消息返回回复内容
def tuling(info):
  appkey = "****c34bc0401fbcfddded709****"
#此处是我的调用的apikey,可以换成自己的
  url = "http://www.tuling123.com/openapi/api?key=%s&info=%s"%(appkey,info)
  req = requests.get(url)
  content = req.text
  data = json.loads(content)
  answer = data['text']
  return answer
 
def isMsgFromMyself(msgFromUserName):
    # 检查是否自己发送的
    global myName
    return myName == msgFromUserName
 
'''
# 注册文本消息,绑定到text_reply处理函数
# text_reply msg_files可以处理好友之间的聊天回复
@itchat.msg_register([TEXT,MAP,CARD,NOTE,SHARING])
def text_reply(msg):
  itchat.send('%s' % tuling(msg['Text']),msg['FromUserName'])
itchat.run()
#itchat.logout()#退出登录
'''
@itchat.msg_register(itchat.content.TEXT)
def text_reply(msg):
    global zhuRenReply, timerSet, noReply, t
    if isMsgFromMyself(msg['FromUserName']):
        print("有人回复")
        zhuRenReply = False
        noReply = False
        try:
            t.cancel()
            print("计时器清零")
            timerSet = False
        except:
            pass
        return None
    
    if zhuRenReply:
        defaultReply = '我已经接收到你的消息: ' + msg['Text']#调用机器人错误默认回复
        reply = tuling(msg['Text'])
        return reply or defaultReply
    else:
        noReply = True
        if not timerSet:
            print("等待图灵机器人开启开始计时")
            t = Timer(59, sendBusyStatus,[msg['FromUserName']])
            '''
            计时函数
            Timer(interval, function, args=[], kwargs={}) 
            interval: 指定的时间(秒数) 
            function: 要执行的方法 
            args/kwargs: 方法的参数
            '''
            t.start()
            timerSet = True
            '''  
            t.cancel()
            cancel()方法都是为了清除任务队列中的任务
            '''
 
def sendBusyStatus(UserName):
    global noReply, zhuRenReply, timerSet
    print("一分钟已到图灵机器人开启")
    if noReply:
        itchat.send("主人一分钟没回复,说明我的主人没空噢!让我先陪你聊一会吧", UserName)
        zhuRenReply = True
        timerSet = False
        
itchat.auto_login()#接收二维码登入微信,关闭期间可以保留一段时间
zhuRenReply, timerSet, noReply = False, False, False
t=0
myName = itchat.get_friends(update=True)[0]['UserName']
itchat.run()#开始运行

频繁地获取消息可能会被企业微信服务器视为攻击,从而限制或拒绝你的请求。可以尝试增加一些延迟时间,或者使用更频繁的轮询来获取消息。

debug一下

解决步骤:配置企业微信机器人,监听企业微信机器人的消息,处理接收到的消息并自动回复

缺少循环等待机器人消息的逻辑:在listen_group_chat()函数中,你需要添加一个循环来持续监听群聊消息,在每次请求后等待一段时间,然后再次发送请求