importwechatpyfrom django.contrib importauthfrom wechatpy.enterprise.client.api importWeChatOAuthfrom wechatpy.enterprise.exceptions importInvalidCorpIdExceptionfrom wechatpy importenterprise, parse_messagefrom django.shortcuts importrender, redirectfrom django.http importJsonResponse, HttpResponse, HttpResponseRedirectfrom django.contrib.auth importauthenticate, login, logoutfrom django.contrib.auth.decorators importlogin_requiredfrom django.contrib.auth.forms importUserCreationFormfrom django.contrib.auth.models importUserimportuuid, datetime, json, timeimportitkf as configfrom django.utils.safestring importmark_safefrom wechatpy.enterprise.crypto importWeChatCryptofrom wechatpy.exceptions importInvalidSignatureExceptionimportosimporturllibimportitkffrom app importmodelsfrom django.core.cache importcachefrom wechatpy.enterprise importWeChatClientfrom wechatpy.session.redisstorage importRedisStoragefrom redis importRedisfrom urllib.parse importquotefrom django.utils.safestring importmark_safeimportjsonimporturllib3
ENV_PROFILE= os.getenv("ENV")if ENV_PROFILE == "test":importitkf.test_settings as configelif ENV_PROFILE == "production":importitkf.prd_settings as configelse:importitkf.settings as config
corpid= config.weChatWork["corpid"]
sourceFile= config.weChatWork["sourceFile"]
serviceUser= config.weChatWork["serviceUser_"]
customeUser= config.weChatWork["customeUser_"]
media_image_url= config.weChatWork["media_image_url"]
avatar_image_url= config.weChatWork["avatar_image_url"]
domain=config.domain#群消息提问内容
def template_string(**kwargs):return """新消息
> 姓名:{username}
> UM:{um}
> 发送内容:{content}
> 点击查看:{url}""".format(**kwargs)#查看请求信息
defrequestInfo(request):
result=request.environ.items()return render(request, 'requestInfo.html', {'rinfo': result})#登录功能
#注销
deflogout(request):
kfUser= models.KF.objects.filter(userid=request.user.username).first()
kfUser.status=False
kfUser.save()
auth.logout(request)return redirect('/admin/login/')#注册
defregistered(request, userid):
user= User.objects.filter(username=userid).first()if notuser:
user= User.objects.create_user(username=userid, email=str(userid) + "@pingan.com.cn", password=uuid.uuid1(),
is_staff=True, is_active=True)
auth.login(request, user)returnuser#Create your tests here.
@login_requireddefindex(request):
method=request.method.upper()
agentid= request.GET.get("nid", 1)if method == "GET":return render(request, "index.html")elif method == "POST":
UserId=request.user.username
kfUser= models.KF.objects.filter(userid=UserId).first()
kfUser.status=True
kfUser.save()print(request.POST)
Content= request.POST.get('mine[content]')
userid= request.POST.get('mine[id]')
FromUserName= request.POST.get('to[id]')
cur_time=datetime.datetime.now()
models.Message.objects.create(ToUserName=userid, AgentID=kfUser.agent, FromUserName=FromUserName,
content=Content,
CreateTime=cur_time, author=request.user, editor=request.user)from channels.layers importget_channel_layer
channel_layer=get_channel_layer()from asgiref.sync importasync_to_syncprint("FromUserName============", FromUserName)
obj={"username": request.user.first_name
,"avatar": media_image_url +str(kfUser.avatar)
,"id": FromUserName
,"type": "chat_message","content": Content
}print("rindex===========", FromUserName[str(FromUserName).rindex("_") + 1:])print("customeUser + FromUserName=============", customeUser +FromUserName)
async_to_sync(channel_layer.group_send)(customeUser+ FromUserName[str(FromUserName).rindex("_") + 1:], obj)
obj={"username": request.user.first_name
,"avatar": media_image_url +str(kfUser.avatar)
,"id": FromUserName
,"type": "chat_message","content": Content
}
currentOnlineKF= models.KF.objects.filter(agent__id=agentid, status=True).exclude(userid=UserId)print(currentOnlineKF.query)for item incurrentOnlineKF:
async_to_sync(channel_layer.group_send)(serviceUser+ str(agentid) +item.userid, obj)
result= {"code": 200, "msg": "ok"}returnJsonResponse(result)#@login_required
@login_requireddefcustome(request):
method=request.method.upper()
agentid= request.GET.get("nid", 1)if method == "GET":return render(request, "custome.html",
{"agentid": agentid,"currentUser": request.user})else:
UserId=request.user.usernameprint(request.POST)
Content= request.POST.get('mine[content]')
FromUserName= request.POST.get('to[userid]')
cur_time=datetime.datetime.now()
models.Message.objects.create(ToUserName=UserId, AgentID=agentid, FromUserName=FromUserName,
content=Content,
CreateTime=cur_time, author=request.user, editor=request.user)
currentKF= models.KF.objects.filter(agent__id=agentid, status=True).count()from channels.layers importget_channel_layer
channel_layer=get_channel_layer()from asgiref.sync importasync_to_syncif currentKF >0:
obj={"username": request.user.first_name
,"avatar": avatar_image_url + UserId + ".png","id": FromUserName
,"type": "chat_message","content": Content
}#首次会话查询知识库直接返回信息 未完成
currentOnlineKF= models.KF.objects.filter(agent__id=agentid, status=True).exclude(userid=UserId)print(currentOnlineKF)for item incurrentOnlineKF:
async_to_sync(channel_layer.group_send)(serviceUser+ agentid +item.userid, obj)else:
sid= str(FromUserName).split('_')[1]print("staffService===========", sid)
staffService= models.staffService.objects.filter(id=sid).first()
obj={"username": staffService.title
,"avatar": media_image_url +str(staffService.avatar)
,"id": FromUserName
,"type": "chat_message","content": staffService.notuserText
}
async_to_sync(channel_layer.group_send)(customeUser+ FromUserName[str(FromUserName).rindex("_") + 1:], obj)
result= {"code": 200, "msg": "ok"}returnJsonResponse(result)
@login_requireddefGetUserList(request):
loginUser=request.user.usernameprint("loginUser=================", loginUser)
user= models.KF.objects.filter(userid=loginUser).first()
mine= {"username": user.username, "id": user.userid, "status": "online", "sign": "客服001","avatar": media_image_url +str(user.avatar)}
ulist= models.userList.objects.filter(agent__agentid=user.agent.agentid).values("id", "username", "userid","avatar", "sign").order_by("-createTime")[0:200]for item inulist:
item["avatar"] = media_image_url + item["avatar"]print(item["avatar"])
friend= [{"groupname": "今天", "id": 1, "online": len(ulist), "list": list(ulist)},
{"groupname": "前天", "id": 2, "online": 0, "list": []},
{"groupname": "三天前", "id": 4, "online": 0, "list": []},
{"groupname": "已回复", "id": 5, "online": 0, "list": []},
{"groupname": "未回复", "id": 6, "online": 0, "list": []}]return JsonResponse({'code': 0, 'msg': "", "data": {"mine": mine, "friend": friend, "group": []}})
@login_requireddefdepartmentServices(request):
loginUser=request.user.username
mine= {"username": request.user.first_name, "id": request.user.id, "status": "online", "sign": "127.0.0.1","avatar": avatar_image_url + loginUser + ".png"}#好友组
friend =[]
agent= models.agent.objects.order_by("agentid")for item inagent:#好友列表
ulist =[]
staff= models.staffService.objects.filter(agent__agentid=item.agentid)for s instaff:
ulist.append(
{"id": serviceUser + str(s.id) + "_" + loginUser, "username": s.title,"userid": serviceUser + str(s.id) + "_" +loginUser,"avatar": media_image_url + str(s.avatar), "sign": s.desc})
friend.append({"groupname": item.name, "id": item.id, "online": len(ulist), "list": list(ulist)})print("friend=============", friend)return JsonResponse({'code': 0, 'msg': "", "data": {"mine": mine, "friend": friend, "group": []}})
@login_requireddefuploadImage(request):
file= request.FILES.get("file")#2.创建一个文件(用于保存图片)
fileName = str(uuid.uuid4()) + ".png"save_path= config.MEDIA_ROOT + "/" + fileName #pic.name 上传文件的源文件名
with open(save_path, 'wb') as f:#3.获取上传文件的内容并写到创建的文件中
for content in file.chunks(): #pic.chunks() 上传文件的内容。
f.write(content)returnJsonResponse(
{'code': 0, 'msg': "", "data": {"src": "{}/itkfstatic/uploadImage/{}".format(domain, fileName)}})
@login_requireddefgetWelcomeText(request):
data= request.POST.get("data", None)
name= request.POST["data[name]"]
type= request.POST["data[type]"]
avatar= request.POST["data[avatar]"]
id= request.POST["data[id]"]#当前服务id
nid = id[str(id).find("_") + 1]importdatetime#获取当前时间
now =datetime.datetime.now()#获取今天零点
zeroToday = now - datetime.timedelta(hours=now.hour, minutes=now.minute, seconds=now.second,
microseconds=now.microsecond)#获取23:59:59
lastToday = zeroToday + datetime.timedelta(hours=23, minutes=59, seconds=59)
seconds= int((lastToday -now).total_seconds())
redisKey= request.user.username + "$" +nidif notcache.get(redisKey):
cache.set(redisKey, nid, timeout=seconds)
staff= models.staffService.objects.filter(id=id[str(id).find("_") + 1]).first()from channels.layers importget_channel_layer
channel_layer=get_channel_layer()from asgiref.sync importasync_to_sync
obj={"username": name
,"avatar": avatar
,"id": id
,"type": "chat_message","content": staff.welcomeText
}print("rindex===========", id[str(id).rindex("_") + 1:])
async_to_sync(channel_layer.group_send)(customeUser+ id[str(id).rindex("_") + 1:], obj)return JsonResponse({'code': 0, 'msg': ""})
@login_requireddefupdateUserStatus(request):print(request.POST["state"])
flag=Falseif request.POST["state"] == "online":
flag=True
models.KF.objects.filter(userid=request.user.username).update(status=flag)return JsonResponse({'code': 0, 'msg': ""})#微信企业号 接收消息服务器配置
from django.views.decorators.csrf importcsrf_exemptdefdownloadFile(data, fileType):'''result = client.media.get_url(data["MediaId"])
file = str(uuid.uuid1()) + "." + fileType
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sourceUrl = os.path.join(BASE_DIR, sourceFile)
LocalPath = os.path.join(sourceUrl, file)
# os.path.join将多个路径组合后返回
urllib.request.urlretrieve(result, LocalPath)
return "/{0}/{1}".format(sourceFile, file)'''
return "OK"
classswitch_wechat_messages(object):defcase_to_function(self, case):
fun_name= str(case) + "Message"method=getattr(self, fun_name, self.unknownMessage)returnmethoddeftextMessage(self, data):
Content= data["Content"]defimageMessage(self, data):
PicUrl= data["PicUrl"]print(data)defshortVideoMessage(self, data):print(data)defvideoMessage(self, data):
fileType= "avi"
print(data)defvoiceMessage(self, data):
fileType= data["Format"]print(data)deflocationMessage(self, data):print(data)deflinkMessage(self, data):print(data)defeventMessage(self, data):
AgentID= data["AgentID"]
FromUserName= data["FromUserName"]
createUser(FromUserName, AgentID)defunknownMessage(self, data):print(data)defcreateUser(userid, AgentID):return "OK"