明树Git Lab

Commit dd5f291d authored by zfp1's avatar zfp1

3

parent 4969cda6
const { OpenAI } = require('openai');
const express = require('express'); const express = require('express');
const crypto = require('crypto'); const crypto = require('crypto');
const { OpenAI } = require('openai');
const xml2js = require('xml2js'); const xml2js = require('xml2js');
const app = express(); const app = express();
app.use(express.text({ type: 'text/xml' }));
// 初始化DeepSeek客户端 [3]() // 配置参数 [5]()
const deepseek = new OpenAI({ const openai = new OpenAI({
baseURL: 'https://api.deepseek.com/v1', baseURL: 'https://api.deepseek.com/v1',
apiKey: "sk-14f0cf16bad245169cd2563e0f9b678e", apiKey: 'sk-14f0cf16bad245169cd2563e0f9b678e'
}); });
// 微信消息处理器 // 微信服务号验证
app.use(express.text({ type: 'text/xml' })); app.get('/', (req, res) => {
app.post('/wechat', async (req, res) => { const { signature, timestamp, nonce, echostr } = req.query;
// 1. 验证签名 const token = 'deepseektest';
const { signature, timestamp, nonce } = req.query;
const sha1 = crypto.createHash('sha1');
const arr = [process.env.WECHAT_TOKEN, timestamp, nonce].sort();
const sign = sha1.update(arr.join('')).digest('hex');
if (signature !== sign) {
return res.status(403).send('Invalid signature');
}
// 2. 解析XML消息 const sorted = [token, timestamp, nonce].sort().join('');
const parser = new xml2js.Parser({ explicitArray: false }); const sha1 = crypto.createHash('sha1').update(sorted).digest('hex');
const result = await parser.parseStringPromise(req.body);
const { ToUserName, FromUserName, Content } = result.xml;
// 3. 调用DeepSeek API sha1 === signature ? res.send(echostr) : res.status(403).send(' 验证失败');
});
// 消息处理流程
app.post('/', async (req, res) => {
try { try {
const completion = await deepseek.chat.completions.create({ // XML解析
model: "deepseek-chat", const result = await xml2js.parseStringPromise(req.body);
messages: [ const message = result.xml.Content[0];
{ role: "system", content: "你是一个微信客服助手, 回复内容不能超过2048字节" }, const fromUser = result.xml.FromUserName[0];
{ role: "user", content: Content }
],
stream: false,
});
// 4. 构建响应XML // API调用 [5]()
const builder = new xml2js.Builder(); const completion = await openai.chat.completions.create({
const response = builder.buildObject({ model: "deepseek-chat",
xml: { messages: [{
ToUserName: FromUserName, role: "user",
FromUserName: ToUserName, content: message
CreateTime: Math.floor(Date.now() / 1000), }],
MsgType: 'text', stream: false
Content: completion.choices[0].message.content
}
}); });
res.type('application/xml').send(response); // 响应构造
const responseXML = `
<xml>
<ToUserName><![CDATA[${fromUser}]]></ToUserName>
<FromUserName><![CDATA[${result.xml.ToUserName[0]}]]></FromUserName>
<CreateTime>${Math.floor(Date.now()/1000)}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[${completion.choices[0].message.content}]]></Content>
</xml>
`;
res.set('Content-Type', 'text/xml');
res.send(responseXML);
} catch (error) { } catch (error) {
console.error('API Error:', error); console.error(error);
res.type('text').send(' 系统繁忙,请稍后再试'); res.status(500).send(' 服务异常');
} }
}); });
app.listen(process.env.PORT); app.listen(3001, () => console.log(' 服务运行在3000端口'));
\ No newline at end of file \ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment