وبلاگ نویسی فنی سطح بعدی با Dev.to API

داشتن پلتفرمی مانند DEV در مرکز وبلاگ فنی شما یک گزینه عالی است. با بیش از 1 میلیون کاربر، Dev.to یکی از بزرگترین جوامع توسعه دهندگان است که از نویسندگان و خوانندگان فنی در همه سطوح استقبال می کند.
با این حال، هنگام نوشتن و ارائه محتوا در DEV، همه چیز پیچیده است. با حداقل ویرایشگر آن، احتمالاً مجبور خواهید بود مقدار زیادی کپی پیست و تنظیمات دستی را انجام دهید تا پست خود را از ویرایشگرتان به DEV و سایر پلتفرمهایی که ممکن است بخواهید در آنها پست کنید، مانند Hashnode.
خوشبختانه، پلتفرم اساسی DEV – Forem – دارای یک API عالی است که می توانید از آن برای انتشار و دریافت پست های وبلاگ از DEV به راحتی استفاده کنید. بگذارید به شما نشان دهم که چگونه…
شروع به کار با Forem API
در حال حاضر، 2 نسخه از Forem API موجود است – نسخه 0 و نسخه 1. آنها در فرمت درخواست کمی متفاوت هستند اما نقاط پایانی مشابهی را ارائه می دهند. شما می توانید از یکی از آنها استفاده کنید (هر دو در اسناد رسمی مستند شده اند)، اگرچه توصیه می شود از نسخه جدیدتر استفاده کنید.
برای جابهجایی بین نسخههای مختلف، باید هدرهای HTTP مناسب را ارائه کنید. برای v1، اینها عبارتند از:
API-Key: [your-api-key]
Accept: application/vnd.forem.api-v1+json
Content-Type: application/json
در حالی که برای v0:
API-Key: [your-api-key]
Accept: application/json
Content-Type: application/json
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)
تفاوت اصلی در این است Accept
هدر – باید مشخص کنید application/vnd.forem.api-v1+json
برای فعال کردن نسخه جدیدتر علاوه بر این، برای v0، باید یک معتبر ارائه کنید User-Agent
هدر، در غیر این صورت درخواست شما به نتیجه می رسد 403 Forbidden
خطا مقدار ارائه شده فقط یک نمونه است که من آن را تأیید کردم تا کار کند.
از این مرحله به بعد، من فقط به نسخه 1 ارجاع خواهم داد، اگرچه تمام نقاط پایانی توصیف شده در هر دو نسخه یکسان هستند.
با روشن شدن همه این موارد، تنها چیزی که اکنون نیاز دارید یک کلید API است.
دریافت کلید API شما
برای دریافت کلید API خود باید به انتهای آن بروید برنامه های افزودنی برگه حساب Dev.to شما تنظیمات صفحه در آنجا خواهید دید کلیدهای API انجمن DEV بخش:
توضیحات سفارشی را وارد کنید و کلید API را ایجاد کنید. باید ببینید یک کلید API جدید در لیست ظاهر می شود، از آنجا می توانید آن را کپی کنید.
واکشی مقالات از DEV
اکنون، کارهای زیادی می توانید با این API و نقاط پایانی آن انجام دهید، که همگی کاملاً مستند هستند. بنابراین، به جای خدمت به عنوان مستند دوم، می خواهم در مورد دو مورد از احتمالاً بزرگترین موارد استفاده برای این API صحبت کنم.
اولین مورد این است که از Dev.to به عنوان مرکز محتوای خود استفاده کنید، DEV را مرکز انتشارات برنامه نویسی خود قرار دهید، در حالی که محتوا را در وب سایت خود، مانند یک وبلاگ سفارشی یا صفحه نمونه کارها، ارائه دهید.
مهمترین نقطه پایانی برای این مورد استفاده خواهد بود GET /api/articles/me
، که به شما امکان می دهد تمام مقالات منتشر شده خود را بازیابی کنید. در اینجا نحوه استفاده از آن آورده شده است:
interface DEVArticle {
type_of: string;
id: number;
title: string;
description: string;
published: boolean;
published_at: string;
slug: string;
path: string;
url: string;
comments_count: number;
public_reactions_count: number;
page_views_count: number;
published_timestamp: string;
body_markdown: string;
positive_reactions_count: number;
cover_image: string;
tag_list: string[] | string;
tags?: string[];
canonical_url: string;
reading_time_minutes: number;
user: {
name: string;
username: string;
twitter_username: string | null;
github_username: string | null;
user_id: number;
website_url: string | null;
profile_image: string;
profile_image_90: string;
};
organization?: {
name: string;
username: string;
slug: string;
profile_image: string;
profile_image_90: string;
};
}
interface GetArticlesOptions {
pages?: number;
perPage?: number;
}
const getArticles = async (
options?: GetArticlesOptions
): Promise<DEVArticle[]> => {
const articles: DEVArticle[] = [];
const pages = options?.pages || 1;
const perPage = options?.perPage || 30;
for (let page = 1; page <= pages; page += 1) {
const response = await fetch(
`https://dev.to/api/articles/me?per_page=${perPage}&page=${page}`,
{
method: "https://dev.to/areknawo/GET"https://dev.to/areknawo/,
headers: {
"https://dev.to/areknawo/api-key"https://dev.to/areknawo/: "https://dev.to/areknawo/your-api-key"https://dev.to/areknawo/,
accept: "https://dev.to/areknawo/application/vnd.forem.api-v1+json"https://dev.to/areknawo/,
"https://dev.to/areknawo/content-type"https://dev.to/areknawo/: "https://dev.to/areknawo/application/json"https://dev.to/areknawo/,
},
}
);
const json = await response.json();
articles.push(...json);
}
return articles;
};
getArticles({ pages: 3, perPage: 100 }).then((result) => {
console.log(result);
});
API دارای CORS فعال است، به این معنی که شما باید از آن استفاده کنید getArticles()
توابع از باطن شما. برای درخواست واقعی می توانید از fetch()
تابع، از زمان Node.js نسخه 18 در دسترس است. برای نسخه های قدیمی Node.js، می توانید از a fetch()
کتابخانه سازگار مانند node-fetch.
تبدیل Markdown به HTML
هنگامی که داده های مقاله را در اختیار دارید، احتمالاً باید آن را پردازش کنید body_markdown
به قالب مورد نیاز وب سایت شما، مانند HTML. ابزارهای زیادی وجود دارد که می توانید این کار را با آنها انجام دهید – در اینجا یک مثال با استفاده از Marked.js آورده شده است:
const markdownToHTML = (markdown: string): string => {
const regex = new RegExp(/^.*{%\s?(.+?) (.+?)\s?%}.*(?:\n|$)/);
const getEmbedUrl = (embedType: string, input: string): string => {
switch (embedType) {
case "https://dev.to/areknawo/youtube"https://dev.to/areknawo/:
return `https://www.youtube.com/embed/${input}`;
case "https://dev.to/areknawo/codepen"https://dev.to/areknawo/:
return input.replace(/\/pen\//, "https://dev.to/areknawo//embed/"https://dev.to/areknawo/);
case "https://dev.to/areknawo/codesandbox"https://dev.to/areknawo/:
return `https://codesandbox.io/embed/${input}`;
default:
// etc...
return '"https://dev.to/areknawo/;
}
};
const embedExtension = {
name: "https://dev.to/areknawo/embedExtension"https://dev.to/areknawo/,
level: "https://dev.to/areknawo/block"https://dev.to/areknawo/,
start(src) {
return src.match(/^.*{%/)?.index;
},
tokenizer(src) {
const match = regex.exec(src);
console.log("https://dev.to/areknawo/tokenizer"https://dev.to/areknawo/, src, match);
if (match) {
return {
type: "https://dev.to/areknawo/embedExtension"https://dev.to/areknawo/,
raw: match[0],
embedType: match[1].trim(),
input: match[2].trim(),
tokens: [],
};
}
},
renderer(token) {
return `<iframe src="https://dev.to/areknawo/${getEmbedUrl(
token.embedType,
token.input
)}"></iframe>`;
},
};
marked.use({ gfm: true, extensions: [embedExtension] });
return marked.parse(markdown);
};
در بیشتر موارد، DEV از یک فرمت Markdown استاندارد استفاده می کند که به راحتی توسط Marked.js و پشتیبانی داخلی GitHub Flavored Markdown قابل کنترل است. برای جاسازیها (یعنی برچسبهای مایع)، میتوانید به راحتی Marked.js را با استفاده از سیستم افزونه سفارشی آن گسترش دهید. در بالا نمونه ای از افزونه ای است که تگ های مایع را به تبدیل می کند <iframe>
عناصر، ایجاد URL های مناسب برای جاسازی هایی مانند YouTube، CodePen، یا CodeSandbox. باید بتوانید به راحتی آن را گسترش دهید تا جاسازی هایی را که استفاده می کنید مدیریت کنید.
اگر میخواهید فراتر از واکشی مقالات بروید، Forem API نقاط پایانی مختلفی را ارائه میکند که من شما را تشویق میکنم کاوش کنید. در اینجا چند نمونه هستند:
انتشار در DEV از طریق API
احتمالاً مورد استفاده محبوبتر برای API مانند Forem، انتشار ساده یا خودکار است.
به طور کلی، هنگام نوشتن یک مقاله فنی، کپی پیست زیادی وجود دارد – بین ویرایشگرهای کد و متن مختلف، انتشاراتی مانند DEV یا Hashnode، و احتمالاً حتی یک CMS که وبلاگ سفارشی شما را تقویت می کند. گذراندن کل این فرآیند برای هر مقاله می تواند خسته کننده باشد.
گفته می شود، با برخی از اتوماسیون ها و API های مختلف، می توانید این فرآیند را تا حد زیادی ساده کنید. در مورد Forem API، می توانید از آن استفاده کنید POST /api/articles
ابتدا یک مقاله در DEV منتشر کنید و سپس آن را در صورت نیاز به روز کنید PUT /api/articles/{id}
. در اینجا یک مثال است:
interface DEVArticleInput {
title?: string;
body_markdown?: string;
published?: boolean;
series?: string | null;
main_image?: string | null;
canonical_url?: string | null;
description?: string;
tags?: string[];
organization_id?: number | null;
}
const publishArticle = async (
article: DEVArticleInput
): Promise<DEVArticle> => {
const response = await fetch("https://dev.to/areknawo/https://dev.to/api/articles"https://dev.to/areknawo/, {
method: "https://dev.to/areknawo/POST"https://dev.to/areknawo/,
headers: {
"https://dev.to/areknawo/api-key"https://dev.to/areknawo/: "https://dev.to/areknawo/your-api-key"https://dev.to/areknawo/,
accept: "https://dev.to/areknawo/application/vnd.forem.api-v1+json"https://dev.to/areknawo/,
"https://dev.to/areknawo/content-type"https://dev.to/areknawo/: "https://dev.to/areknawo/application/json"https://dev.to/areknawo/,
},
body: JSON.stringify({
article,
}),
});
const json = await response.json();
return json;
};
const updateArticle = async (
articleId: string | number,
articleUpdate: DEVArticleInput
): Promise<DEVArticle> => {
const response = await fetch(`https://dev.to/api/articles/${articleId}`, {
method: "https://dev.to/areknawo/PUT"https://dev.to/areknawo/,
headers: {
"https://dev.to/areknawo/api-key"https://dev.to/areknawo/: "https://dev.to/areknawo/your-api-key"https://dev.to/areknawo/,
accept: "https://dev.to/areknawo/application/vnd.forem.api-v1+json"https://dev.to/areknawo/,
"https://dev.to/areknawo/content-type"https://dev.to/areknawo/: "https://dev.to/areknawo/application/json"https://dev.to/areknawo/,
},
body: JSON.stringify({
article: articleUpdate,
}),
});
const json = await response.json();
return json;
};
با این دو عملکرد، می توانید به راحتی مقالات خود را در صورت نیاز منتشر و به روز کنید، به عنوان مثال
publishArticle({
title: "https://dev.to/areknawo/Hello, world!"https://dev.to/areknawo/,
body_markdown: "https://dev.to/areknawo/# Hello World\nThis is my first post published through Forem API!"https://dev.to/areknawo/,
published: false,
}).then((article) => {
console.log(article);
});
// Later on
updateArticle("https://dev.to/areknawo/1234567"https://dev.to/areknawo/, {
tags: ["https://dev.to/areknawo/javascript"https://dev.to/areknawo/, "https://dev.to/areknawo/typescript"https://dev.to/areknawo/, "https://dev.to/areknawo/react"https://dev.to/areknawo/, "https://dev.to/areknawo/node"https://dev.to/areknawo/],
series: "https://dev.to/areknawo/Hello World"https://dev.to/areknawo/,
canonical_url: "https://dev.to/areknawo/https://example.com"https://dev.to/areknawo/,
}).then((updatedArticle) => {
console.log(updatedArticle);
});
اکنون، باید ورودی محتوای خود را به یک فرمت Markdown سازگار با DEV تبدیل کنید، تا عملیاتی تا حدودی معکوس نسبت به آنچه قبلاً با Marked.js نشان داده شد، انجام دهید. این احتمالاً به برخی از پردازش های سفارشی نیاز دارد تا به بهترین وجه مناسب مورد استفاده شما باشد.
اکنون، هنگامی که به درستی اجرا شود، چنین اتوماسیون انتشاراتی می تواند تجربه انتشار شما را تا حد زیادی بهبود بخشد. با این حال، این احتمالا به شما کمکی نمی کند که از کپی پیست بین ویرایشگرهای خود فرار کنید.
گفتنی است، اگر به دنبال چیزی هستید که بتواند تجربهای عالی را در کل فرآیند نوشتن فنی شما – از نوشتن و کدنویسی گرفته تا مدیریت محتوا و انتشار – ارائه دهد، ممکن است به آخرین پروژه من – Vrite – علاقه مند شوید. CMS منبع باز بدون سر برای محتوای فنی.
انتشار آسان با Vrite
Vrite چندین ابزار و مفاهیم آشنا را برای همه توسعه دهندگان ترکیب می کند، مانند:
در قالب CMS بدون هد. این یک ترکیب منحصر به فرد است که به نظر من، پتانسیل ارائه بهترین تجربه را در کل فضای نوشتاری فنی دارد. برای جزئیات بیشتر، می توانید راهنمای رسمی را بررسی کنید.
انتشار از طریق Dev.to Extension
ماندن در موضوع Dev.to، آخرین ویژگی Vrite – برنامه های افزودنی – ادغام Vrite با DEV را به آسانی با کلیک بر روی چند دکمه آسان کنید، به شما این امکان را می دهد که به راحتی محتوا را از Vrite به DEV به صورت دستی و به روز رسانی کنید. بطور خودکار.
در حال حاضر، برنامههای افزودنی Vrite یکپارچهسازی آسان با پلتفرمهایی مانند DEV، Hashnode یا Medium را امکانپذیر میکنند و قابلیتهای ویرایشگر Vrite را با قدرت GPT-3.5 OpenAI گسترش میدهند.
راهاندازی یک افزونه آسان است و میتوان از آن انجام داد برنامه های افزودنی پنل کناری:
برای آشنایی بیشتر با افزونه های Vrite می توانید این پست وبلاگ را بررسی کنید.
خط پایین
کارهای زیادی می توانید با API Dev.to انجام دهید. بین واکشی و انتشار محتوا واقعاً همه کاره است و می توان از آن برای رسیدگی به بسیاری از موارد استفاده سفارشی استفاده کرد.
با این حال، اگر به تجربه نوشتن تکنیکی بهتر علاقه دارید، حتما Vrite را امتحان کنید و به من بگویید که در مورد آن چه فکر می کنید و چگونه می توانم آن را بهتر کنم!