可爱猫+python3+Flask+aiohttp简单搭建微信机器人

之前一直在研究QQ机器人,最近发现一个微信机器人框架,在办公中来增加工作效率。

一、需要环境:

可爱猫(http://www.keaimao.com/)
python3.8+ flask、aiohttp
微信 for windows 3.4.0.38

1.启动可爱猫、登录微信

2.在可爱猫应用中找到HTTP个人对接版,双击打开

在这里插入图片描述
其中
消息回调地址,相当于消息接收地址
调用本地api地址,相当于消息发送地址

用python整个run.py,顺便从隔壁投一个flask使用async的方法

二、核心代码(run.py)

import flask
import logging
from flask import Flask, jsonify, has_request_context, copy_current_request_context, request
from functools import wraps
from concurrent.futures import Future, ThreadPoolExecutor
import time
from getmsg import getmsg
import asyncio

def run_async(func):
    @wraps(func)
    def _wrapper(*args, **kwargs):
        call_result = Future()
        def _run():
            loop = asyncio.new_event_loop()
            try:
                result = loop.run_until_complete(func(*args, **kwargs))
            except Exception as error:
                call_result.set_exception(error)
            else:
                call_result.set_result(result)
            finally:
                loop.close()
 
        loop_executor = ThreadPoolExecutor(max_workers=1)
        if has_request_context():
            _run = copy_current_request_context(_run)
        loop_future = loop_executor.submit(_run)
        loop_future.result()
        return call_result.result()
    return _wrapper
 

app = flask.Flask(__name__)
@app.route('/', methods=['POST'])
@run_async
async def main():
    msg,from_name,final_from_name,time_str,from_wxid,final_from_wxid,msg_type = getmsg()
    #这一块后面可以写插件主要内容
    #...
    return 'ok'
if __name__ == '__main__':
    app.config['JSON_AS_ASCII'] = False
    log = logging.getLogger('werkzeug')
    log.disabled = True
    app.run(host='0.0.0.0', port=8074, debug=True)
 

三、可爱猫提供的接收与发送方法

1.接收消息(getmsg.py)

import flask,time
def getmsg():
    #取msg
    allmsg = flask.request.get_data()
    msg_type =flask.request.form.get('type')
    if msg_type == '200':
        msg_type_name = '群聊消息'
    elif msg_type == '100':
        msg_type_name = '私聊消息'
    msg = flask.request.form.get('msg')
    from_name = flask.request.form.get('from_name').encode('utf-8').decode('utf-8')
    final_from_name = flask.request.form.get('final_from_name').encode('utf-8').decode('utf-8')
    time_str = flask.request.form.get('time')
    time_str = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(int(time_str)))
    from_wxid = flask.request.form.get('from_wxid')
    final_from_wxid = flask.request.form.get('final_from_wxid')

    print(f'\033[1;36m[INFO] [{time_str}]\033[0m [{msg_type_name}(\033[1;34m{from_name}\033[0m)]\033[1;35m {final_from_name} \033[0m: \033[1;32m{msg}\033[0m ')
    return msg,from_name,final_from_name,time_str,from_wxid,final_from_wxid,msg_type

2.发送消息(httpapi.py)

这里按照可爱猫提供的方法写了三种,基本上已经够用了其中wxid_xxxxx为机器人的wxid

import json
import time
import aiohttp

url = 'http://127.0.0.1:8073/send'
async def send_msg_private(msg, to_wxid):
    data = {
        "type": "100",
        "msg": msg,
        "to_wxid": to_wxid,
        "robot_wxid":"wxid_xxxxx"
    }
    data = json.dumps(data)
    async with aiohttp.ClientSession() as session:
        async with session.post(url, data=data) as resp:
            print(await resp.text())

async def send_msg_group(msg, to_wxid):
    data = {
        "type": "100",
        "msg": msg,
        "to_wxid": to_wxid,
        "robot_wxid":"wxid_xxxxx"
    }
    data = json.dumps(data)
    async with aiohttp.ClientSession() as session:
        async with session.post(url, data=data) as resp:
            print(await resp.text())

async def send_image_msg(picpath, to_wxid):
    data = {
        "type": "106",
        "msg": picpath,
        "to_wxid": to_wxid,
        "robot_wxid":"wxid_xxxxx"
    }
    data = json.dumps(data)
    async with aiohttp.ClientSession() as session:
        async with session.post(url, data=data) as resp:
            print(await resp.text())

四、插件例子(百度文心的AI对对联duilian.py)

插件我放在plugin文件夹下,这个随意

import wenxin_api 
from wenxin_api.tasks.couplet import Couplet
def duilian(str1):
    wenxin_api.ak = ""#自己申请
    wenxin_api.sk = ""#自己申请
    input_dict = {
        "text": f"上联:{str1}\n下联:",
        "seq_len": 512,
        "topp": 0.9,
        "penalty_score": 1.0,
        "min_dec_len": 2,
        "is_unidirectional": 0,
        "task_prompt": "couplet"
    }
    rst = Couplet.create(**input_dict)
    #返回result
    return rst['result']

五、在run.py中添加

...
from plugin.duilian import duilian

#上面main()中getmsg后面
async def main()
    if '#上联' in msg and msg_type == '200':
        args = msg.split('上联')[-1]
        if args == '':
            pass#这里可以自行添加判断这里图方便我就没写
        else:
            #print(args)
            result ='下联:'+duilian(args)
            #发送微信消息
            await send_msg_group(result,from_wxid)

运行效果
在这里插入图片描述

<think>好的,我现在需要帮助用户寻找与可爱机器人设计或开发教程相关的IT内容。首先,我得分析用户的请求,看看他们具体需要什么。用户提到了“可爱机器人”,这可能涉及到硬件设计、软件开发,或者是结合两者的项目。另外,用户可能希望找到教程,所以需要分步骤的指导资源。 接下来,我要回忆一下之前提供的引用内容。引用[2]提到了Stack-chan机器人,这是一个可爱且适合探索物联网和编程的项目。引用[4]则提到了绪山真寻bot,是基于Nonebot2和go-cqhttp开发的聊天机器人,可能符合“可爱”的需求,但主要是软件方面。引用[3]讨论了ROS/ROS2,这可能与机器人开发框架有关,但需要确认是否有型相关的设计。 用户的需求可能包括硬件和软件的结合,比如实体机器人或者虚拟的聊天机器人。需要区分这两个方向。例如,Stack-chan有实体构建,而绪山真寻bot是聊天机器人。可能需要分别推荐这两个方向的资源。 然后,我需要确保推荐的教程是中文的,或者有详细的中文文档,因为用户使用中文提问。比如,Stack-chan可能有英文资料,但引用[2]提到的是中文介绍,所以可能社区有中文教程支持。另外,Nonebot2和go-cqhttp在国内开发者中比较流行,相关的中文教程应该较多。 还要考虑用户的技术水平。如果是初学者,可能需要更基础的教程,比如使用现成的框架搭建聊天机器人;如果有硬件经验,可能适合推荐Arduino或ROS相关的项目。例如,Stack-chan涉及3D打印和微控制器,适合喜欢动手的用户。而Nonebot2开发则适合对Python和聊天机器人感兴趣的用户。 另外,需要检查引用中的链接是否有效或相关。引用[4]直接链接到GitHub仓库,用户可以直接访问。引用[2]中的Stack-chan可能需要进一步查找具体教程链接,但根据描述,它强调模块化和灵活性,可能适合教育或创客项目。 可能还需要补充一些其他资源,比如使用Raspberry Pi或Arduino制作机器人的教程,或者使用Unity/Blender进行3D建模的指南,以增强机器人可爱元素。不过根据现有引用,可能需要依赖已有的信息,但可以适当建议扩展方向。 最后,组织回答结构,分点列出不同的方案,包括硬件和软件,每个方案提供教程或项目链接,并说明特点,帮助用户选择最适合的路径。同时,生成相关问题,引导用户进一步探索,比如硬件选型、软件框架比较等。</think>### 可爱机器人设计与开发教程推荐 #### 1. **Stack-chan:开源物联网机器人** - **特点**:基于ESP32微控制器,支持3D打印外壳,具备表情反馈和物联网交互功能。 - **教程资源**: - 官方GitHub仓库提供硬件搭建指南与代码示例,涵盖传感器集成(如陀螺仪)和无线通信模块[^2]。 - 社区分享的《从零搭建Stack-chan》教程,包含3D模型修改与Arduino编程步骤。 - **适用场景**:适合学习嵌入式开发、物联网应用及硬件-软件协同设计。 #### 2. **Nonebot2 + go-cqHttp:QQ娘聊天机器人** - **特点**:基于Python的异步框架Nonebot2,结合go-cqhttp协议实现高互动性对话。 - **教程资源**: - 绪山真寻Bot的GitHub仓库(引用[4])提供完整配置文档,支持插件扩展和数据库管理。 - B站UP主“机器人开发入门”系列视频,手把手教学搭建娘AI对话逻辑。 - **适用场景**:适合开发虚拟宠物、社群管理助手或结合NLP技术的智能交互应用。 #### 3. **ROS/ROS2机器人操作系统:模块化开发** - **特点**:引用[3]提到的模块化架构,可用于设计仿生机器人运动控制与SLAM导航。 - **教程资源**: - 《ROS机器人开发实践》第8章“仿生机器人建模”,使用URDF描述型机械结构。 - Gazebo仿真平台教程,模拟机器人步态与环境感知。 - **适用场景**:学术研究或复杂行为机器人开发,需Linux基础。 #### 4. **Tinkercad + Arduino:快速原型设计** - **简易方案**:通过Tinkercad在线模拟器设计耳反应装置,例如: ```arduino void setup() { pinMode(8, INPUT); //触摸传感器 pinMode(3, OUTPUT); //舵机控制耳 } void loop() { if(digitalRead(8)) analogWrite(3, 90); //触摸时耳竖起 else analogWrite(3, 0); } ``` - **教程**:DFRobot《Arduino互动耳发箍制作指南》。 ---
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值