最近在研究soctet模块的过程中,尝试做个小的练习,第一反应是做个类似qq或者微信的即时聊天,这个需求相对比较简单,采用UDP协议很快就可以实现,为了提高点难度,于是决定尝试模拟淘宝的自动回复功能,决定要实现以下几个功能:
1.客户端输入问题,抓取关键词后自动回复
2.关键词的回复,也就是话术的内容,放到txt文档中,可以根据固定的格式增删改查,比如在txt文档中增加或者减少内容,代码执行不受影响
3.聊天结束后,自动保存聊天记录
先说下代码结构吧:
读取要回复的内容
生成关键词列表
起server服务
开始记录时间
接收信息
while 循环判断关键词
|—如果输入q,bye,再见等直接退出
|—否则,循环匹配关键词列表中的字段
|—如果匹配成功,打印对应字典的值
|—不匹配,打印字典中对应的”其他“对应的值
用到的知识点:
1.socker模块
socket.bind() 将套接字绑定到地址
socker.listen() 开始监听TCP传入连接
s.accept() 接受TCP连接并返回(conn,address)
s.connect(address) 连接到address处的套接字
s.recv(bufsize[,flag]) 接受TCP套接字的数据
s.send(string[,flag]) 发送TCP数据
2.json模块
json.load(f) 从文件中导入数据,因为导入的是字典类型的数据,所以用了json模块
第一步:json导入关键词,生成关键词列表
import json
import socket
import time
print('欢迎光临XXX天猫店,很高兴为您服务\n')
# 导入关键词列表
answer_list=[]
with open('answer','r',encoding='utf-8') as f:
dic=json.load(f)
for i in dic:
answer_list.append(i)
第二步:server端服务,同时开始记录聊天记录
sk=socket.socket()
sk.bind(('127.0.0.1',8080))
sk.listen()
conn,addr=sk.accept()
conn.send(bytes('客服:有什么能帮助您的?',encoding='utf-8'))
f=open('chat record','a+',encoding='utf-8')
s=time.strftime('%Y:%m:%D %H:%M:%S',time.localtime())
# 记录聊天记录时间
f.write(s+'\n')
f.write('客服:有什么能帮助您的?\n')
第三步:接收客户端数据,开始判断是否退出
while 1:
answer=conn.recv(1024).decode('utf-8')
f.write(answer+'\n')
print(answer)
if answer == '客户:q' or answer == '客户:再见' or answer =='客户:bye':
conn.send('客服:期待您的再次光临'.encode('utf-8'))
print('客服:期待您的再次光临')
f.write('客服:期待您的再次光临\n')
break
第四步,如果不退出,计算关键词列表的长度,然后循环去匹配,匹配到对应的关键词,到字典中找对应的值输出,并发送客户端,每找一次计数,如果都找完了,没有匹配项,说明没有这个关键词,执行elif的内容
else:
num=0
for i in range(len(answer_list)):
num+=1
if answer.count(answer_list[i]) > 0 :
print('客服:'+dic[answer_list[i]])
f.write('客服:'+dic[answer_list[i]]+'\n')
conn.send(bytes('客服:'+dic[answer_list[i]],encoding='utf-8'))
break
elif num == len(answer_list):
print('客服:'+dic['其他'])
f.write('客服:'+dic['其他']+'\n')
conn.send(bytes('客服:'+dic['其他'], encoding='utf-8'))
conn.close()
sk.close()
f.close()
第五步,client端,相对比较简单了,只要记清楚了客户端发送和接收的次数,一一对应就可以了
import socket
print('欢迎光临XXX天猫店,很高兴为您服务\n')
answer_list=[]
sk=socket.socket()
sk.connect(('127.0.0.1',8080))
ret=sk.recv(1024).decode('utf-8')
print(ret)
while 1:
answer=input('')
if answer=='q' or answer == '再见' or answer =='bye':
sk.send(('客户:' + answer).encode('utf-8'))
ret = sk.recv(1024).decode('utf-8')
print(ret)
break
else:
sk.send(('客户:'+answer).encode('utf-8'))
ret1 = sk.recv(1024).decode('utf-8')
print(ret1)
sk.close()
代码放到2个py中,应为用的是TCP协议连接的,所以需要先起server,在启动client端测试。退出后,会自动记录聊天记录
功能都可以实现,但仍然还是有个小bug,就是必须客户输入bye等退出后,聊天记录才会保存,原因就是用了open方法,必须在close之后才会保存,如果程序不退出,就无法保存,也可以用with open()来解决这个问题,但是感觉每次调用太麻烦,就没有这么做!
下次继续优化,求大神指导和各位朋友指教!