通用模式兼容摩卡和飞书,添加通信工具组件,添加未开通会员面板

This commit is contained in:
2026-07-17 20:04:29 +08:00
parent bca1ca3182
commit bfe13d300b
17 changed files with 1997 additions and 456 deletions
+97 -18
View File
@@ -10,8 +10,77 @@ import { useEffect, useState, useRef } from "react"
import { SidebarPanel } from "~components/SidebarPanel"
import { getCookieValue } from "~utils/cookie"
import { findJobBySourceUrl } from "~api/dataApi"
import { createChannelBridge } from "~lib/channelBridge"
import { config as appConfig } from "~config"
import type { JobInfo } from "~lib/types"
// ============ 投递链接列表数据类型 ============
/** 投递链接列表数据(跨域通信用) */
interface OfferpaieDeliveryLinkListData {
linkList: string[]
}
// ============ 通信桥接:插件运行即激活 ============
/** 插件使用状态数据类型 */
interface OfferpieBrowserPlugUsage {
usage: string
version: string
}
/** 创建通信桥接实例(插件端,不启用 Web Lock) */
const bridge = createChannelBridge({ domain: appConfig.bridgeDomain, isPlugin: true })
/** 插件运行时立即广播使用状态,并每1秒持续广播(让 watch 端能实时感知插件在线) */
bridge.emit<OfferpieBrowserPlugUsage>(appConfig.bridgeDomain, 'offerpieBrowserPlugUsage', { usage: 'isUsed', version: appConfig.pluginVersion })
setInterval(() => {
bridge.emit<OfferpieBrowserPlugUsage>(appConfig.bridgeDomain, 'offerpieBrowserPlugUsage', { usage: 'isUsed', version: appConfig.pluginVersion })
}, 1000)
/**
* 摩卡平台重定向链接处理
* mokahr.com 平台的页面会重定向,导致当前 URL 和数据库存的原始来源链接不一致
* 但岗位 IDURL 最后一段,如 2381af5e-4285-4eac-815b-ba40bf586389)在两种链接里是一样的
* 通过跨域通信从 offerpaiDeliveryLinkList 中匹配含相同 ID 的原始投递链接
*/
async function resolveMokahrRedirectUrl(url: string): Promise<string> {
// 仅对 mokahr.com 域名的链接生效
if (!url.includes("mokahr.com")) return url
// 从 URL 末尾提取岗位 ID(最后一个 / 后面的部分,去掉可能的查询参数和 hash)
const cleanUrl = url.split("?")[0].split("#").pop() || url.split("?")[0]
const segments = cleanUrl.split("/").filter(Boolean)
const mokaJobId = segments[segments.length - 1]
if (!mokaJobId) return url
console.log("[OfferPie] 摩卡平台重定向链接处理,提取岗位ID:", mokaJobId)
try {
// 通过跨域 CSL 模式读取投递链接列表
const result = await bridge.get<OfferpaieDeliveryLinkListData>(appConfig.bridgeDomain, "offerpaiDeliveryLinkList", true)
const linkList = result?.linkList || []
if (linkList.length === 0) {
console.log("[OfferPie] offerpaiDeliveryLinkList 为空,无法匹配原始链接")
return url
}
// 从后往前遍历 linkList,找到第一个包含该岗位 ID 的链接
for (let i = linkList.length - 1; i >= 0; i--) {
if (linkList[i].includes(mokaJobId)) {
console.log("[OfferPie] 匹配到摩卡平台原始来源链接:", linkList[i])
return linkList[i]
}
}
console.log("[OfferPie] linkList 中未找到包含该岗位ID的链接,使用当前URL")
} catch (err) {
console.warn("[OfferPie] 摩卡平台重定向链接处理失败:", err)
}
return url
}
/** Content Script 配置:匹配所有网页 */
export const config: PlasmoCSConfig = {
matches: ["<all_urls>"]
@@ -54,26 +123,36 @@ function Sidebar() {
// 确定用于查询岗位信息的 URL:优先用 sessionStorage 缓存的(同标签页跳转后保留)
const STORAGE_KEY = "offerpie_source_url"
const cachedUrl = sessionStorage.getItem(STORAGE_KEY)
const queryUrl = cachedUrl || currentUrl
let queryUrl = cachedUrl || currentUrl
// 查询岗位信息
findJobBySourceUrl(queryUrl).then((data) => {
console.log("[OfferPie] 岗位信息:", data)
if (data && data.id) {
setJobInfo(data)
// 查到岗位后缓存当前查询成功的 URL
sessionStorage.setItem(STORAGE_KEY, queryUrl)
// 自动打开面板
if (!autoOpenedRef.current) {
autoOpenedRef.current = true
setVisible(true)
}
} else if (!cachedUrl) {
// 当前 URL 和缓存都没查到,不自动打开
console.log("[OfferPie] 当前页面未匹配到岗位信息")
// 摩卡平台重定向链接处理:替换为原始来源链接
resolveMokahrRedirectUrl(queryUrl).then((resolvedUrl) => {
if (resolvedUrl !== queryUrl) {
queryUrl = resolvedUrl
// 同步更新 sessionStorage 缓存
sessionStorage.setItem(STORAGE_KEY, resolvedUrl)
console.log("[OfferPie] 摩卡平台链接已替换为原始来源:", resolvedUrl)
}
}).catch((err) => {
console.warn("[OfferPie] 查询岗位信息失败:", err)
// 查询岗位信息
findJobBySourceUrl(queryUrl).then((data) => {
console.log("[OfferPie] 岗位信息:", data)
if (data && data.id) {
setJobInfo(data)
// 查到岗位后缓存当前查询成功的 URL
sessionStorage.setItem(STORAGE_KEY, queryUrl)
// 自动打开面板
if (!autoOpenedRef.current) {
autoOpenedRef.current = true
setVisible(true)
}
} else if (!cachedUrl) {
// 当前 URL 和缓存都没查到,不自动打开
console.log("[OfferPie] 当前页面未匹配到岗位信息")
}
}).catch((err) => {
console.warn("[OfferPie] 查询岗位信息失败:", err)
})
})
// 如果有缓存 URL 且当前 URL 不同(跳转到了表单页),也自动打开面板