发布于 2026-01-06 3 阅读
0

Migrating From Medium - A Developer's Guide stackbit-medium-importer Demo Install How to use Importer output

从 Medium 迁移——开发者指南

stackbit-medium-importer

演示

安装

如何使用

导入器输出

从 Medium 大规模迁移到其他平台,催生了许多实用工具,可以帮助您完成迁移。

这些工具主要依赖以下几种方法从 Medium 获取内容

RSS订阅

Medium 提供官方支持的RSS 源,只需/feed/在源 URL 前添加前缀即可访问。

例如 - https://medium.com/feed/@prashantramnyc

<item>
    <title><![CDATA[Difference between var, let and const in Javascript.]]></title>
    <description><![CDATA[<div class="medium-feed-item">...</div>]]></description>
    <link>https://codeburst.io/difference-between-var-let-and-const-in-javascript-fbce2fba7b4?source=rss-eeafca132b1e------2</link>
    <guid isPermaLink="false">https://medium.com/p/fbce2fba7b4</guid>
    <category><![CDATA[codingbootcamp]]></category>
    <category><![CDATA[coding]]></category>
    <category><![CDATA[javascript-tips]]></category>
    <category><![CDATA[programming]]></category>
    <category><![CDATA[javascript]]></category>
    <dc:creator><![CDATA[Prashant Ram]]></dc:creator>
    <pubDate>Tue, 21 May 2019 18:59:39 GMT</pubDate>
    <atom:updated>2019-05-22T14:18:46.943Z</atom:updated>
</item>

优点

  • 官方支持
  • 适用于用户订阅源和发布源。

缺点

  • 仅提供最新文章——这不是检索所有文章的好方法。
  • RSS订阅源不一定包含文章的全部内容——由于RSS的特性,有些文章可能只显示摘要,并提供指向全文的链接。

使用此方法的工具:DEV feed import

JSON API

对于更喜欢冒险的用户,可以检索源和帖子的底层 JSON 结构。

这是通过使用format=jsonurl 参数实现的:

  {  
     "success":true,
     "payload":{  
        "value":{  
           "content":{  
              "subtitle":"Full code example: combining images, watermarking, fonts and text",
              "bodyModel":{  
                 "paragraphs":[  
                    {  
                       "name":"2e10",
                       "type":3,
                       "text":"Image Processing in NodeJS with Jimp",
                       "markups":[ ]
                    },
                    ...
                 ]
              }
           }
        }
     }
  }

请注意,返回的 JSON 数据包含while(1)Medium 设置的防止JSON 劫持的机制。

优点

  • 包含所有可用的帖子和信息
  • 可以自动化

缺点

  • 未记录在案,且可能随时发生重大变更
  • 复杂的 JSON 结构
  • 可能受 Medium 付费墙的限制

使用此方法的工具:gatsby-source-mediummediumexporter

导出文件

您可以申请下载您在 Medium 上的所有信息。提交申请后,您将收到一个链接,指向一个包含以下目录结构的 zip 文件:

blocks
bookmarks
claps
highlights
interests
posts
profile
pubs-following
sessions
topics-following
users-following

每个目录都包含样式和结构都非常简单的 HTML 文件。

posts目录包含您的所有帖子,包括草稿和评论。

优点

  • 官方支持
  • 将您的所有帖子集中在一个易于访问的地方。
  • 还包含用户在迁移到新平台时可能需要的许多其他信息

缺点

  • 需要手动请求 Zip 文件(尽管根据我们的经验,包含链接的电子邮件发送速度非常快)——无法轻易实现自动化。
  • 帖子缺少一些信息——帖子标签不可用,而且很难判断帖子是完整的帖子还是评论。

使用这种方法的工具有:medium-2-mdmedium_to_ghostmedium-to-own-blogexport-medium-to-gatsby、Stackbit!

由于每种方法都有其自身的缺点,工具通常会将它们结合起来以获取所需的所有内容。例如,先导出 zip 文件,然后通过 JSON API 获取更多信息。

在 Stackbit

Stackbit 让创建由包括 Medium 在内的各种数据源支持的现代网站变得极其容易。

在 Stackbit,我们开发了一个工具,用于处理从 Medium 获取的导出文件。它将文章转换为 Markdown 文件,其结构便于我们将其转译成我们支持的任何 SSG 格式。

进口流程如下:

  • 从每篇文章的 HTML 代码中提取信息——标题、缩略图、摘要、图片等。我们使用cheerio直接从 HTML 代码中解析出信息:
  get title() {
      return this.$('title').text().trim();
  }

  get subtitle() {
      return this.$('h4[class*="graf--subtitle"]').text().trim();
  }
  • 下载图片- 按帖子别名分组,并存储在本地
  • 简化 HTML——导出的 HTML 文件非常冗余。我们使用sanitize-html 工具移除不必要的属性和结构元素。这简化了下一步的工作,并有助于我们避免将来对文件格式进行更改。部分信息会被保留并进行处理,以辅助后续步骤。
  • 将文章内容转换为 Markdown 格式,并结合提取的信息导出包含 Markdown 内容的 front matter。我们将外部图片替换为已下载的图片。我们使用Turndown并利用自定义规则来保留 iFrame,例如 Twitter 嵌入:
  turndownService.addRule('twitter-tweet', {
      filter: (node) => {
          return node.nodeName === 'BLOCKQUOTE' &&
                 node.getAttribute('class') === 'twitter-tweet';
      },
      replacement: (innerHTML, node) => node.outerHTML
  });
  • 提取用户资料信息——该profile.html文件包含用户的姓名、电子邮件地址以及已关联到 Medium 的社交媒体账号。我们将这些信息整理成 JSON 结构,以便于使用。

在 Stackbit,输出结果可以合并到我们现有的主题中,并转译为用户选择的 SSG。

该工具已在 GitHub 上发布,并在Stackbit 网站上线。我们一直在努力改进,欢迎您的反馈。

GitHub 标志 stackbithq / stackbit-medium-importer

Stackbit 中型导入器

stackbit-medium-importer

一个小型库,用于将中等大小的导出zip 文件转换为静态站点生成器 (SSG) 友好的 Markdown 文件。

演示

您可以在Stackbit 网站上看到 Medium 导入器的实际运行效果

安装

npm install @stackbit/stackbit-medium-importer

如何使用

该模块附带一个实用程序,可以直接调用导入器。

$ medium-importer
Usage: medium-importer --input-file=<input-file> --output-dir=<output-dir> --concurrency=<concurrency> --download-images=<download-images> --import-drafts=<import-drafts&gt
Options
  --help                 Show help  [boolean]
  --version              Show version number  [boolean]
  --input-file, -i       medium export zip file  [required]
  --output-dir, -o       target folder for the converted files  [required]
  --concurrency, -c      number of posts to process in parallel [default: 1]
  --download-images, -d  should images be downloaded [default: true]
  --import-drafts, -r    should drafts be imported [default: true]
Examples:
  medium-importer -i medium-export.zip -o output/

导入器输出

输出目录会填充导入的数据,其结构便于后续与静态站点生成器 (SSG) 配合使用。对于某些 SSG(例如 Hugo),可以指定……

期待了解你是如何从 Medium 迁移过来的。

文章来源:https://dev.to/stackbit/migration-from-medium-a-developer-s-guide-3djh