做一个能自动聊天的脚本(源码分享)
大家好,我是公号3分钟学堂的郭立员!今天带来的是:做一个能自动聊天的脚本(源码分享)
关于这个问题呢,问的人多了写篇文章吧!
不啰嗦直接看需求啊:
就像这样 回复三句话
![](https://img.haomeiwen.com/i17297848/d58d8fffa9828a25.jpg)
这个脚本要实现的功能就是回复3句话,每一句根据对方的内容进行回复,让聊天的人觉得在和“真人”说话。
要制作这类型的脚本我们要解决几个问题:
怎么精准的识别对方输入的内容。
如何匹配预先准备好的话术库,实现准确回复。
匹配话术中,关键词的优先级和不同语境的判断(这一点难度大,可以不用考虑)
先来看看我做的效果吧:
![](https://img.haomeiwen.com/i17297848/7b874c1cbaa7f09d.jpg)
文章最底部有源码
![](https://img.haomeiwen.com/i17297848/b98eac784bfb3983.jpg)
代码主要分成了两大块:内容识别和匹配话术
1.内容识别主要是通过获取xml码,然后提取里面说的内容,这里我用的是截取法,在我基础教程第22课已经讲过了,不会的朋友可以去看一下。提取之后要判断话术是不是对方说的,判断的依据是话术在不在聊天窗口的左边。
2.匹配话术我用的是查找文本功能。
![](https://img.haomeiwen.com/i17297848/9885b4bbf5886fd6.jpg)
上图是我做的话术库,每一行由两部分组成:关键词---回复的内容
通过判断对方说的话中是不是包含话术库中的关键词,如果包含那么就回复对应的内容。
比如例子中,对方说:干啥呢,我的话术库中有“干啥”这个关键词,那么对方说的话中包含了我这个关键词,那么就回复对应的话术:“能聊污污的那种吗?”
这个话术库理论上是可以做无数条话术的,但是实际当中是做不到,因为会有互相干扰,还是拿我这个话术为例,第3句的关键词是“好”,这个关键词如果对方回复的是你好,其实也是可以匹配成功的,这里我为了避免这个问题,我把“你好”放到第一位,优先匹配,但是如果话术特别多,就没法通过简单的排序解决这个问题了。这种就需要根据不同语境,做多套话术库了。(想想都觉得麻烦!)
下面是重点了,文章底部我会把源码复制上来,但是很多朋友就喜欢复制源码直接用,完全不考虑兼不兼容的问题,那我这个代码用的时候需要注意些什么呢?
如果你的设备是雷电模拟器,分辨率480*800 dpi 160,app是QQ,那么恭喜你,可以直接无脑复制使用了。
如果不是上面我说的情况,那就要注意了。
第一个要修改的地方:
![](https://img.haomeiwen.com/i17297848/968fe4be2ec86771.jpg)
上图中是两个非常重要的参数,获取方法如下
![](https://img.haomeiwen.com/i17297848/8a1ad66f4ba7fa0b.jpg)
提取聊天窗口的xml,然后查找到对方说的文字,注意图中标蓝的代码,我们单独提出来,然后简单分一下行。
![](https://img.haomeiwen.com/i17297848/66a73f5909977480.jpg)
找到resource-id后面的内容com.tencent.mobileqq:id/chat_item_content_layout
这个就是第一个参数,当然不同app这个内容是不一样的。
bounds后面有4个数字,要第一个数字53,这个是第二个参数。
第二处要修改的是:
![](https://img.haomeiwen.com/i17297848/765c08d3d3054a11.jpg)
这两个坐标是为了激活输入框和点击发送按钮的,用的时候要根据自己的app,单独用抓抓获取对应的坐标。
还有一些小细节要注意,我的话术库是从第2行开始用的,因为第一行有文本头,默认读取会多一个问号,为了省事所以文字是从第2行开始,如果用我的代码你也要把第一行空着。另外就是话术库的路径了,我这里是雷电模拟器的共享路径,你如果用在其他设备,改为对应的路径。
最后就是代码了:
Import "shanhai.lua"
Dim hs=file.readlines("/sdcard/pictures/话术库.txt")
Do
dim m=识别内容("com.tencent.mobileqq:id/chat_item_content_layout","53")
If Len(m) > 0 Then
For i = 1 To UBOUND(hs)
Dim x=split(hs(i),"---")
TracePrint x(0)
If InStr(1, m, x(0))>0 Then
TracePrint "我要回复的内容是:"&x(1)
Delay 200
Tap 143, 739
Delay 300
InputText x(1)
Delay 200
Tap 450, 737
Exit for
End If
Next
Else
TracePrint "对方还没有说话"
End If
Loop
Function 识别内容(s,z)
Dim m=shanhai.getuixml()
Dim arr=split(m,s)
dim n=ubound(arr)
Dim x=utf8.InStrRev(arr(n-1),"text",-1)
Dim y=utf8.len(arr(n-1))
Dim k=utf8.mid(arr(n-1),x+6,y-x-20)
Dim d=utf8.InStrRev(m,k,-1)
Dim t=utf8.instr(d,m,"]")
If Len(k) > 0 Then
Dim a=utf8.mid(m,d+y-x-20,t-d)
If InStr(1, a, "["&z) > 0 Then
TracePrint "对方说的话是:"&k
识别内容=k
Else
TracePrint "我说的话:"&k
识别内容=""
End If
End If
End Function