Flarum 是一款优雅简洁论坛软件,让在线交流变得更加轻松愉快。Flarum 基于 PHP 构建,因此很容易安装部署;2021 年 5 月底,正式版已经发布。如果您基于 Flarum 搭建中文论坛,为缩短(百度)爬虫发现网站链接的时间,可向百度,主动发起「资源提交」;本文就如何将 Flarum 论坛内容主动推送百度,做下分享。
要实现这一点,步骤非常简单,只需两步即可:
- 获取到您论坛所有文档 or Tag 的 url 链接,按照每行一条的格式,写入一个文本文件中,命名此文件为 urls.txt;
- 在该 urls.txt 文件所在目录,执行
百度搜索资源平台
所提供的推送命令(推荐 curl
),如:
curl -H 'Content-Type:text/plain' --data-binary @urls.txt "http://data.zz.baidu.com/urls?site=[YOUR-WEB-SITE-PaTH]&token=YOUR-TOKEN"
主动抓取 Flarum 论坛 url
抓取 Flarum 网站内容,主要是 Discussions,只需递归调用 /api/discussions
API,即可拿到所有路径;如下 Deno 脚本所示,只需在终端调用 deno 运行命令,即可获得。
deno run --unstable --allow-net --allow-write index.ts
// index.ts
const gBaseUrl = 'https://forum.lovejade.cn'
const allUrlsArr: Array<string>= [
`${gBaseUrl}/`,
`${gBaseUrl}/tags`,
`${gBaseUrl}/t/technology`,
]
let allArticleUrlsArr: Array<any>= []
const writeToMdFile = (contentStr: string) => {
Deno.writeTextFile(`./urls.txt`, contentStr)
}
const fetchAllDiscussions = async (url: any) => {
const fetchLinks = (path: string) => {
return fetch(path).
then(response => response.json())
.then(result => result)
}
return await fetchLinks(url).then(async (result: any) => {
const links = result.links
const data = result.data
allArticleUrlsArr = allArticleUrlsArr.concat(data)
if (links && links.next) {
await fetchAllDiscussions(links?.next)
}
})
}
const main = async () => {
const targetUrl: string = `${gBaseUrl}/api/discussions`
await fetchAllDiscussions(targetUrl)
allArticleUrlsArr.map((item: any) => {
allUrlsArr.push(`${gBaseUrl}/d/${item?.attributes?.slug}`)
})
writeToMdFile(allUrlsArr.join('\n'))
}
main()
利用 curl 推送资源至百度
在爬虫生成 urls.txt 文件后,利用 curl 命令将资源推送至百度;当然,这个 token 是需要您从您的「百度搜索资源平台」账号获得。
curl -H 'Content-Type:text/plain' --data-binary @urls.txt "http://data.zz.baidu.com/urls?site=https://forum.lovejade.cn&token=ARYA6688X~Y~ZFQ8866"
当然,也可以将 curl 推送命令,植入 Ts 代码,如此,就能一键完成抓取、生成、推送等任务。具体实现代码所示如下:
const push2baidu = async () => {
const cmd = Deno.run({
cmd: ["curl", '-H', 'Content-Type:text/plain', '--data-binary', '@urls.txt', 'http://data.zz.baidu.com/urls?site=https://forum.lovejade.cn&token=ARYA6688X~Y~ZFQ8866'],
stdout: "piped",
stderr: "piped"
})
const output = await cmd.output()
const rawError = await cmd.stderrOutput();
const { code } = await cmd.status();
if (code === 0) {
await Deno.stdout.write(output);
} else {
const errorString = new TextDecoder().decode(rawError);
console.log(`Something Error @push2baidu :`, errorString)
}
return Promise.resolve(code)
}
您可能感兴趣的文章