关于ai.baidu.com的 代码:

#########################################核心代码##############################################
from aip import AipNlp, AipSpeech
import os
from uuid import uuid4
import go_tuling APP_ID = "15217709"
API_KEY = "eNiP5QUsgBh6QwpbNv8Qmsy3"
SECRET_RET = "gwhM3wDo0Kjjd1PDIxqqW4Bfex10Y4f3" client = AipSpeech(APP_ID, API_KEY, SECRET_RET)
nlp_client = AipNlp(APP_ID, API_KEY, SECRET_RET) # 读取文件
def get_file_content(filePath):
# 格式转换将其他格式的文件转换成pcm文件
os.system(f"ffmpeg -y -i {filePath} -acodec pcm_s16le -f s16le -ac 1 -ar 16000 {filePath}.pcm")
with open(f"{filePath}.pcm", "rb")as fp:
# 返回这个文件
return fp.read() # 音频变文本
def audio2text(filename):
print("1", filename)
# 是被本地文件
res = client.asr(get_file_content(filename), "pcm", 16000, {
"dev_pid": 1536,
})
print(res.get("result")[0])
return res.get("result")[0] # 文本变音频
def text2audio(A):
result = client.synthesis(A, "zh", 1, {
"per": 4,
"pit": 8,
"spd": 4,
"vol": 5,
})
if not isinstance(result, dict):
# 获取文件的文件名
filename = f"{uuid4()}.mp3"
# 文件的路径
filepath = os.path.join("audios", filename)
with open(filepath, "ab") as f:
f.write(result)
# 返回这个文件的名字
return filename # 获取到用户输入的响应文件
def my_nip(Q):
# 判断用户输入的
if nlp_client.simnet(Q, "你叫什么名字").get("score") >= 0.7:
A = "我的名字叫雪人"
else:
# 获取图灵返回的文字
A = go_tuling.tl(Q, "yuebanwan") # 返回这个图灵反应的文件
return A

调用图灵的代码:

import requests
#########################################基本配置##########################
url = "http://openapi.tuling123.com/openapi/api/v2" data_dict = {
"reqType": 0,
"perception": {
"inputText": {
"text": "北京"
},
},
"userInfo": {
"apiKey": "96dfe320eec549519c5168093f93b2dc",
"userId": "yuebanwan"
}
} ##################################执行函数#########################################
def tl(text, uid):
# 给字典赋值text,这个text是传过来用户输入的内容
data_dict["perception"]["inputText"]["text"] = text
# 并给字典表名是哪个用户发来的请求
data_dict["userInfo"]["userInfo"] = uid
# 把消息数据返回给图灵,图灵并返回响应结果
res = requests.post(url, json=data_dict)
# 调用json方法把数据转成json格式的数据
res_json = res.json()
# 把图灵响应的数据
return res_json.get("results")[0]["values"]["text"]

实例化AipNlp的代码:

from aip import AipNlp

APP_ID = "15217709"
API_KEY = "eNiP5QUsgBh6QwpbNv8Qmsy3"
SECRET_KEY = "gwhM3wDo0Kjjd1PDIxqqW4Bfex10Y4f3" nlp_client = AipNlp(APP_ID, API_KEY, SECRET_KEY) text1 = "你叫什么名字" text2 = "您怎们称呼" res = nlp_client.simnet(text1, text2) # print(res.get("score"))

最终app的代码:

from flask import Flask,request, render_template, send_file, jsonify
from uuid import uuid4
from baidu_ai import audio2text
from baidu_ai import my_nip
from baidu_ai import text2audio
import os # 实例化一个Flask的对象
app = Flask(__name__) # 写一个路由
@app.route("/", methods=["GET", "POST"])
def index():
if request.method == "GET":
return render_template("web.html") @app.route("/toy_uploader", methods=["GET", "POST"])
def toy_uploader():
# 拼接路径
file_path = os.path.join("audios", f"{uuid4()}.wav")
#
request.files["record"].save(file_path)
# 将音频变成文本的函数,并的到音频的内容
Q = audio2text(file_path)
print(Q)
# 调用aipNlp
A = my_nip(Q)
# 将图灵处理后的数据返回的文本
filename = text2audio(A)
print(filename)
# 返回给前端json格式的数据
return jsonify({"filename": filename, "A": A}) @app.route("/get_audio/<filename>", methods=["GET", "POST"])
def get_audio(filename):
# 拼接新的路径
new_file = os.path.join("audios", filename)
print("2", new_file)
# 返回给前端新的文件
return send_file(new_file) if __name__ == '__main__':
app.run("192.168.12.49", 5000, debug=True)

前端代码:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<audio src="" controls autoplay id="player"></audio>
<p>
<button onclick="start_reco()" style="background-color: red">录制消息</button>
</p>
<p>
<button onclick="stop_reco()" style="background-color: green">发送消息</button>
</p>
</body>
<script type="text/javascript" src="/static/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="/static/Recorder.js"></script>
<script type="text/javascript">
var serv = "http://192.168.12.49:5000";
// var get_music = "http://192.168.1.102:9527/get_music/";
// var get_chat = "http://192.168.1.102:9527/get_chat/";
var reco = null; var audio_context = new AudioContext();
navigator.getUserMedia = (navigator.getUserMedia ||
navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia ||
navigator.msGetUserMedia); navigator.getUserMedia({audio: true}, create_stream, function (err) {
console.log(err)
}); function create_stream(user_media) {
var stream_input = audio_context.createMediaStreamSource(user_media);
reco = new Recorder(stream_input);
} function start_reco() {
reco.record();
} function stop_reco() {
reco.stop();
get_audio();
reco.clear();
} function get_audio() {
reco.exportWAV(function (wav_file) {
// wav_file = Blob对象 file对象
// ws.send(wav_file);
var formdata = new FormData();
formdata.append("record", wav_file);
// formdata.append("sender", toy_id);
// formdata.append("to_user", document.getElementById("from_user").innerText);
$.ajax({
url: serv + "/toy_uploader",
type: 'post',
processData: false,
contentType: false,
data: formdata,
dataType: 'json',
success: function (data) {
console.log(data.A);
// console.log(data); document.getElementById("player").src =
"http://192.168.12.49:5000/get_audio/" + data.filename; }
}); })
} </script>
</html>

群聊的代码:

from flask import Flask, request,render_template
from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer from geventwebsocket.websocket import WebSocket # 实例化一个app对象
app = Flask(__name__) # type: Flask
# 准备一个存放连接用户的容器
user_socket_list = [] @app.route("/ws")
def ws():
user_socket = request.environ.get("wsgi.websocket") # type: WebSocket
if user_socket:
# 把已经连接的用户添加到用户的连接列表中
user_socket_list.append(user_socket)
# print(len(user_socket_list), user_socket_list)
while 1:
# 获取到用户的数据
msg = user_socket.receive()
print(msg)
for usocket in user_socket_list:
if user_socket == usocket:
continue
try:
usocket.send(msg)
except:
continue @app.route("/")
def index():
return render_template("ws_group_chat.html") if __name__ == '__main__':
http_serv = WSGIServer(("192.168.12.49",5000), app, handler_class=WebSocketHandler)
http_serv.serve_forever()

群聊的前端代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta http-equiv="content-Type" charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Title</title>
</head>
<body>
<p>发送内容:<input type="text" id="message"><button onclick="send_msg()">发送消息</button></p>
<div id="msg_list" style="width: 500px;"> </div>
</body>
<script type="application/javascript">
var ws = new WebSocket("ws://192.168.12.49:5000/ws");
// ws.onopen = function(){
// alert("欢迎来到S14群喷");
// };
ws.onmessage = function (ws_status) {
console.log(ws_status.data);
var ptag = document.createElement("p");
ptag.innerText = ws_status.data;
document.getElementById("msg_list").appendChild(ptag);
}; function send_msg() {
var msg = document.getElementById("message").value;
var ptag = document.createElement("p");
ptag.style.cssText = "text-align: right;";
ptag.innerText = msg;
document.getElementById("msg_list").appendChild(ptag);
ws.send(msg);
}
</script>
</html>

单聊的代码:

from flask import Flask, request,render_template
from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer
import json
from geventwebsocket.websocket import WebSocket # 实例化一个Flask对象
app = Flask(__name__) # type:Flask user_socket_dict = { } @app.route("/ws/<user>")
def ws(user):
# 使用微博socket服务
user_socket = request.environ.get("wsgi.websocket") # type:WebSocket
# 如果存在user_socket连接
if user_socket:
# 是该用户连接socket
user_socket_dict[user] = user_socket
print(len(user_socket_dict), user_socket_dict) while 1:
# 接收到连接用户发过来的信息
msg = user_socket.receive()
print(msg)
# 把收到的msg反序列化
msg_dict = json.loads(msg)
# 获取到反序列化的有效内容
to_usocket = user_socket_dict.get(msg_dict.get("to_user"))
# 发送给前端显示
to_usocket.send(json.dumps({"from_user": user, "to_user": msg_dict.get("to_user"), "msg": msg_dict.get("msg")})) @app.route("/")
def index():
return render_template("ws.html") if __name__ == '__main__':
http_serv = WSGIServer(("192.168.12.49", 5000), app, handler_class=WebSocketHandler)
http_serv.serve_forever()

单聊的前端代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta http-equiv="content-Type" charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Title</title>
</head>
<body>
<p>您的昵称:<input type="text" id="nick"><button onclick="openws()">进入聊天室</button></p>
<p>给<input type="text" id="to_user">发送:<input type="text" id="message"><button onclick="send_msg()">发送消息</button></p>
<div id="msg_list" style="width: 500px;"> </div>
</body>
<script type="application/javascript">
var ws = null;
// ws.onopen = function(){
// alert("欢迎来到S14群喷");
// }; function openws(){
var nick = document.getElementById("nick").value;
ws = new WebSocket("ws://192.168.12.49:5000/ws/"+nick);
ws.onmessage = function (ws_status) {
console.log(ws_status.data);
var msg_obj = JSON.parse(ws_status.data);
var ptag = document.createElement("p");
ptag.innerText = msg_obj.from_user + " : " +msg_obj.msg;
document.getElementById("msg_list").appendChild(ptag);
};
} function send_msg() {
var msg = document.getElementById("message").value;
var from_user = document.getElementById("nick").value;
var to_user = document.getElementById("to_user").value;
var ptag = document.createElement("p");
ptag.style.cssText = "text-align: right;";
ptag.innerText = msg + " : "+ from_user;
document.getElementById("msg_list").appendChild(ptag);
var msg_obj = {
msg:msg,
from_user:from_user,
to_user:to_user
};
ws.send(JSON.stringify(msg_obj));
}; </script>
</html>

Websocket代码:

解密代码:

 1 # b'\x81\x83\xceH\xb6\x85\xffz\x85'
2
3 hashstr = b'\x81\x83\xceH\xb6\x85\xffz\x85'
4 # b'\x81 \x83 \xceH\xb6\x85\xffz\x85'
5
6 # 将第二个字节也就是 \x83 第9-16位 进行与127进行位运算
7 payload = hashstr[1] & 127
8 print(payload)
9 if payload == 127:
10 extend_payload_len = hashstr[2:10]
11 mask = hashstr[10:14]
12 decoded = hashstr[14:]
13 # 当位运算结果等于127时,则第3-10个字节为数据长度
14 # 第11-14字节为mask 解密所需字符串
15 # 则数据为第15字节至结尾
16
17 if payload == 126:
18 extend_payload_len = hashstr[2:4]
19 mask = hashstr[4:8]
20 decoded = hashstr[8:]
21 # 当位运算结果等于126时,则第3-4个字节为数据长度
22 # 第5-8字节为mask 解密所需字符串
23 # 则数据为第9字节至结尾
24
25
26 if payload <= 125:
27 extend_payload_len = None
28 mask = hashstr[2:6]
29 decoded = hashstr[6:]
30
31 # 当位运算结果小于等于125时,则这个数字就是数据的长度
32 # 第3-6字节为mask 解密所需字符串
33 # 则数据为第7字节至结尾
34
35 str_byte = bytearray()
36
37 for i in range(len(decoded)):
38 byte = decoded[i] ^ mask[i % 4]
39 str_byte.append(byte)
40
41 print(str_byte.decode("utf8"))

加密:

 1 import struct
2 msg_bytes = "hello".encode("utf8")
3 token = b"\x81"
4 length = len(msg_bytes)
5
6 if length < 126:
7 token += struct.pack("B", length)
8 elif length == 126:
9 token += struct.pack("!BH", 126, length)
10 else:
11 token += struct.pack("!BQ", 127, length)
12
13 msg = token + msg_bytes
14
15 print(msg)

基于websocket的单聊.群聊的更多相关文章

  1. spring websocket 和socketjs实现单聊群聊,广播的消息推送详解

    spring websocket 和socketjs实现单聊群聊,广播的消息推送详解 WebSocket简单介绍 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了.近年来,随 ...

  2. Flask(4)- flask请求上下文源码解读、http聊天室单聊/群聊(基于gevent-websocket)

    一.flask请求上下文源码解读 通过上篇源码分析,我们知道了有请求发来的时候就执行了app(Flask的实例化对象)的__call__方法,而__call__方法返回了app的wsgi_app(en ...

  3. websocket 实现单聊群聊 以及 握手原理+加密方式

    WebSocket 开始代码 服务端 群聊 # type:WebSocket 给变量标注类型 # websocket web + socket from geventwebsocket.server ...

  4. flask 第五章 WebSocket GeventWebsocket 单聊群聊 握手 解密 加密

    1.WebSocket 首先我们来回顾一下,我们之前用socket学习过的项目有: 1.django 2.flask 3.FTP - 文件服务 HTTP - TCP (特点): 1.一次请求,一次响应 ...

  5. WebSocket+Java 私聊、群聊实例

    前言 之前写毕业设计的时候就想加上聊天系统,当时已经用ajax长轮询实现了一个(还不懂什么是轮询机制的,猛戳这里:https://www.cnblogs.com/hoojo/p/longPolling ...

  6. WebSocket刨根问底(三)之群聊

    前两篇文章[WebSocket刨根问底(一)][WebSocket刨根问底(二)]我们介绍了WebSocket的一些基本理论,以及一个简单的案例,那么今天继续,我们来看一个简单的群聊的案例,来进一步了 ...

  7. 基于ejabberd简单实现xmpp群聊离线消息

    首先,xmpp服务器是基于ejabberd.离线消息模块是mod_interact,原地址地址:https://github.com/adamvduke/mod_interact: 修改后实现群聊离线 ...

  8. Java 网络编程 -- 基于TCP 实现聊天室 群聊 私聊

    分析: 聊天室需要多个客户端和一个服务端. 服务端负责转发消息. 客户端可以发送消息.接收消息. 消息分类: 群聊消息:发送除自己外所有人 私聊消息:只发送@的人 系统消息:根据情况分只发送个人和其他 ...

  9. 基于WebSocket和SpringBoot的群聊天室

    引入 普通请求-响应方式:例如Servlet中HttpServletRequest和HttpServletResponse相互配合先接受请求.解析数据,再发出响应,处理完成后连接便断开了,没有数据的实 ...

随机推荐

  1. 关键css

    参考: 掘金-JS和CSS的位置对资源加载顺序的影响 起舞-什么是关键CSS 有兴趣也可以看看这里一篇关于页面加载的文章.以上掘金那篇文章说css的加载不会影响其他资源的下载,但是我测试了一下,发现是 ...

  2. 夯实Java:从面向对象说起

    作者:伯特出处:github.com/ruicbAndroid/LoulanPlan声明:本文出自伯特的<LoulanPlan>,转载务必注明作者及出处. 刚学习 Java 那会就接触了& ...

  3. 基于flask的网页聊天室(四)

    基于flask的网页聊天室(四) 前言 接前天的内容,今天完成了消息的处理 具体内容 上次使用了flask_login做用户登录,但是直接访问login_requare装饰的函数会报401错误,这里可 ...

  4. BeautifulSoup4系列二

    前言 本篇详细介绍beautifulsoup4的功能,从最基础的开始讲起,让小伙伴们都能入门 一.读取HTML页面 1.先写一个简单的html页面,把以下内容copy出来,保存为html格式文件 &l ...

  5. 大数据学习——HDFS的shell

    -help 功能:输出这个命令参数手册 -ls 功能:显示目录信息 示例: hadoop fs -ls hdfs://hadoop-server01:9000/ 备注:这些参数中,所有的hdfs路径都 ...

  6. URAL 2040 Palindromes and Super Abilities 2

    Palindromes and Super Abilities 2Time Limit: 500MS Memory Limit: 102400KB 64bit IO Format: %I64d &am ...

  7. 【思维】2017多校训练七 HDU6121 Build a tree

    http://acm.hdu.edu.cn/showproblem.php?pid=6121 [题意] 询问n个结点的完全k叉树,所有子树结点个数的异或和是多少 [思路] 一棵完全K叉树,对于树的每一 ...

  8. mybatis查询返回null解决方案

    mybatis查询返回null解决方案: 问题:查询出的列与javabean中的字段名不一致. 解决方案: 1.将javabean中的字段改为和查询出的列名一致: 2.将sql加入as改变列名,和ja ...

  9. 新建一个基于vue.js+Mint UI的项目

    上篇文章里面讲到如何新建一个基于vue,js的项目(详细文章请戳用Vue创建一个新的项目). 该项目如果需要组件等都需要自己去写,今天就学习一下如何新建一个基于vue.js+Mint UI的项目,直接 ...

  10. Python基础教程笔记——第4章:字典

    字典 字典是Python唯一内建的数学映射类型,字典中的值没有特殊的顺序,键可以是数字,字符串,甚至是元组 字典的创建: 字典由键值对构成,字典中键是唯一的,而值不唯一.>>> a_ ...