我做了一个poe逆向的chatgpt网站
这是python后端代码;
from flask import Flask, render_template, request, jsonify
import logging
import sys
import poe
poe.logger.setLevel(logging.INFO)
app = Flask(__name__)
@app.route('/sendMessage')
def send_message():
message = request.args.get('message')
print(message)
botName = request.args.get('botName')
token = request.args.get('token') or "E47ev1yLsYFCv8M4k3pn5Q%3D%3D"
client = poe.Client(token, proxy="socks5://127.0.0.1:7890")
response = client.send_message(botName, message)
text = ''
for msg in response:
text += msg['text_new']
return jsonify(text)
@app.route('/')
def index():
return render_template('index.html')
if __name__ == '__main__':
app.run(debug=True)
这是前端;
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
<title>POE Chat Client</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.19.2/axios.min.js"></script>
<style>
input {
width: 300px;
}
.message {
margin-bottom: 10px;
}
</style>
</head>
<body>
<input id="message" placeholder="输入问题">
<select id="botName">
<option value="capybara" selected>Sage</option>
<option value="a2">Claude-instant</option>
<option value="nutria">Dragonfly</option>
<option value="a2_100k">Claude-instant-100k</option>
<option value="beaver">GPT-4</option>
<option value="chinchilla">ChatGPT</option>
<option value="a2_2">Claude+</option>
</select>
<input id="token" placeholder="输入token">
<button onclick="sendMessage()">发送</button>
<div id="response"></div>
<div id="responseContainer" style="height:200px; overflow:auto;"></div>
<script>
async function sendMessage() {
let message = document.getElementById("message").value;
let botName = document.getElementById("botName").value;
let token = document.getElementById("token").value;
let response = await axios.get('/sendMessage', {
params: {
message: message,
botName: botName,
token: token
}
})
document.getElementById("response").innerHTML = response.data;
}
</script>
</body>
</html>
想问下要如何让后端的回复在前端实时显示,而不是在回复完成后显示
源于ChatGPT仅供参考
您可以使用WebSocket来实现后端的消息在前端实时显示。WebSocket是 HTML5 新增的协议,它实现了浏览器和服务器之间全双工通信,也就是可以实现服务器主动推送信息给客户端。
具体步骤如下:
1.在前端HTML中添加 WebSocket 相关代码
<script>
var ws = new WebSocket("ws://localhost:5000/ws"); // 连接到后端WebSocket服务
ws.onopen = function() {
console.log("连接成功");
};
ws.onmessage = function(evt) { // 接收到服务器发送的消息后执行的操作
var responseContainer = document.getElementById('responseContainer');
responseContainer.innerHTML += '<p>' + evt.data + '</p>';
};
ws.onclose = function() {
console.log("连接关闭");
};
function sendMessage() {
let message = document.getElementById("message").value;
let botName = document.getElementById("botName").value;
let token = document.getElementById("token").value;
ws.send(JSON.stringify({ // 将输入框中的消息发送到后端WebSocket服务
message: message,
botName: botName,
token: token
}));
document.getElementById("response").innerHTML = "正在加载,请稍等...";
}
</script>
2.在后端Python代码中添加WebSocket相关代码
from flask import Flask, render_template, request, jsonify
from flask_socketio import SocketIO, emit
import logging
import sys
import poe
import json
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)
@socketio.on('connect')
def test_connect():
print('Websocket连接成功')
@socketio.on('disconnect')
def test_disconnect():
print('Websocket连接断开')
@socketio.on('message') # 接收来自前端的消息
def handleMessage(msg):
message = msg['message']
botName = msg['botName']
token = msg['token'] or "E47ev1yLsYFCv8M4k3pn5Q%3D%3D"
client = poe.Client(token, proxy="socks5://127.0.0.1:7890")
response = client.send_message(botName, message)
text = ''
for msg in response:
text += msg['text_new']
emit('message', text) # 发送处理后的消息到前端
@app.route('/')
def index():
return render_template('index.html')
if __name__ == '__main__':
socketio.run(app, debug=True, host='0.0.0.0', port=5000)
这样就可以实现后端的回复在前端实时显示了,若有帮助希望采纳。
有帮助的话 采纳一下
pip install flask-socketio
socketio = SocketIO(app)
@socketio.on('connect')
def connect():
print('Client connected')
@socketio.on('disconnect')
def disconnect():
print('Client disconnected')
@app.route('/sendMessage')
def send_message():
# ...
socketio.emit('response', text) # 发送response事件及响应文本
return jsonify(text)
<script src="https://cdn.socket.io/4.3/socket.io.min.js"></script>
<script>
let socket = io();
socket.on('connect', function() {
socket.emit('join', 'some room');
});
socket.on('response', function(text) {
document.querySelector('#response').innerText = text;
});
</script>
监听到response
事件后,前端将更新#response
元素的文本内容,达到实时显示效果。
我最近开始学习python,感觉python整体语法啥的还是很好学的,但是正是由于太简单,且我还有多年的java编程基础,便很难沉下心去学习。想到之前看到的一段话:人性总是趋利避害的,做一件事情没有短期、中期、长期的正反馈。不利于一致坚持做下去
。 想到之前搞java 的经验:想快速上手java,并对java程序产生兴趣 那就是拿java写出各种各样的小工具,获取短期的正反馈,培养学习Java的兴趣,故我在学习python的时候,也想这样切入,再次感叹python的GUI类库真是太全面,语法使用啥的都很简单,故写了一篇
针对问题,可以使用WebSocket来实现后端的实时回复在前端页面的实时展示。WebSocket是一种在单个TCP连接上进行全双工通信的协议,允许Web应用程序的客户端和服务器进行实时通信,可以在客户端和服务器之间创建持久连接。
具体步骤如下:
var ws = new WebSocket('ws://localhost:8000/');
ws.onmessage = function(event) {
var message = event.data;
// 将后端回复展示在前端页面上
document.getElementById("message").innerHTML = message;
};
import asyncio
import websockets
async def echo(websocket, path):
async for message in websocket:
# 处理客户端发送的消息
response = handle_message(message)
# 将回复发送给客户端
await websocket.send(response)
async def start_websocket_server():
async with websockets.serve(echo, "localhost", 8000):
await asyncio.Future()
def handle_message(message):
# 处理客户端发送的消息的逻辑
return response
if __name__ == '__main__':
asyncio.run(start_websocket_server())
以上代码示例仅供参考,具体实现根据实际情况进行调整。
需要注意的是,WebSocket的通信是基于TCP连接的,所以需要确保客户端和服务器之间的网络连接是稳定的。同时,WebSocket通信中传输的数据需要进行适当的加密和验证,以确保数据的安全性。