当前位置:网站首页 > 运营思维 > 鬼才老李 > 正文

做一个能自动聊天的脚本(源码分享)

作者:鬼才老李 日期:2019-04-09 分类:鬼才老李

关于这个问题呢,问的人多了写篇文章吧!

不啰嗦直接看需求啊:

就像这样 回复三句话


这个脚本要实现的功能就是回复3句话,每一句根据对方的内容进行回复,让聊天的人觉得在和“真人”说话。

要制作这类型的脚本我们要解决几个问题:

  1. 怎么精准的识别对方输入的内容。

  2. 如何匹配预先准备好的话术库,实现准确回复。

  3. 匹配话术中,关键词的优先级和不同语境的判断(这一点难度大,可以不用考虑)

先来看看我做的效果吧:


文章最底部有源码


代码主要分成了两大块:内容识别和匹配话术

1.内容识别主要是通过获取xml码,然后提取里面说的内容,这里我用的是截取法,在我基础教程第22课已经讲过了,不会的朋友可以去看一下。提取之后要判断话术是不是对方说的,判断的依据是话术在不在聊天窗口的左边。

2.匹配话术我用的是查找文本功能。

上图是我做的话术库,每一行由两部分组成:关键词---回复的内容

通过判断对方说的话中是不是包含话术库中的关键词,如果包含那么就回复对应的内容。

比如例子中,对方说:干啥呢,我的话术库中有“干啥”这个关键词,那么对方说的话中包含了我这个关键词,那么就回复对应的话术:“能聊污污的那种吗?”

这个话术库理论上是可以做无数条话术的,但是实际当中是做不到,因为会有互相干扰,还是拿我这个话术为例,第3句的关键词是“好”,这个关键词如果对方回复的是你好,其实也是可以匹配成功的,这里我为了避免这个问题,我把“你好”放到第一位,优先匹配,但是如果话术特别多,就没法通过简单的排序解决这个问题了。这种就需要根据不同语境,做多套话术库了。(想想都觉得麻烦!)

下面是重点了,文章底部我会把源码复制上来,但是很多朋友就喜欢复制源码直接用,完全不考虑兼不兼容的问题,那我这个代码用的时候需要注意些什么呢?

  1. 如果你的设备是雷电模拟器,分辨率480*800 dpi 160,app是QQ,那么恭喜你,可以直接无脑复制使用了。

  2. 如果不是上面我说的情况,那就要注意了。

第一个要修改的地方:


上图中是两个非常重要的参数,获取方法如下

提取聊天窗口的xml,然后查找到对方说的文字,注意图中标蓝的代码,我们单独提出来,然后简单分一下行。

找到resource-id后面的内容com.tencent.mobileqq:id/chat_item_content_layout

这个就是第一个参数,当然不同app这个内容是不一样的。

bounds后面有4个数字,要第一个数字53,这个是第二个参数。

第二处要修改的是:

这两个坐标是为了激活输入框和点击发送按钮的,用的时候要根据自己的app,单独用抓抓获取对应的坐标,如果有疑问可以看公号3分钟学堂的基础教程。

还有一些小细节要注意,我的话术库是从第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

  • 流泪

    21

  • 打酱油

    11

  • 开心

    66

  • 鼓掌

    108

  • 恐怖

    4

欢迎 发表评论: