177 lines
6.5 KiB
JavaScript
177 lines
6.5 KiB
JavaScript
// content.js - 内容脚本
|
|
// 负责处理从background.js转发过来的WebSocket消息
|
|
// 以及执行页面DOM操作(如点击用户、填写回复等)
|
|
|
|
console.log("Content script loaded.");
|
|
|
|
let sessionIdData;
|
|
getAiSessionIdViaBackground();
|
|
console.log(sessionIdData);
|
|
|
|
|
|
// ==================== 消息监听器 ====================
|
|
// 监听来自background.js的消息
|
|
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
|
|
// 检查消息类型是否为WebSocket消息
|
|
if (message.type === "WEBSOCKET_MESSAGE") {
|
|
console.log("收到WebSocket消息:", message.data);
|
|
// 解析消息内容
|
|
const messageData = JSON.parse(message.data);
|
|
if (messageData.type === 4) {
|
|
console.log("心跳消息,跳过处理");
|
|
return;
|
|
}
|
|
if (messageData.type === 2) {
|
|
console.log("文本消息,开始处理...");
|
|
if (messageData.data) {
|
|
const data = messageData.data;
|
|
if (data.type == 'PUSH_SIXINTONG_MSG') {
|
|
const payload = data.payload;
|
|
console.log("私信通消息:", payload);
|
|
if (payload.is_new_push && !payload.is_replied) {
|
|
console.log("新的未回复消息,开始处理...");
|
|
// ==================== 数据提取 ====================
|
|
// 从payload中提取各种有用的信息
|
|
|
|
// 基础信息
|
|
const trace_id = payload.trace_id; // 追踪ID,用于消息追踪
|
|
const is_show_reminder_tips = payload.is_show_reminder_tips; // 是否显示提醒提示
|
|
const visitor_id = payload.visitor_id; // 访客ID
|
|
|
|
// 私信用户信息(从sixin_chat对象中提取)
|
|
const {
|
|
user_id, // 用户ID
|
|
nickname, // 用户昵称
|
|
avatar, // 用户头像URL
|
|
last_msg_ts: last_msg_ts_sixin_chat, // 最后消息时间戳
|
|
last_msg_store_id // 最后消息店铺ID
|
|
} = payload.sixin_chat;
|
|
|
|
// 私信消息内容(从sixin_message对象中提取)
|
|
const {
|
|
id, // 消息ID
|
|
store_id, // 店铺ID
|
|
message_type, // 消息类型
|
|
message_source, // 消息来源
|
|
content, // 消息内容(这是我们需要回复的文本)
|
|
receiver_id, // 接收人ID
|
|
sender_id, // 发送人ID
|
|
created_at // 消息创建时间
|
|
} = payload.sixin_message;
|
|
|
|
// 私信会话消息扩展信息(从message_extension对象中提取)
|
|
const {
|
|
cas_account_no, // 客服编号
|
|
csa_name, // 客服名称
|
|
customer_user_id, // 客户用户ID
|
|
last_msg_ts: last_msg_ts_message_extension, // 最后消息时间戳
|
|
preview, // 消息预览
|
|
sender_type // 发送类型
|
|
} = payload.message_extension;
|
|
|
|
// 长聊天展示信息(从long_chat_view对象中提取)
|
|
const {
|
|
active, // 窗口是否激活
|
|
favorite // 是否收藏
|
|
} = payload.long_chat_view;
|
|
|
|
console.log("提取的用户信息:", {
|
|
nickname,
|
|
user_id,
|
|
content,
|
|
created_at
|
|
});
|
|
// 选择用户并生成回复
|
|
selectUserInChatList(nickname);
|
|
console.log(sessionIdData);
|
|
generateReply(sessionIdData.data, content);
|
|
// 将信息放入textarea输入框
|
|
// document.getElementById("jarvis-reply-textarea").focus();
|
|
// // 输入回复信息
|
|
// simulateKeyPress(reply)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
// AI回复生成(示例,实际应调用AI接口)
|
|
function generateReply(sessionId, message) {
|
|
chrome.runtime.sendMessage({
|
|
type: 'POST_AI_CHAT_MESSAGE',
|
|
data: {
|
|
sessionId: sessionId,
|
|
message: message,
|
|
csrfToken: 'bguiLwpjOdXAlW7zWmWN27bsa74FOj8WhbTKZbdoFnD0Go2BMX23myr7H2L1A7Cx'
|
|
}
|
|
}, (response) => {
|
|
if (response && response.success) {
|
|
console.log('AI回复:', response.data);
|
|
const textarea = document.querySelector('#jarvis-reply-textarea');
|
|
textarea.value = response.data.data.content;
|
|
// 触发input事件让监听器响应
|
|
textarea.dispatchEvent(new Event('input', { bubbles: true }));
|
|
// 等待2秒,点击发送
|
|
setTimeout(() => {
|
|
// 获取按钮元素
|
|
const sendBtn = document.querySelector('button.send_btn');
|
|
// 执行点击
|
|
if (sendBtn) {
|
|
sendBtn.click();
|
|
} else {
|
|
console.error('未找到发送按钮');
|
|
}
|
|
}, 2000);
|
|
} else {
|
|
console.error('请求失败:', response && response.error);
|
|
}
|
|
});
|
|
}
|
|
|
|
// 在聊天列表中找到并点击指定用户
|
|
function selectUserInChatList(userName) {
|
|
const userElements = document.querySelectorAll(".sx-contact-item");
|
|
userElements.forEach(el => {
|
|
if (el.textContent.includes(userName)) {
|
|
el.click();
|
|
}
|
|
});
|
|
}
|
|
|
|
// 将AI生成的回复发送到background.js
|
|
function sendMessageToBackground(replyText) {
|
|
chrome.runtime.sendMessage({
|
|
type: "AI_REPLY_GENERATED",
|
|
data: { reply: replyText }
|
|
});
|
|
}
|
|
|
|
// 模仿键盘输入
|
|
function simulateKeyPress(char) {
|
|
// 创建一个键盘事件
|
|
const event = new KeyboardEvent('keydown', {
|
|
key: char,
|
|
code: char.toLowerCase(),
|
|
keyCode: char.charCodeAt(0),
|
|
which: char.charCodeAt(0)
|
|
});
|
|
|
|
// 触发键盘事件
|
|
document.dispatchEvent(event);
|
|
}
|
|
|
|
/*
|
|
{{ AURA-X: Add - 新增通过chrome.runtime.sendMessage请求后台代理获取AI会话ID的示例. Approval: 寸止(ID:20240608-content-cors-proxy) }}
|
|
*/
|
|
function getAiSessionIdViaBackground() {
|
|
chrome.runtime.sendMessage({ type: 'FETCH_AI_SESSION_ID' }, (response) => {
|
|
if (response && response.success) {
|
|
console.log('通过background代理获取的AI会话信息:', response.data);
|
|
sessionIdData = response.data
|
|
} else {
|
|
console.error('代理获取AI会话ID失败:', response && response.error);
|
|
}
|
|
});
|
|
}
|
|
// 调用示例:getAiSessionIdViaBackground();
|