layim mysql_django + channels + layim 实现用户一对一,一对多,群组聊天实时通讯

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"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值