Ubuntu 18.04

نحوه ساخت یک ربات Discord با Node.js

Discord یک برنامه چت میباشد که به میلیونها کاربر در سراسر جهان امکان ارسال پیام و گفتگوی صوتی آنلاین را در انجمن هایی به نام guilds یا سرور مجازی ها می دهد. Discord همچنین API گسترده ای را ارائه می دهد که توسعه دهندگان می توانند از آن برای ساختن رباتهای قدرتمند Discord استفاده کنند. رباتها می توانند اقدامات مختلفی مانند ارسال پیام به سرور مجازی ها ، کاربران DM -ing ، سرور مجازی های تعدیل کننده و پخش صوتی را در گپ های صوتی انجام دهند. این به توسعه دهندگان امکان می دهد تا ربات های قدرتمندی را بکار گیرند که شامل ویژگی های پیشرفته و پیچیده ای همچون ابزارهای تعدیل یا حتی بازی ها است. به عنوان مثال ، ربات ابزار Dyno به میلیون ها guilds ارائه می کند و دارای ویژگی های مفیدی مانند محافظت در برابر اسپم ، پخش کننده موسیقی و سایر کارکردها است. یادگیری نحوه ایجاد ربات های Discord به شما امکان می دهد بسیاری از امکانات را که روزانه هزاران نفر با آنها ارتباط برقرار می کنند ، به اجرا بگذارید.
در این آموزش ، با استفاده از Node.js و کتابخانه Discord.js ، یک ربات Discord را از ابتدا خواهید ساخت که به کاربران امکان می دهد به طور مستقیم با Discord API ارتباط برقرار کنند. یک پروفایل برای ربات Discord تنظیم می کنید ، علائم احراز هویت را برای ربات دریافت می کنید ، و ربات را به پردازش دستورات ، با آرگومان ها ، از کاربران توانمند می کنید.
پیش نیازها
قبل از شروع کار به موارد زیر نیاز خواهید داشت:
⦁ Node.js بر روی دستگاه توسعه شما نصب شده باشد. برای نصب این مورد روی macOS یا Ubuntu 18.04 ، مراحل نحوه نصب Node.js و ایجاد محیط توسعه محلی را در macOS یا نصب با استفاده از یک بخش PPA در مقاله نحوه نصب Node.js در اوبونتو 18.04 دنبال کنید.
⦁ هر ویرایشگر متن مورد نظر شما ، از جمله ویژوال استودیو کد ، Atom ، Sublime یا Nano.
⦁ یک حساب Discord رایگان با یک ایمیل تأیید شده و یک سرور مجازی  Discord رایگان که برای تست ربات Discord خود استفاده خواهید کرد.
مرحله 1 – راه اندازی یک ربات Discord
در این مرحله ، از رابط کاربری گرافیکی Discord استفاده می کنید تا یک ربات Discord را تنظیم کنید و نشانه ربات را دریافت کنید ، که به برنامه خود منتقل خواهید کرد.
برای ثبت ربات در پلتفرم Discord از داشبورد برنامه Discord استفاده کنید. در اینجا توسعه دهندگان می توانند برنامه های Discord از جمله رباتهای Discord را ایجاد کنند.

برای شروع ، روی New Application کلیک کنید. Discord از شما می خواهد که نام خود را برای برنامه جدید خود وارد کنید. سپس بر روی Create  کلیک کنید تا برنامه ایجاد شود.

توجه: نام برنامه شما از نام ربات مستقل است ، و لازم نیست که بات همان نام برنامه را داشته باشد.
اکنون داشبورد برنامه خود را باز کنید. برای افزودن ربات به برنامه ، به سربرگ Bot  در نوار پیمایش در سمت چپ بروید.

برای افزودن یک ربات به برنامه ، روی دکمه Add Bot کلیک کنید. هنگامی که تأیید شما را خواست ، روی Yes کلیک کنید. سپس وارد داشبورد خواهید شد که حاوی جزئیاتی از نام ربات ، نشانه احراز هویت و تصویر پروفایل شما است.

می توانید نام یا عکس پروفایل ربات خود را در اینجا روی داشبورد تغییر دهید. همچنین باید با کلیک بر روی گزینه Reveal Token و کپی کردن نشانه ای که ظاهر می شود ، رمز تصدیق ربات را کپی کنید.
اخطار: هرگز نشانه ربات خود را به اشتراک نگذارید و بارگذاری نکنید زیرا این امکان را به همه می دهد که وارد ربات شما شوند.
حال باید یک لینک دعوت ایجاد کنید که به شما امکان می دهد guilds  ربات Discord را اضافه کنید که در آن می توانید ربات را آزمایش کنید. ابتدا به تب OAuth2 داشبورد برنامه بروید. برای ایجاد لینک دعوت ، به پایین بروید و bot  را از گزینه های scopes انتخاب کنید. همچنین باید مجوزهایی را برای کنترل آنچه که ربات شما می تواند در guilds انجام دهد تعیین کنید. برای اهداف این آموزش ، Administrator را انتخاب کنید ، که به ربات شما اجازه می دهد تقریباً تمام اقدامات در guilds را انجام دهد. پیوند را با دکمه Copy کپی کنید.

سپس ، ربات را به یک سرور مجازی اضافه کنید. لینک دعوت خود را که تازه ایجاد کرده اید دنبال کنید. می توانید ربات را به منوی کشویی خود به هر سرور مجازی دیگری اضافه کنید یا مجوزهای ادمین را شامل شوید.

اکنون روی Continue کلیک کنید. اطمینان حاصل کنید که تیک باکس کنار Administrator  تیک خورده است – و مجوزهای ادمین را به ربات اعطا می کند. سپس بر روی Authorize کلیک کنید. Discord از شما می خواهد قبل از اینکه ربات به سرور مجازی ملحق شود ، CAPTCHA را حل کنید. اکنون ربات Discord را در لیست اعضاء موجود در سرور مجازی ی که به آن اضافه می کنید ، تحت offline دارید.

در نهایت با موفقیت یک ربات Discord ایجاد کرده و آن را به یک سرور مجازی اضافه کرده اید. در مرحله بعد ، یک برنامه برای ورود به ربات بنویسید.
مرحله 2 – ایجاد پروژه خود
در این مرحله ، محیط برنامه نویسی اصلی را تنظیم خواهید کرد که در آن می توانید ربات خود را بسازید و به طور برنامه ریزی شده به ربات وارد شوید.
ابتدا باید یک پوشه پروژه و فایل های پروژه ضروری برای ربات تنظیم کنید.
پوشه پروژه خود را ایجاد کنید:
⦁ $ mkdir discord-bot

به پوشه پروژه ای که اخیراً ایجاد کرده اید بروید:
⦁ $ cd discord-bot

در مرحله بعدی ، از ویرایشگر متن خود برای ایجاد فایلی با نام config.json برای ذخیره نشانه احراز هویت ربات خود استفاده کنید:
⦁ $ nano config.json

سپس کد زیر را به فایل پیکربندی اضافه کنید ، متن هایلایت شده را با نشان احراز هویت ربات خود جایگزین کنید:
config.json
{
“BOT_TOKEN”: “YOUR BOT TOKEN”
}
فایل را ذخیره کنید و از آن خارج شوید.
در مرحله بعد یک فایل pack.json ایجاد خواهید کرد که جزئیات پروژه و اطلاعات مربوط به متعلقاتی که برای پروژه استفاده خواهید کرد را ذخیره می کند. با اجرای دستور npm زیر ، یک فایل pack.json ایجاد خواهید کرد:
⦁ $ npm init

npm جزئیات مختلفی در مورد پروژه را از شما می خواهد. اگر در مورد تکمیل تنظیم این اعلان ها راهنمایی می خواهید، می توانید مقاله نحوه استفاده از ماژول های Node.js با npm و pack.json را بخوانید.
اکنون بسته discord.js را که برای تعامل با API Discord استفاده خواهید کرد ، نصب خواهید کرد. می توانید discord.js را از طریق npm با دستور زیر نصب کنید:
⦁ $ npm install discord.js

اکنون که فایل پیکربندی را تنظیم کرده و متعلقات لازم را نصب کرده اید ، آماده هستید که ساخت ربات خود را شروع کنید. در یک برنامه واقعی ، یک ربات بزرگ به چندین فایل ها تقسیم می شود ، اما برای اهداف این آموزش ، کد مربوط به ربات شما در یک فایل خواهد بود.
ابتدا فایلی به نام index.js را در پوشه discord-bot برای کد ایجاد کنید:
⦁ $ nano index.js

با درخواست متعلقات discord.js و فایل پیکربندی با نشان ربات ، کدگذاری ربات را شروع کنید:
index.js
const Discord = require(“discord.js”);
const config = require(“./config.json”);

پس از این ، دو خط کد بعدی را اضافه کنید:
index.js

const client = new Discord.Client();

client.login(config.BOT_TOKEN);

فایل خود را ذخیره کنید و از آن خارج شوید.
خط اول کد Discord.Client جدید ایجاد می کند و آن را به کلاینت ثابت اختصاص می دهد. این کلاینت تا حدی نحوه تعامل شما با Discord API است و اینکه چگونه Discord شما را از وقایعی مانند پیام های جدید مطلع می کند. در واقع کلاینت ، نماینده ربات Discord است.
خط دوم کد از روش login روی کلاینت برای ورود به ربات Discord که ایجاد کرده اید ، استفاده می کند و از توکن موجود در فایل config.json به عنوان رمز عبور استفاده می کند. توکن بهAPI Discord اطلاع می دهد که برنامه برای کدام بوت است و شما برای استفاده از ربات مجاز هستید.
اکنون ، فایل index.js را با استفاده از Node اجرا کنید:
⦁ $ node index.js

وضعیت ربات شما به صورت آنلاین در سرور مجازی Discord که به آن اضافه کردید تغییر خواهد کرد.

شما با موفقیت یک محیط برنامه نویسی تنظیم کرده اید و کد اصلی را برای ورود به یک ربات Discord ایجاد کرده اید. در مرحله بعد دستورات کاربر را کنترل خواهید کرد و ربات خود را برای انجام کارهایی مانند ارسال پیام دریافت خواهید کرد.
مرحله 3 – رسیدگی به اولین دستور کاربر
در این مرحله شما یک ربات ایجاد خواهید کرد که بتواند دستورات کاربر را کنترل کند. اولین فرمان ping خود را پیاده سازی خواهید کرد ، که با “pong” و زمان لازم برای پاسخ به دستور، جواب خواهد داد.
ابتدا باید پیامهایی را که کاربران ارسال می کنند شناسایی و دریافت کنید تا بتوانید هر فرمانی را پردازش کنید. با استفاده از روش on در کلاینت Discord ، Discord یک اعلان درباره رویدادهای جدید برای شما ارسال می کند. روش on دو آرگومان دریافت می کند: نام یک رویدادی که باید برای آن منتظر بمانید و یک تابع برای اجرا در هر زمانی که این رویداد اتفاق می افتد. با استفاده از این روش می توانید منتظر پیام رویداد باشید – هربار که یک پیام به guild  ارسال می شود که در آن ربات مجاز به مشاهده پیام ها است ، این رویداد رخ می دهد. بنابراین بیایید یک تابع ایجاد کنیم ، که هر بار یک پیام برای پردازش دستورات ارسال میشود، اجرا گردد.
ابتدا فایل خود را باز کنید:
⦁ $ nano index.js

کد زیر را به فایل خود اضافه کنید:
index.js

const client = new Discord.Client();

client.on(“message”, function(message) {

});

client.login(config.BOT_TOKEN);

این عملکرد که در رویداد message  اجرا می شود ، message  را به عنوان یک پارامتر در نظر می گیرد. message  مقدار نمونه پیام Discord.js را شامل می شود ، که حاوی اطلاعاتی در مورد پیام ارسال شده و روش هایی برای کمک به ربات در پاسخگویی است.
اکنون خط کد زیر را به تابع مدیریت فرمان خود اضافه کنید:
index.js

client.on(“message”, function(message) {
if (message.author.bot) return;
});

این خط بررسی می کند که نویسنده پیام یک ربات است یا خیر و اگر چنین باشد ، پردازش دستور را متوقف می کند. این مسئله از آن جهت مهم است که شما نمی خواهید پیام های ربات ها را پردازش کنید یا پاسخ دهید. ربات ها معمولاً نیازی به استفاده از ربات ما ندارند از این رو ، نادیده گرفتن پیام های آنها قدرت پردازش را بیشتر می کند و از جلوگیری از پاسخ های تصادفی جلوگیری می کند.
اکنون یک مدیر فرمان خواهید نوشت. برای تحقق این امر ، خوب است که فرمت معمول یک دستور Discord را بدانید. به طور معمول ، ساختار دستور Discord شامل سه قسمت به ترتیب زیر است: پیشوند ، نام فرمان و (بعضی اوقات) آرگومان های فرمان.

• پیشوند: پیشوند می تواند هر چیزی باشد ، اما به طور معمول یک قطعه علامت گذاری یا عبارت انتزاعی است که به طور معمول در ابتدای پیام نمی باشد. این بدان معناست که وقتی پیشوند را در ابتدای پیام وارد کنید ، ربات می داند که هدف این دستور پردازش آن توسط ربات است.
• نام فرمان: نام دستوری که کاربر می خواهد از آن استفاده کند. این بدان معناست که ربات می تواند از چندین دستور با قابلیت های مختلف پشتیبانی کند و به کاربران اجازه دهد با تهیه نام فرمان دیگری بین آنها انتخاب کنند.
• آرگومان ها: گاهی اوقات در صورتی که دستور نیاز به اطلاعات اضافی از کاربر داشته باشد، کاربر می تواند آرگومان ها را پس از نام فرمان ارائه کند و هر آرگومان با یک فاصله از هم جدا شود.
توجه: هیچ ساختار فرمان اجباری وجود ندارد و رباتها می توانند دستورات مورد نظر خود را پردازش کنند ، اما ساختار ارائه شده در اینجا یک ساختار کارآمد است که اکثریت قریب به اتفاق رباتها از آن استفاده می کنند.
برای شروع ایجاد یک پارسر فرمان که این فرمت را به عهده دارد ، خطوط کد زیر را به تابع مدیریت پیام اضافه کنید:
index.js

const prefix = “!”;

client.on(“message”, function(message) {
if (message.author.bot) return;
if (!message.content.startsWith(prefix)) return;
});

خط اول کد را برای اختصاص مقدار “!” به پیشوند prefix اضافه می کنید ، که به عنوان پیشوند ربات استفاده خواهید کرد.
خط دوم کد بررسی می کند که آیا محتوای پیامی که ربات پردازش می کند ، با پیشوند تنظیم شده شروع می شود و اگر اینگونه نباشد ، پیام را برای ادامه پردازش متوقف می کند.
حال باید بقیه پیام را به یک اسم فرمان و هر آرگومان موجود در پیام تبدیل کنید. خطوط هایلایت شده زیر را اضافه کنید:
index.js

client.on(“message”, function(message) {
if (message.author.bot) return;
if (!message.content.startsWith(prefix)) return;

const commandBody = message.content.slice(prefix.length);
const args = commandBody.split(‘ ‘);
const command = args.shift().toLowerCase();
});

برای حذف پیشوند از محتوای پیام و اختصاص نتیجه به ثابت commandBody از خط اول استفاده می کنید. این امر از آن جهت ضروری است که نمی خواهید پیشوند را در نام فرمان تجزیه شده درج کنید.
خط دوم پیام را با پیشوند حذف شده می گیرد و از روش split با یک اسپیس به عنوان جدا کننده بر روی آن استفاده می کند. این اسپس آن را به آرایه ای از رشته های فرعی تقسیم می کند و در هر جایی که فضایی باشد شکاف ایجاد می کند. در نتیجه آرایه ای حاوی نام دستور به دست می آید ، که در صورت وجود در پیام ، هرگونه آرگومانی موجو میباشد. شما این آرایه را به آرگومان های ثابت اختصاص می دهید.
خط سوم ، عنصر اول را از آرایه args (که همان نام دستور ارائه شده است) حذف می کند ، آن را به حروف کوچک تبدیل می کند ، و سپس آن را به دستور ثابت اختصاص می دهد. این به شما امکان می دهد نام فرمان را جدا کنید و فقط آرگومان هایی را در آرایه بگذارید. همچنین از متد toLowerCase استفاده می کنید زیرا دستورات معمولاً در رباتهای Discord به حروف کوچک و بزرگ حساس نیستند.
شما ساخت یک پارسر فرمان ، اجرای پیشوند موردنیاز و دریافت نام فرمان و هرگونه آرگومان در پیام را انجام داده اید. اکنون کد دستورات خاص را پیاده سازی و ایجاد خواهید کرد.
برای شروع اجرای دستور ping ، کد زیر را اضافه کنید:
index.js

const args = commandBody.split(‘ ‘);
const command = args.shift().toLowerCase();

if (command === “ping”) {

}
});

این دستور if بررسی کند که آیا نام دستوری که شما آن را تجزیه کرده اید (به فرمان ثابت اختصاص داده شده است) با “ping” مطابقت دارد. اگر این گونه بود ، نشان می دهد که کاربر می خواهد از دستور “pong” استفاده کند. شما می توانید کد مربوط به دستور خاص را در داخل بلوک if جای دهید. شما این الگو را برای سایر دستوراتی که می خواهید پیاده سازی کنید ، تکرار خواهید کرد.
اکنون می توانید کد دستور “ping” را پیاده سازی کنید:
index.js

if (command === “ping”) {
const timeTaken = Date.now() – message.createdTimestamp;
message.reply(`Pong! This message had a latency of ${timeTaken}ms.`);
}

فایل خود را ذخیره کنید و از آن خارج شوید.
شما می توانید بلوک فرمان “ping” را اضافه کنید که تفاوت بین زمان فعلی محاسبه شده- با استفاده از روش now در آبجکت تاریخ – و زمانی که پیام ساخته شده است را بر حسب میلی ثانیه محاسبه می کند. در واقع محاسبه می کند که چه مدت طول میکشد که پیام پردازش شود و “ping” ارائه گردد.
خط دوم با استفاده از روش reply در ثابت message  ، به دستور کاربر پاسخ می دهد. روش reply (که به کاربر اطلاع می دهد و پیام را برای کاربر مشخص شده هایلایت می کند) کاربرانی که از این دستور استفاده کرده اند ، و به دنبال آن مطالب ارائه شده به عنوان اولین آرگومان در روش را پیگیری می کند. شما الگویی الفبایی حاوی پیام و ping محاسبه شده را به عنوان پاسخی که از روش reply  استفاده خواهد کرد ارائه می کنید.
نتیجه اجرای فرمان “ping” را به دست میدهد.
ربات خود را با استفاده از دستور زیر اجرا کنید (در همان پوشه ای که index.js):
⦁ $ node index.js

اکنون می توانید از دستور “! ping” در هر کانالی استفاده کنید که ربات می تواند آن را مشاهده کند و پیام دهد ، و در نتیجه پاسخی حاصل می شود.

شما با موفقیت یک ربات ایجاد کرده اید که می تواند دستورات کاربر را کنترل کند و اولین دستور خود را پیاده سازی کرده اید. در مرحله بعد ، با اجرای یک دستور sum ، توسعه ربات خود را ادامه می دهید.
مرحله 4 – اجرای دستور Sum
اکنون با اجرای دستور “! sum” برنامه خود را گسترش می دهید. قبل از بازگشت مجموع همه آرگومان ها به کاربر ، تعداد آرگومان ها را جمع کرده و آنها را با هم جمع می کند.
اگر ربات Discord شما همچنان در حال اجرا است ، می توانید روند آن را با CTRL + C متوقف کنید.
فایل index.js خود را دوباره باز کنید:
⦁ $ nano index.js

برای شروع اجرای دستور “! sum” از یک بلوک else-if استفاده خواهید کرد. پس از بررسی نام فرمان ping ، بررسی می کند که آیا نام فرمان برابر ” sum ” است یا خیر. ما از یک بلوک else-if استفاده می کنیم ، زیرا فقط یک دستور به طور همزمان پردازش می شود ، بنابراین اگر این برنامه با نام فرمان “ping” مطابقت دارد ، لازم نیست که دستور “sum” را بررسی کنید. خطوط هایلایت زیر را به فایل خود اضافه کنید:
index.js

if (command === “ping”) {
const timeTaken = Date.now() – message.createdTimestamp;
message.reply(`Ping! This message had a latency of ${timeTaken}ms.`);
}

else if (command === “sum”) {

}
});

می توانید اجرای دستور “sum” را شروع کنید. کد مربوط به فرمان “sum” در داخل بلوک else-if که شما ایجاد کرده اید ، وارد خواهد شد. اکنون کد زیر را اضافه کنید:
index.js

else if (command === “sum”) {
const numArgs = args.map(x => parseFloat(x));
const sum = numArgs.reduce((counter, x) => counter += x);
message.reply(`The sum of all the arguments you provided is ${sum}!`);
}

شما از روش map در لیست آرگومان ها استفاده می کنید تا با استفاده از عملکرد parseFloat در هر مورد موجود در آرایه args ، یک لیست جدید ایجاد کنید. این یک آرایه جدید ایجاد می کند (مختص ثابت numArgs) که در آن همه موارد به جای رشته ها عدد هستند. این بدان معنی است که بعدا می توانید با اضافه کردن آنها به یکدیگر تعداد اعداد را با موفقیت پیدا کنید.
خط دوم از روش reduce در numArgs ثابت استفاده می کند و تابعی را ارائه می دهد که تمام عناصر موجود در لیست را جمع می کند. شما جمع همه عناصر را در numArgs به sum ثابت اختصاص می دهید.
سپس برای پاسخ دادن به دستور کاربر با الگوی الفبایی ، از روش reply در مورد پیام استفاده می کنید ، که شامل کلیه آرگومانهایی است که کاربر به ربات ارسال می کند.
این کار نتیجه اجرای دستور “sum” است. اکنون ربات را با استفاده از دستور زیر اجرا کنید (در همان پوشه ای که index.jsاست):
⦁ $ node index.js

اکنون می توانید از دستور “! sum” در هر کانالی استفاده کنید که ربات می تواند در آن مشاهده کند و پیام دهد.

در زیر یک نسخه کامل از دیرکتوری اسکریپت های index.js است:
index.js
const Discord = require(“discord.js”);
const config = require(“./config.json”);

const client = new Discord.Client();

const prefix = “!”;

client.on(“message”, function(message) {
if (message.author.bot) return;
if (!message.content.startsWith(prefix)) return;

const commandBody = message.content.slice(prefix.length);
const args = commandBody.split(‘ ‘);
const command = args.shift().toLowerCase();

if (command === “ping”) {
const timeTaken = Date.now() – message.createdTimestamp;
message.reply(`Pong! This message had a latency of ${timeTaken}ms.`);
}

else if (command === “sum”) {
const numArgs = args.map(x => parseFloat(x));
const sum = numArgs.reduce((counter, x) => counter += x);
message.reply(`The sum of all the arguments you provided is ${sum}!`);
}
});

client.login(config.BOT_TOKEN);

در این مرحله ، با اجرای دستور sum ، ربات Discord خود را توسعه داده اید.
نتیجه
یک ربات Discord را با موفقیت پیاده سازی کرده اید که می تواند دستورات مختلف کاربر و آرگومان های فرمان را کنترل کند. اگر می خواهید بات خود را گسترش دهید ، می توانید دستورات بیشتری را اجرا کنید یا قسمت های بیشتری از API Discord را امتحان کنید تا یک ربات قدرتمند Discord را تهیه کنید. می توانید مستندات Discord.js یا مستندات Discord API را مرور کنید تا دانش خود در این مورد گسترش دهید.
در حین ایجاد ربات های Discord ، همیشه باید شرایط خدمات Discord API را در نظر داشته باشید ، که بیانگر نحوه استفاده توسعه دهندگان از API Discord میباشد. همچنین می توانید این مجموعه از دستورالعمل ها را در مورد چگونگی اجرای بهتر ربات Discord بخوانید و نکاتی درباره نحوه طراحی ربات های Discord ارائه دهید. اگر می خواهید در مورد Node.js اطلاعات بیشتری کسب کنید ، مقاله نحوه کد نویسی در مجموعه های Node.js را مطالعه کنید.

 

نحوه میزبانی وب سایت با استفاده از Cloudflare و Nginx در اوبونتو 20.04

چگونه می توان با Stunnel و redis-cli به یک Redis نمونه مدیریت شده از طریق TLS متصل شد

چگونگی توسعه وب سایت Drupal 9 در دستگاه محلی خود با استفاده از Docker و DDEV

نحوه راه اندازی بستگی به سیستم عامل برنامه Eclipse Theia Cloud IDE در اوبونتو 18.04 [Quickstart]

نحوه استفاده از Cron برای خودکارسازی کارها در CentOS 8

نحوه نوشتن کد ناهمگام (غیر همزمان) در Node.js

نحوه تنظیم Mattermost در اوبونتو 20.04

نحوه ساخت یک ربات Discord با Node.js

نحوه پیکربندی Jenkins با SSL با استفاده از پروکسی معکوس Nginx در اوبونتو 20.04

نحوه نصب چهارچوب وب Django در اوبونتو 20.04

 

کلمات کلیدی خرید سرور

خرید vps – خرید سرور مجازی – خرید سرور – سرور هلند – فروش vps – سرور مجازی آمریکا – خریدvps – سرور مجازی هلند – فروش سرور مجازی – سرور آمریکا – vps – سرور مجازی انگلیس – سرور مجازی آلمان – سرور مجازی کانادا – خرید vps آمریکا – خرید وی پی اس – سرور – خرید سرور مجازی هلند – vps خرید – سرور مجازی فرانسه – سرور مجازی هلند – خرید vps آمریکاخرید سرور مجازی ارزان هلندvpsخرید vps هلندخرید سرور مجازی آمریکاخرید vps فرانسهتست vpsسرور مجازی تستسرور مجازی ویندوزارزانترین vpsخرید وی پی اسvps ارزان – 


https://vpsgol.net/product/vps-germany/

https://vpsgol.net/product/vps-usa/

https://vpsgol.net/product/vps-france/

https://vpsgol.net/product/vps-canada/

https://vpsgol.net/product/vps-poland/

https://vpsgol.net/product/vps-netherlands/

https://vpsgol.net/product/vps-england/