草庐IT

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

Tokeii 2023-04-05 原文

之前一直在研究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)

运行效果

有关可爱猫+python3+Flask+aiohttp简单搭建微信机器人的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  3. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  4. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  5. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  6. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

  7. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  8. 微信小程序通过字典表匹配对应数据 - 2

    前言一般来说,前端根据后台返回code码展示对应内容只需要在前台判断code值展示对应的内容即可,但要是匹配的code码比较多或者多个页面用到时,为了便于后期维护,后台就会使用字典表让前端匹配,下面我将在微信小程序中通过wxs的方法实现这个操作。为什么要使用wxs?{{method(a,b)}}可以看到,上述代码是一个调用方法传值的操作,在vue中很常见,多用于数据之间的转换,但由于微信小程序诸多限制的原因,你并不能优雅的这样操作,可能有人会说,为什么不用if判断实现呢?但是if判断的局限性在于如果存在数据量过大时,大量重复性操作和if判断会让你的代码显得异常冗余。wxswxs相当于是一个独立

  9. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  10. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

随机推荐