将您的 dev.to 帖子拉到本地

朋友们!系好安全带!这是一篇元帖子,因为我是在 dev.to 上写的,但我将向您展示我如何将 dev.to 上的所有文章本地拉到我制作的新布里奇敦网站中!(其中可能有一个博客......谁知道......)

第一步,创建一个文件来运行脚本。我将在这里使用 Ruby,但您可以随意使用您喜欢的任何语言。

首先,让我们来看看我写过的所有文章。请随意更改username以匹配您的 dev.to 用户名。

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-comment-color)">#!/usr/bin/env ruby</span>

<span style="color:var(--syntax-text-color)">require</span> <span style="color:var(--syntax-string-color)">"json"</span>
<span style="color:var(--syntax-text-color)">require</span> <span style="color:var(--syntax-string-color)">"net/http"</span>
<span style="color:var(--syntax-text-color)">require</span> <span style="color:var(--syntax-string-color)">"time"</span>

<span style="color:var(--syntax-text-color)">username</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">"konnorrogers"</span>

<span style="color:var(--syntax-text-color)">json</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-declaration-color)">JSON</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">parse</span><span style="color:var(--syntax-text-color)">(</span>
  <span style="color:var(--syntax-declaration-color)">Net</span><span style="color:var(--syntax-error-color)">::</span><span style="color:var(--syntax-declaration-color)">HTTP</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">get</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-declaration-color)">URI</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"https://dev.to/api/articles?username
=</span><span style="color:var(--syntax-string-color)">#{</span><span style="color:var(--syntax-text-color)">username</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">))</span>
<span style="color:var(--syntax-text-color)">)</span>
</code></span></span>

做对了吗?!

不完全的!我们仍然需要遍历所有文章并收集我们需要的内容。为了帮助探索 dev.to API,您可以将返回 JSON 写入如下文件:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">filename</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">"./articles.json"</span>
<span style="color:var(--syntax-declaration-color)">File</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">write</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">filename</span><span style="color:var(--syntax-text-color)">,</span>
  <span style="color:var(--syntax-declaration-color)">JSON</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">pretty_generate</span><span style="color:var(--syntax-text-color)">(</span>
    <span style="color:var(--syntax-declaration-color)">JSON</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">parse</span><span style="color:var(--syntax-text-color)">(</span>
      <span style="color:var(--syntax-declaration-color)">Net</span><span style="color:var(--syntax-error-color)">::</span><span style="color:var(--syntax-declaration-color)">HTTP</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">get</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-declaration-color)">URI</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"https://dev.to/api/articles?username
=</span><span style="color:var(--syntax-string-color)">#{</span><span style="color:var(--syntax-text-color)">username</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">))</span>
    <span style="color:var(--syntax-text-color)">)</span>
  <span style="color:var(--syntax-text-color)">).</span><span style="color:var(--syntax-name-color)">to_s</span>
<span style="color:var(--syntax-text-color)">)</span>
</code></span></span>

不过,我已经完成了这一部分,并且知道我的Bridgetown站点需要什么,但请随意使用上面的代码片段来探索 API。我们使用pretty_generateJSON,这样它更容易阅读。

无论如何,当查看返回的数据时,我们不会得到包含body_markdown我们帖子的原始降价的数据。我们需要做的是循环遍历所有“文章”,然后获取body_markdown每一篇文章的属性。

开始了:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">json</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">each</span> <span style="color:var(--syntax-declaration-color)">do</span> <span style="color:var(--syntax-error-color)">|</span><span style="color:var(--syntax-text-color)">obj</span><span style="color:var(--syntax-error-color)">|</span>
  <span style="color:var(--syntax-text-color)">title</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">obj</span><span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-string-color)">"title"</span><span style="color:var(--syntax-text-color)">]</span>

  <span style="color:var(--syntax-comment-color)"># turn anything thats not a number or letter into a hyphen, then squash reoccurring hypens into 1</span>
  <span style="color:var(--syntax-comment-color)"># Example: </span>
  <span style="color:var(--syntax-comment-color)">#   "How can I pull my data from dev.to?"</span>
  <span style="color:var(--syntax-comment-color)">#=> "how-can-i-pull-my-data-from-dev-to"</span>
  <span style="color:var(--syntax-text-color)">file_title</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">title</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">downcase</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">gsub</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">/[^0-9a-z]/i</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">"-"</span><span style="color:var(--syntax-text-color)">).</span><span style="color:var(--syntax-name-color)">split</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">/-+/</span><span style="color:var(--syntax-text-color)">).</span><span style="color:var(--syntax-name-color)">join</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"-"</span><span style="color:var(--syntax-text-color)">)</span>

  <span style="color:var(--syntax-comment-color)"># Produces a string like this: 2023-06-20 17:24:40 -0400</span>
  <span style="color:var(--syntax-text-color)">date</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-declaration-color)">Time</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">parse</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">obj</span><span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-string-color)">"published_at"</span><span style="color:var(--syntax-text-color)">]).</span><span style="color:var(--syntax-name-color)">to_s</span>

  <span style="color:var(--syntax-comment-color)"># Pulls only yyyy-mm-dd</span>
  <span style="color:var(--syntax-text-color)">file_date</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">date</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">split</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">" "</span><span style="color:var(--syntax-text-color)">).</span><span style="color:var(--syntax-name-color)">first</span>

  <span style="color:var(--syntax-comment-color)"># produces a path like this:</span>
  <span style="color:var(--syntax-comment-color)"># "src/_posts/2023-06-20-pulling-your-devto-posts-down-locally.md"</span>
  <span style="color:var(--syntax-text-color)">file_path</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">"src/_posts/</span><span style="color:var(--syntax-string-color)">#{</span><span style="color:var(--syntax-text-color)">file_date</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">-</span><span style="color:var(--syntax-string-color)">#{</span><span style="color:var(--syntax-text-color)">file_title</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">.md"</span>

  <span style="color:var(--syntax-comment-color)"># don't waste an API call!</span>
  <span style="color:var(--syntax-declaration-color)">next</span> <span style="color:var(--syntax-declaration-color)">if</span> <span style="color:var(--syntax-declaration-color)">File</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">exist</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">file_path</span><span style="color:var(--syntax-text-color)">)</span>

  <span style="color:var(--syntax-text-color)">description</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">obj</span><span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-string-color)">"description"</span><span style="color:var(--syntax-text-color)">]</span>

  <span style="color:var(--syntax-comment-color)"># Comma separated string</span>
  <span style="color:var(--syntax-text-color)">categories</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">obj</span><span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-string-color)">"tags"</span><span style="color:var(--syntax-text-color)">]</span>

  <span style="color:var(--syntax-text-color)">article_path</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">obj</span><span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-string-color)">"path"</span><span style="color:var(--syntax-text-color)">]</span>
  <span style="color:var(--syntax-text-color)">article_url</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-declaration-color)">URI</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"https://dev.to/api/articles</span><span style="color:var(--syntax-string-color)">#{</span><span style="color:var(--syntax-text-color)">article_path</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">)</span>

  <span style="color:var(--syntax-comment-color)"># One second seems to be the secret sauce to get around rate limiting.</span>
  <span style="color:var(--syntax-text-color)">sleep</span> <span style="color:var(--syntax-literal-color)">1</span>

  <span style="color:var(--syntax-comment-color)"># We can't get the info we need from the initial API call so we need to go to the article_url</span>
  <span style="color:var(--syntax-comment-color)"># to get the raw markdown.</span>
  <span style="color:var(--syntax-text-color)">article_json</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-declaration-color)">JSON</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">parse</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-declaration-color)">Net</span><span style="color:var(--syntax-error-color)">::</span><span style="color:var(--syntax-declaration-color)">HTTP</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">get</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">article_url</span><span style="color:var(--syntax-text-color)">))</span>
  <span style="color:var(--syntax-text-color)">body_markdown</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">article_json</span><span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-string-color)">"body_markdown"</span><span style="color:var(--syntax-text-color)">]</span>

  <span style="color:var(--syntax-text-color)">content</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">"---</span><span style="color:var(--syntax-literal-color)">\n</span><span style="color:var(--syntax-string-color)">"</span>
  <span style="color:var(--syntax-text-color)">content</span> <span style="color:var(--syntax-error-color)"><<</span> <span style="color:var(--syntax-string-color)">"title: "</span><span style="color:var(--syntax-comment-color)">#{title}\n\""</span>
  <span style="color:var(--syntax-text-color)">content</span> <span style="color:var(--syntax-error-color)"><<</span> <span style="color:var(--syntax-string-color)">"categories: </span><span style="color:var(--syntax-string-color)">#{</span><span style="color:var(--syntax-text-color)">categories</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-literal-color)">\n</span><span style="color:var(--syntax-string-color)">"</span>
  <span style="color:var(--syntax-text-color)">content</span> <span style="color:var(--syntax-error-color)"><<</span> <span style="color:var(--syntax-string-color)">"date: </span><span style="color:var(--syntax-string-color)">#{</span><span style="color:var(--syntax-text-color)">date</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-literal-color)">\n</span><span style="color:var(--syntax-string-color)">"</span>
  <span style="color:var(--syntax-text-color)">content</span> <span style="color:var(--syntax-error-color)"><<</span> <span style="color:var(--syntax-string-color)">"description: "</span><span style="color:var(--syntax-error-color)">|</span><span style="color:var(--syntax-text-color)">\</span><span style="color:var(--syntax-text-color)">n</span>  <span style="color:var(--syntax-comment-color)">#{description}\n\""</span>
  <span style="color:var(--syntax-text-color)">content</span> <span style="color:var(--syntax-error-color)"><<</span> <span style="color:var(--syntax-string-color)">"---</span><span style="color:var(--syntax-literal-color)">\n\n</span><span style="color:var(--syntax-string-color)">"</span>
  <span style="color:var(--syntax-text-color)">content</span> <span style="color:var(--syntax-error-color)"><<</span> <span style="color:var(--syntax-text-color)">body_markdown</span>

  <span style="color:var(--syntax-declaration-color)">File</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">write</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">file_path</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">content</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">mode: </span><span style="color:var(--syntax-string-color)">"w"</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-declaration-color)">end</span>
</code></span></span>

现在让我们运行脚本并观看奇迹的发生。这可能需要一段时间,因为 dev.to 的速率限制为每秒 1 次 API 调用,因此如果您有 60 个帖子,大约需要 1 分钟才能收集所有文件。

ruby my-script.rb

这就是它对我的影响!

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>src/_posts/2023-06-13-inserting-a-string-on-the-first-line-of-every-file-with-vim.md
src/_posts/2023-06-07-maintain-scroll-position-in-turbo-without-data-turbo-permanent.md
src/_posts/2023-05-30-button-to-vs-link-to-and-the-pitfalls-of-data-turbo-method.md
src/_posts/2023-05-22-rails-frontend-bundling-which-one-should-i-choose.md
src/_posts/2023-05-22-revisiting-box-sizing-best-practices.md
src/_posts/2023-04-08-how-to-keep-a-persistent-class-on-a-litelement.md
src/_posts/2022-11-22-jest-vitest-and-webcomponents.md
src/_posts/2022-10-20-actiontext-all-the-ways-to-render-an-actiontext-attachment.md
src/_posts/2022-10-10-actiontext-safe-listing-attributes-and-tags.md
src/_posts/2022-10-04-actiontext-modify-the-rendering-of-activestorage-attachments.md
src/_posts/2022-07-20-why-we-still-bundle-with-http-2-in-2022.md
src/_posts/2022-04-08-testing-scopes-with-rails.md
src/_posts/2022-04-07-adding-additional-actions-to-trix.md
src/_posts/2022-03-13-converting-a-callback-to-a-promise.md
src/_posts/2022-03-10-escaping-the-traditional-rails-form.md
src/_posts/2022-02-21-adding-text-alignment-to-trix.md
src/_posts/2022-01-29-modifying-the-default-toolbar-in-trix.md
src/_posts/2022-01-29-exploring-trix.md
src/_posts/2021-11-30-cross-browser-vertical-slider-using-input-type-range.md
src/_posts/2021-11-01-rebuilding-activestorage-first-impressions.md
src/_posts/2021-10-27-why-jest-is-not-for-me.md
src/_posts/2021-10-06-frontend-bundler-braindump.md
src/_posts/2021-07-08-writing-code-block-highlighting-to-a-css-file-with-rouge.md
src/_posts/2021-07-06-creating-reusable-flashes-in-rails-using-shoelace.md
src/_posts/2021-07-03-pulling-down-somebody-s-fork-with-git.md
src/_posts/2021-07-02-fixing-fatal-error-ineffective-mark-compacts-near-heap-limit-allocation-failed-javascript-heap-out-of-memory-in-webpacker.md
src/_posts/2021-07-02-migrating-hls-videos-to-mp4-format-in-rails.md
src/_posts/2021-06-25-querying-activestorage-attachments.md
src/_posts/2021-05-25-case-switch-statement-in-ruby.md
src/_posts/2021-05-15-arel-notes.md
</code></span></span>

祝你好运,希望这能给你一些动力去重新整理你的自托管博客!我个人一直在 dev.to 上写作,因为我的旧博客网站是一个已有 4 年历史的 Gatsby 网站,我对再次运行的希望完全为零。所以这是新的开始!🥂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值