• 技术
  • 如何将 Flarum 论坛内容,主动推送至百度

Flarum 是一款优雅简洁论坛软件,让在线交流变得更加轻松愉快。Flarum 基于 PHP 构建,因此很容易安装部署;2021 年 5 月底,正式版已经发布。如果您基于 Flarum 搭建中文论坛,为缩短(百度)爬虫发现网站链接的时间,可向百度,主动发起「资源提交」;本文就如何将 Flarum 论坛内容主动推送百度,做下分享。

要实现这一点,步骤非常简单,只需两步即可:

  1. 获取到您论坛所有文档 or Tag 的 url 链接,按照每行一条的格式,写入一个文本文件中,命名此文件为 urls.txt;
  2. 在该 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)
}

您可能感兴趣的文章

轩帅 changed the title to 如何将 Flarum 论坛内容,主动推送至百度.
Write a Reply...