目录

一、NovelAI

二、UIautomation和pywin32

三、代码

1、AI画图相关

2、QQ群消息抓取相关

四、代码效果

五、后记


一、NovelAI

NovelAI是一个用来画二次元图片的开源算法,部署方式见  b站链接

二、UIautomation和pywin32

UIautomation和pywin32是python的库,主要用于窗口句柄的抓取和操作,本代码中用于接收、发送QQ群消息

三、代码

1、AI画图相关

通过使用NovelAI代码包里的txt2img.py文件,实现从文字到图片的转化:

def txt2img(prompt: str, negative_prompt: str, prompt_style: str, prompt_style2: str, steps: int, sampler_index: int, restore_faces: bool, tiling: bool, n_iter: int, batch_size: int, cfg_scale: float, seed: int, subseed: int, subseed_strength: float, seed_resize_from_h: int, seed_resize_from_w: int, seed_enable_extras: bool, height: int, width: int, enable_hr: bool, scale_latent: bool, denoising_strength: float, *args):p = StableDiffusionProcessingTxt2Img(sd_model=shared.sd_model,outpath_samples=opts.outdir_samples or opts.outdir_txt2img_samples,outpath_grids=opts.outdir_grids or opts.outdir_txt2img_grids,prompt=prompt,styles=[prompt_style, prompt_style2],negative_prompt=negative_prompt,seed=seed,subseed=subseed,subseed_strength=subseed_strength,seed_resize_from_h=seed_resize_from_h,seed_resize_from_w=seed_resize_from_w,seed_enable_extras=seed_enable_extras,sampler_index=sampler_index,batch_size=batch_size,n_iter=n_iter,steps=steps,cfg_scale=cfg_scale,width=width,height=height,restore_faces=restore_faces,tiling=tiling,enable_hr=enable_hr,scale_latent=scale_latent if enable_hr else None,denoising_strength=denoising_strength if enable_hr else None,)if cmd_opts.enable_console_prompts:print(f"\ntxt2img: {prompt}", file=shared.progress_print_out)processed = modules.scripts.scripts_txt2img.run(p, *args)if processed is None:processed = process_images(p)shared.total_tqdm.clear()generation_info_js = processed.js()if opts.samples_log_stdout:print(generation_info_js)if opts.do_not_show_images:processed.images = []return processed.images, generation_info_js, plaintext_to_html(processed.info)

输入对应的参数后,图像数据存储在以下位置

txt2img[0][0].save(fullfn)#fullfn是路径

2、QQ群消息抓取相关

接收方面

_get_all_hwnd(hwnd, mouse)用于遍历QQ窗口下的所有控件,用于找到消息管理器窗口下的所有控件

def _get_all_hwnd(hwnd, mouse):if win32gui.IsWindow(hwnd) and win32gui.IsWindowEnabled(hwnd) and win32gui.IsWindowVisible(hwnd):hwnd_title.update({hwnd: win32gui.GetWindowText(hwnd)})

textrefresh(delay)用于点击消息管理器的刷新按钮,以更新群消息

def textrefresh(delay):win32gui.EnumWindows(_get_all_hwnd, 0)for wnd in hwnd_title.items():# print(wnd)if wnd[1] == '消息管理器':breaklong_position = win32api.MAKELONG(810, 130)win32api.SendMessage(int(wnd[0]), win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, long_position)win32api.SendMessage(int(wnd[0]), win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, long_position)sleep(delay)

之后在一个while循环里不断获取最新的一条群消息,并用正则表达式提取指令,以用于后续操作

chat_window = auto.WindowControl(searchDepth=1, ClassName='TXGuiFoundation', Name='消息管理器')
msg_list = chat_window.ListControl(Name='IEMsgView')  #找到 list
finalmsg = msg_list.GetLastChildControl()
msg = finalmsg.Name
# print(msg)
obj = re.compile(r'.*?\((?P<QQnum>.*?)\)\d{1,}:\d{2}:\d{2}(?P<QQmsg>.*)', re.S) #可拿出
result = obj.findall(msg)

需要注意的是“点击刷新按钮”和“获取群消息”是两个事件。

不同点是“点击刷新按钮”使用的是win32api,win32gui,win32con库,“获取群消息”使用的是uiautomation库。

相同点是这两个操作都是针对“消息管理器”窗口的。

uiautomation库和win32api,win32gui,win32con库有很多共有的功能,两者都是对控件进行操作的库,博主在使用时有所取舍。

对于“点击刷新按钮”需求:uiautomation的点击操作需要占用鼠标,很不方便,而win32库里有后台鼠标,因此用于实现“点击刷新按钮”的需求是合适的。

对于“获取群消息”需求:win32库需要遍历所有子控件,博主认为这会提高运行时间,并且定位最后一条群消息还需要额外的筛选操作,而uiautomation里可以直接调用GetLastChildControl()方法得到最后一个子控件,而这个最后的子控件刚好是群内最新的消息。

至此程序已经完成了提取群消息里的指令的需求

发送方面

fs(fsgs, fsnr)用于向群聊天窗口发送文字信息

def fs(fsgs, fsnr):c.OpenClipboard()c.EmptyClipboard()c.SetClipboardData(b.CF_UNICODETEXT, fsnr)c.CloseClipboard()handle = a.FindWindow(None, fsgs)if handle != 0:a.SendMessage(handle, 770, 0, 0)a.SendMessage(handle, b.WM_KEYDOWN, b.VK_RETURN, 0)print('消息发送成功!')

sendImage(name,imgpath)用于向群聊天窗口发送图片

def sendImage(name,imgpath):im = Image.open(imgpath)im.save('1.bmp')aString = windll.user32.LoadImageW(0, r"1.bmp", win32con.IMAGE_BITMAP, 0, 0, win32con.LR_LOADFROMFILE)#print(aString)if aString != 0:  ## 由于图片编码问题  图片载入失败的话  aString 就等于0w.OpenClipboard()w.EmptyClipboard()w.SetClipboardData(win32con.CF_BITMAP, aString)# 关闭剪贴板w.CloseClipboard()# 获取qq窗口句柄handle = win32gui.FindWindow(None, name)if handle == 0:print('未找到窗口!')# 显示窗口win32gui.ShowWindow(handle, win32con.SW_SHOW)# time.sleep(0.2)# 把剪切板内容粘贴到qq窗口win32gui.SendMessage(handle, win32con.WM_PASTE, 0, 0)# time.sleep(0.2)# 按下后松开回车键,发送消息win32gui.SendMessage(handle, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)win32gui.SendMessage(handle, win32con.WM_KEYUP, win32con.VK_RETURN, 0)

至此程序已经完成了向群里发送文字和图片的需求

以上是主要的代码,后面还需要设置条件判断群友是不是@了机器人,以及@机器人后的指令该怎么使用 ,等等的细节这里省略(不难)

四、代码效果

五、后记

反正也没人看,权当是个人学习记录吧

仅供娱乐,如有侵权请联系我删除

【NovelAI】在QQ群中部署AI画图机器人相关推荐

  1. docker swarm英文文档学习-8-在集群中部署服务

    Deploy services to a swarm在集群中部署服务 集群服务使用声明式模型,这意味着你需要定义服务的所需状态,并依赖Docker来维护该状态.该状态包括以下信息(但不限于): 应该运 ...

  2. Docker实战 (docker swarm的应用,docker集群的构建,在docker集群中部署服务)

    Docker实战 ----docker swarm的应用,docker集群的构建,在docker集群中部署服务 转载来源:https://blog.csdn.net/No_red/article/de ...

  3. 终于解决 k8s 集群中部署 nodelocaldns 的问题

    终于解决 k8s 集群中部署 nodelocaldns 的问题 参考文章: (1)终于解决 k8s 集群中部署 nodelocaldns 的问题 (2)https://www.cnblogs.com/ ...

  4. Docker Swarm集群中部署Traefik负载均衡器

    一.创建单节点的Docker Swarm集群 docker swarm init 二.在Swarm集群中创建一个网络 docker network create --driver=overlay tr ...

  5. docker实战2 (docker swarm的应用,docker集群的构建,在docker集群中部署服务的创建与更新)

    前言: 在之前曾写过一个关于docker集群创建的教程,但是不够深入,只是停留到集群的初始化和节点加入上,这次具体到服务,并详细讲解其中的原理.而且总结了很多自己做的过程中所踩过的很多坑(比如镜像的d ...

  6. 如何在QQ群中接入ChatGPT机器人

    最近ChatGPT很火,但是每次要在浏览器上输入显得很麻烦.那么能不能在我们日常使用的软件中接入它让我们能方便的使用它呢?下面为你介绍如何在QQ群中接入chatgpt. 环境介绍 今天我们的分享主要围 ...

  7. 如何在QQ群中使用群名片显示真实姓名?

    在一些QQ群中,大家一般都是互相熟悉的朋友和同学,这个时候再用网名就显得不太合适了.但是我们又不想把自己的QQ昵称改称真实姓名,这时该怎么办呢?         在一些QQ群中,大家一般都是互相熟悉的 ...

  8. 使用Koishi搭建一个你的AI画图机器人

    使用Koishi搭建一个你的AI画图机器人 前言 作者本人对于Koishi是什么做出了这种的定义:Koishi.js - QQ 机器人的新选择 - 知乎 (zhihu.com) 最新的介绍中直接给出了 ...

  9. 在kubernetes集群中部署mysql主从

    本文介绍在kubernetes环境中部署mysql主从集群,数据持久化采用nfs. 一.环境介绍 Mysql版本:5.7 Mysql master节点: 主机名:vm1 IP地址:192.168.11 ...

  10. 实战项目三:爬取QQ群中的人员信息

    文章目录 一.selenium简介 (一)实例说明 (二)元素定位方式 (三)实现滚动条自动下拉 二.Xpath简介 (一)语法: (二)实例: 三.定义一个爬虫类 (一)导入包 (二)初始化类 (三 ...

最新文章

  1. php window.onload,window.onload 触发时机问题
  2. centos7 hive mysql_CentOS7搭建Hive1.2.2+mysql5.7
  3. java求助,JAVA求助大家帮忙下
  4. 请解释和、|和||的区别?
  5. 专访 | 执拗、纯粹的网易阮良,和他的梦想团队
  6. mysql thread入门分析
  7. JS实例:网页上图片延迟加载的JS代码
  8. java用DFA实现脏词过滤以及用FileAlterationListenerAdaptor实现对资源文件修改的动态监听
  9. Titon Toolkit – 非常强大的用户界面组件
  10. Ajax案例-基于XML,以POST方式,完成省份-城市二级下拉联动
  11. VirtualBox LINUX虚拟机与WINDOWS共享文件夹
  12. java高级工程师哪些技术要掌握?
  13. 基于51单片机的可掉电走表万年历设计(LCD12864+DS1302+DS18B20+LM7805+18650电池外部供电)
  14. laravel 框架中的路由
  15. Java字符流拷贝/复制文本文件,字节流拷贝文本文件乱码,很经典简便
  16. 程序员常用英语单词汇总
  17. 华为2018届校园招聘笔试题目以及相应代码分享 软件开发岗位
  18. 笔记本电脑已连接WIFI密码查看方法
  19. 北京交通大学c语言作业,北京交通大学c语言综合程序设计(黄宇班).doc
  20. eclipes的使用

热门文章

  1. 分布式对象存储解决方案
  2. linux 安装adobe字体,厚道舒适的字体 -- Adobe Source Code Pro -- 在Linux上安装以及在Emacs中的配置...
  3. 网络:简述传统CPE向VCPE的演进
  4. 随机森林模型及案例(Python)
  5. 电子技术基础(三)_第3章集成运放及其应用__同相比例运算
  6. lammps教程:单原子温度计算及输出方法
  7. 淘宝图片服务器的学习
  8. 1.2 说说大学这滩泥淖——《逆袭大学》连载
  9. 一份完整的新媒体活动策划方案
  10. Windows 7常见蓝屏代码解决办法