何去何从?

原计划第三篇要写机器学习的内容,然而文章还没写完,酷Q没了。

可是,真的没有办法了吗?

我们相信冬天总会过去,不过,在春天到来之前,生一丛篝火取暖,也算是聊胜于无吧。

这篇文章,我将介绍如何使用 Airtest(Poco) 框架进行简单的 QQ 消息自动收发处理。

关于 Airtest

Airtest是一款网易出品的自动化测试套件,包括 Airtest(图像识别)、Poco(UI控件搜索)和 Airtest IDE。Airtest 提供了一系列自动操作应用程序的接口,我们利用这些接口,就可以实现 QQ 消息的自动收发处理。

Airtest 也是基于 Python 开发的,因此可以和之前两篇文章中介绍的 chatterbot (以及没来得及写的 pytorch)很好地协作。

Airtest 可以在官网下载,其中 Airtest IDE 需要登录账号才能使用。(可以使用网易账号或者 Github 账号登陆。)如果需要不依赖于 Airtest IDE,直接从命令行启动脚本,还需在本地的 Python 环境中安装 Airtest 库:

pip install airtest pocoui

一些构想

自 QQ 的第三方协议关停以来,我一直在寻求替代方案。从 Github 上一个名叫 FoolQQ 的项目得到启发,我想出了自动化操作的方法。

首先在安卓模拟器上运行QQ并登陆账号(为什么不用PC版?因为 Airtest 对安卓的支持相对更成熟),然后使用 Airtest 这样的框架来读取其中的内容,或者发送消息。目前这种方法可以实现单个聊天中的消息收发。

在模拟器的选择上,我使用的是逍遥模拟器,它对 QQ 和 Airtest 的兼容性都不错。为了节省空间,我选择了 QQ 极速版(原轻聊版),以下内容均以此版本为依据。

使用 Poco

Poco 是 Airtest 中的 UI 控件搜索框架,基于 uiautomatior2,支持对 Android 原生应用以及一些游戏引擎中 UI 元素层级的解析。有一个好消息,在 QQ 的界面中,所有的控件都是采用了继承修改 Android 原生控件的模式,这使得我们能够直接利用 Poco 读取消息内容,避免了复杂的 OCR 实现。

在阅读这一章节之前,可以先去看看 Airtest 的文档,了解一下 Airtest 的基础知识以及 IDE 的使用,并掌握在 IDE 中连接安卓模拟器的方法。

连接模拟器之后,运行 QQ,然后在 IDE 的「Poco 辅助穿」的下拉列表中选择「Android」,可以看到这样的 UI 渲染树:

双击其中的元素,就可以在脚本编辑器中生成选择这个元素的代码。

在 QQ 轻聊版的聊天界面,通过这种方式,我们分析出了几个关键的 UI 控件:poco("com.tencent.qqlite:id/listView1") 这个控件是当前显示的聊天内容,它有若干个包名为com.tencent.qqlite:id/base_chat_item_layout的子节点,每个子结点的包名为com.tencent.qqlite:id/chat_item_content_layout 的子节点的text属性就是消息内容。

poco("com.tencent.qqlite:id/input")底部输入框。

从这些出发,我们得到了查看当前显示的消息的代码:

def get_message_list():

def get_message_list_iter():

try:

msg_list = poco("com.tencent.qqlite:id/listView1")

for msg_container in msg_list.child("com.tencent.qqlite:id/base_chat_item_layout"):

msg = msg_container.child("com.tencent.qqlite:id/chat_item_content_layout")

if msg.get_position()[0] < 0.5: # 排除自己发送的消息

txt = msg.get_text()

if txt:

yield txt.strip()

finally:

pass

return [msg for msg in get_message_list_iter()]

以及发送消息的代码:

def send_message(msg_text):

try:

input_box = poco("com.tencent.qqlite:id/input")

input_box.click()

input_box.set_text(msg_text)

keyevent("ENTER") # 请在 QQ 的「设置-通用」中选中「回车键发送消息」

return True

except:

return False

但是 Poco 只能获取控件的基本信息,这就导致了我们无法得到消息的发送时间。为了能获取“新消息”,我们采用类似于轮询的机制,每隔一段时间获取一下消息列表,对比最新消息的内容有无变化,如果有变化,就认为之后的消息都是“新消息”。这种办法不能识别有人复读的情况,不过问题不大。

这个过程可以抽象为一个类:

class MessageListener(object):

def __init__(self):

message_list = get_message_list()

if message_list:

self.latest_message = message_list[-1]

else:

self.latest_message = None

def check_latest_message(self):

message_list = get_message_list()

if message_list:

if self.latest_message is None:

self.latest_message = message_list[-1]

return []

def check_latest_message_iter():

for msg in reversed(message_list):

msg = msg

if msg == self.latest_message:

break

yield msg

result = reversed(list(check_latest_message_iter()))

self.latest_message = message_list[-1]

return result

else:

return []

这三段代码是实现消息自动收发的基础。

综合一下

这里给出完整的代码(core.py):

# -*- encoding=utf8 -*-

# core.py

__author__ = "忘忧北萱草"

from poco.drivers.android.uiautomation import AndroidUiautomationPoco

from airtest.core.api import *

import logging

logger = logging.getLogger("airtest")

logger.setLevel(logging.ERROR) # 屏蔽多余的日志输出

# 以下是连接安卓模拟器用的代码。如果你是在 Airtest IDE 中运行这些代码,可以删去下一行以及 auto_setup 中的 devices 参数

# 21503 端口是逍遥模拟器的默认端口,如果你使用的不是逍遥,请按照 Airtest 的文档说明更改此处

simulator = "Android://127.0.0.1:5037/127.0.0.1:21503?cap_method=JAVACAP^&^&ori_method=ADBORI"

auto_setup(__file__, devices=[simulator])

poco = AndroidUiautomationPoco(

use_airtest_input=True, screenshot_each_action=False)

# 目前还不支持自动进入某个聊天,所以请手动启动 QQ 并打开聊天界面

# start_app("com.tencent.qqlite")

# 获取当前消息

def get_message_list():

def get_message_list_iter():

try:

msg_list = poco("com.tencent.qqlite:id/listView1")

for msg_container in msg_list.child("com.tencent.qqlite:id/base_chat_item_layout"):

msg = msg_container.child(

"com.tencent.qqlite:id/chat_item_content_layout")

if msg.get_position()[0] < 0.5:

txt = msg.get_text()

if txt:

yield txt.strip()

finally:

pass

return [msg for msg in get_message_list_iter()]

# 发送消息

def send_message(msg_text):

try:

input_box = poco("com.tencent.qqlite:id/input")

input_box.click()

input_box.set_text(msg_text)

keyevent("ENTER")

return True

except:

return False

# 消息轮询

class MessageListener(object):

def __init__(self):

message_list = get_message_list()

if message_list:

self.latest_message = message_list[-1]

else:

self.latest_message = None

def check_latest_message(self):

message_list = get_message_list()

if message_list:

if self.latest_message is None:

self.latest_message = message_list[-1]

return []

def check_latest_message_iter():

for msg in reversed(message_list):

msg = msg

if msg == self.latest_message:

break

yield msg

result = reversed(list(check_latest_message_iter()))

self.latest_message = message_list[-1]

return result

else:

return []

使用方法参看以下的 demo:

import random

import core

if __name__ == '__main__':

messageListener = core.MessageListener()

print('初始化完成。')

while True:

messages = messageListener.check_latest_message()

for msg in messages:

print('>>> '+msg)

if msg == '报告状态':

core.send_message('执行自检……连接不稳定……')

core.sleep(1)

本文所提到的技术已在 Github 上开源:https://github.com/Wybxc/YiriAir​github.com

结语

这篇文章写的有些仓促,不像之前两篇那么详细,因为我想尽快把我的经验分享给大家。

以上。

(封面PID:75286867)

python第三方聊天机器人_用 Python 来做一个聊天机器人吧!(特别篇)相关推荐

  1. FANUC机器人_通过ROBOGUIDE从零开始做一个离线仿真项目(1)

    FANUC机器人_通过ROBOGUIDE从零开始做一个离线仿真项目(1) 打开ROBOGUIDE软件,如下图所示,然后点击新建工作单元, 如下图所示,选择"HandlingPRO" ...

  2. java 聊天室开源_用java WebSocket做一个聊天室

    最近一个项目中,需要用到Java的websocket新特性,于是就学了一下,感觉这技术还挺好玩的,瞬间知道网页上面的那些在线客服是怎么做的了. 先看图: 实现了多客户机进行实时通讯. 下面看代码项目结 ...

  3. python制作聊天机器人原理_用 Python 来做一个聊天机器人吧!(一)

    在我的一个回答里,我提到了用 Python 搭建聊天机器人.从今天开始,我就带着大家从0开始搭建一个聊天机器人. (顺便说一句,我喜欢把链接像上面这样加在文字里,如果找不到文中所说的资源,可以看看周围 ...

  4. 来做一个聊天机器人吧[1]

    来做一个聊天机器人吧[1] 前言 准备 GUI开发 聊天模块1.0版本 语音合成1.0版本 版本1.0 前言 课程设计自己选了这个课题,因为之前就对NLP(Natural Language Proce ...

  5. 用纸筒做机器人_怎样用纸盒做机器人

    纸盒机器人是很多小朋友喜欢的课堂. 活动目标: 1.在了解机器人的外形特征的基础上,尝试用纸盒等多种材料制作机器人. 2.喜欢动手制作玩具,体验创意制作的乐趣. 活动准备: 1.与幼儿共同收集各种各样 ...

  6. 做一个自动回复机器人

    当然可以.要做一个自动回复机器人,需要以下几个步骤: 选择一种编程语言,如 Python.Java.C++ 等. 准备自动回复机器人所需的数据.这可以包括常见问题和答案,以及一些基本的自动回复规则. ...

  7. 关于“做一个聊天+信息分享客户端”的设想(SNS?)

    最近有个点子:做一个聊天+信息分享客户端,聊天工具类似QQ.MSN,信息分享一个方面的功能类似博客.微博. 聊天与信息分享分别可以积累评价信息,聊天与信息分享在内容与积累的信誉方面无缝共享.聊天/信息 ...

  8. 使用IBM translate做一个翻译机器人

    使用IBM translate做一个翻译机器人 使用工具 编程工具:webstorm 编程语言:node.js.javascript 编程环境: linux 前言 这是第二次对IBM平台进行探索了,第 ...

  9. 用python写聊天机器人_用Python 写一个机器人陪你聊天(文尾有彩蛋)

    工作一忙,原来秉烛夜谈的好友现在都很少聊天,微信都成了微信群的天下,鲜有微信好友给你发消息,想要主动发却也找不到开题话题,怎么办?用Python写一个机器人陪自己聊聊天吧.以下是源码及解析,小白都看得 ...

  10. 用python创建微信机器人_用Python创建微信机器人

    原标题:用Python创建微信机器人 文/裸睡的猪哥 图片来源于网络 微信,一个日活10亿的超级app,不仅在国内社交独领风骚,在国外社交也同样占有一席之地.今天我们要讲的便是如何用Python来做一 ...

最新文章

  1. posix_kill 信号
  2. VS单步调试乘法语句时报错:“没有可用于当前位置的源代码”的原因
  3. Java开发者写SQL时常犯的10个错误
  4. 输入矩阵包含 nan 或 inf_荣耀 V30 PRO 采用超感光电影相机矩阵
  5. WEB前端 前端开发者 如何突破技术瓶颈
  6. CRM Mock framework debug
  7. 解决hive交互模式退格键乱码
  8. ICDAR 2019 文本识别冠军方案将开源!
  9. Bootstrap 表单的帮助文本
  10. 使用 CometD、Apache 和 Camel 的 502 代理错误
  11. Canonical发布信息图:Ubuntu Linux连接一切
  12. Delphi XE7 下载 安装序列号 破解
  13. 椭圆曲线的加密算法解析和程序设计—基于python语言
  14. Typora+PicGo-core插入图片自动上传,gitee,gitgub,sm.ms三种免费图床
  15. 最简单PS双重曝光效果制作教程
  16. PIE-Engine教程—中国降水分布可视化加载以2018年为例(含图例添加)
  17. 将本珊计算机组成原理,本珊
  18. ym——Android从零开始(27)(山寨版微信-上)(新)
  19. 计算机管理无法打开权限不足,win10 打不开软件管理员权限不够
  20. UnityShader镜面反射计算与反射光向量推导

热门文章

  1. QTreeWidget简单使用之一
  2. ublock origin_Chrome可能会在打破uBlock起源的同时更快地阻止广告
  3. 南航计算机英语面试自我介绍,南航地服面试自我介绍
  4. 从0到1搭建一台属于个人的服务器,永久可运行!
  5. postgres--流复制
  6. Java web编译出错http://java.sun.com/jsp/jstl/core等两项
  7. 单卡、流量池、统付池等,细数那些常见的物联网卡计费模式
  8. python 销售数据分析输出表格_Python实现将数据库一键导出为Excel表格的实例
  9. ug10许可证错误一8_网络文化许可证办理常见错误!
  10. ug许可证服务器注册表删除,为什么我删了ug许可证后安装时一直显示我已经安装了许可证...