【NovelAI】在QQ群中部署AI画图机器人

news/2025/2/22 22:46:14/

目录

一、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)

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

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

四、代码效果 

五、后记 

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

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


http://www.ppmy.cn/news/788375.html

相关文章

Android 如何在第三方app 调起qq好友和qq群

一、调起qq好友的方法&#xff1a; try {//可以跳转到添加好友&#xff0c;如果qq号是好友了&#xff0c;直接聊天String url "mqqwpa://im/chat?chat_typewpa&uin对方QQ号";//uin是发送过去的qq号码startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(…

微信实现qq群的qq小冰功能

常玩qq的人应该知道qq群里可以引入一个“聊天机器人”qq小冰&#xff0c;而后可以在群里通过qq小冰来达到调戏的目的 然而尿性的腾讯除了qq之外还有微信这样一款聊天的软件 本文目的就是注册一个微信号&#xff08;来作为我们的机器人&#xff09;&#xff0c;将其拉到微信群里…

Android开发之添加QQ群的方法(官方代码)

/**************** * * 发起添加群流程。群号&#xff1a;物美价廉淘宝购(485761716) 的 key 为&#xff1a; uTJdlkbFAd9IdpZKEN6vumHHYqFyuTPt * 调用 joinQQGroup(uTJdlkbFAd9IdpZKEN6vumHHYqFyuTPt) 即可发起手Q客户端申请加群 物美价廉淘宝购(485761716) * * param key 由…

ChatGPT在社交媒体分析中的应用如何?

ChatGPT在社交媒体分析中具有广泛的应用潜力&#xff0c;可以提供有价值的洞察和支持。以下是ChatGPT在社交媒体分析中的一些应用场景&#xff1a; 1. 情感分析和舆情监测&#xff1a;ChatGPT可以分析社交媒体上用户的发帖、评论和回复&#xff0c;进行情感分析和舆情监测。它…

java 监控qq群信息_易语言通过监控图标实现QQ消息监控的代码

DLL命令表 .版本 2 .DLL命令 GetWindowThreadProcessId___, 整数型, "user32.dll", "GetWindowThreadProcessId" .参数 hwnd, 整数型 .参数 lpdwProcessId, 整数型, 传址 .DLL命令 OpenProcess___, 整数型, "kernel32.dll", "OpenProcess&q…

QQ加群组件-Android

/**************** * * 发起添加群流程。群号&#xff1a;翻车群(********) 的 key 为&#xff1a; DBByLeFXyW-cDJnA1_gCereoUmgS-26O * 调用 joinQQGroup(DBByLeFXyW-cDJnA1_gCereoUmgS-26O) 即可发起手Q客户端申请加群 翻车群(*******) * * param key 由官网生成的key * ret…

Android/ios/h5 三步调起QQ群聊,一键加群

官网可生成网页、ios、android相关代码等三种方式&#xff0c;二维码就不说了 三步走&#xff1a; 1、登录官网&#xff1a;https://qun.qq.com/join.html 2、选择群聊 3、复制代码 收工。 android代码示例&#xff1a; /**************** * * 发起添加群流程。群号&#…

Android一键加QQ群

接入总流程 Step 1 &#xff1a;发送接入方案阐述&#xff08;详细到设计稿&#xff09;到群开放平台官方邮箱 qunkaifangtencent.com &#xff0c;获得平台认可确定后才可接入应用 Step 2 &#xff1a;开发者在腾讯开放平台进行注册 Step 3 &#xff1a;开发者在腾讯开放平台…