import { siteConfig } from '@/lib/config'
import { loadExternalResource } from '@/lib/utils'
import { useRouter } from 'next/router'
import { useEffect } from 'react'
function requestAd() {
const ads = document.getElementsByClassName('adsbygoogle')
const adsbygoogle = window.adsbygoogle
if (adsbygoogle && ads.length > 0) {
for (let i = 0; i <= ads.length; i++) {
try {
const adStatus = ads[i].getAttribute('data-adsbygoogle-status')
if (!adStatus || adStatus !== 'done') {
adsbygoogle.push(ads[i])
}
} catch (e) {}
}
}
}
/**
* 初始化谷歌广告
* @returns
*/
export default function GoogleAdsense() {
const initGoogleAdsense = () => {
loadExternalResource(
`https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=${siteConfig('ADSENSE_GOOGLE_ID')}`,
'js'
).then(url => {
setTimeout(() => {
requestAd()
}, 100)
})
}
const router = useRouter()
useEffect(() => {
// 延迟3秒加载
setTimeout(() => {
initGoogleAdsense()
}, 3000)
}, [router])
return null
}
/**
* 文章内嵌广告单元
* 请在GoogleAdsense后台配置创建对应广告,并且获取相应代码
* 修改下面广告单元中的 data-ad-slot data-ad-format data-ad-layout-key(如果有)
* 添加 可以在本地调试
*/
const AdSlot = ({ type = 'show' }) => {
if (!siteConfig('ADSENSE_GOOGLE_ID')) {
return null
}
// 文章内嵌广告
if (type === 'in-article') {
return (
)
}
// 信息流广告
if (type === 'flow') {
return (
)
}
// 原生广告
if (type === 'native') {
return (
)
}
// 展示广告
return (
)
}
/**
* 嵌入到文章内部的广告单元
* 检测文本内容 出现 关键词时自动替换为广告
* @param {*} props
*/
const AdEmbed = () => {
useEffect(() => {
setTimeout(() => {
// 找到所有 class 为 notion-text 且内容为 '' 的 div 元素
const notionTextElements = document.querySelectorAll('div.notion-text')
// 遍历找到的元素
notionTextElements?.forEach(element => {
// 检查元素的内容是否为 ''
if (element.innerHTML.trim() === '<ins/>') {
// 创建新的 元素
const newInsElement = document.createElement('ins')
newInsElement.className = 'adsbygoogle w-full py-1'
newInsElement.style.display = 'block'
newInsElement.setAttribute('data-ad-client', siteConfig('ADSENSE_GOOGLE_ID'))
newInsElement.setAttribute('data-adtest', siteConfig('ADSENSE_GOOGLE_TEST') ? 'on' : 'off')
newInsElement.setAttribute('data-ad-slot', siteConfig('ADSENSE_GOOGLE_SLOT_AUTO'))
newInsElement.setAttribute('data-ad-format', 'auto')
newInsElement.setAttribute('data-full-width-responsive', 'true')
// 用新创建的 元素替换掉原来的 div 元素
element?.parentNode?.replaceChild(newInsElement, element)
}
})
requestAd()
}, 1000)
}, [])
return <>>
}
export { AdEmbed, AdSlot }