--- title: کامنت‌دونی استاتیک بجای دیسکاس layout: post tags: دیسکاس نتلیفای کامنت‌دونی دیدگاه نظر category: پروژه uuid: 821f0087-e296-49de-bc23-2140df503eed --- در ادامه شرح می‌دهم چرا و چگونه سیستم نظرات وبسایت را از دیسکاس به یک سیستم دست‌ساز تقریبا استاتیک منتقل کرده‌ام. ## چرا تصمیم گرفتم دیسکاس را کنار بگذارم؟ به دو دلیل. اول اینکه دیسکاس بدون قند‌شکن در ایران قابل استفاده نیست. دیگر اینکه دیسکاس زیادی سنگین بود و مقدار زیادی اسکریپت غیرضروری در صفحات بارگزاری می‌کرد. سایت کم ترافیک من را بیهوده سنگین کرده بود و سود چندانی هم نداشت. مهمتر از همه اینها چالش ایجاد کامنت‌دونی استاتیک را دوست داشتم! ## چه آلترناتیوهایی برای دیسکاس وجود دارد؟ استاتیک‌بازهای اینترنت دست به کارهای خلاقانه مختلفی برای داشتن یک کامنت‌دونی استاتیک زده‌اند. راهکارهای موجود روی سه محور اصلی می‌چرخد: - ایمیل دیدگاه‌ها - باز کردن پول‌ریکوئست در گیت‌هاب - اجرای سرور اختصاصی و همچنین: - استفاده از Firebase - صرف نظر از کامنت‌دونی ### ارسال نظر با ایمیل در این روش به کمک ایمیل کاربر نظرش را ارسال می‌کند و وبلاگ‌صاحاب بعدا کامنت‌ها را به وبسایتش اضافه می‌کند. با نوشتن مقداری اسکریپت حتی می‌تواند این فرآیند را تا حدودی خودکار کرد. این روش به نوعی خالص‌ترین روش استاتیک است. برخی افراد از امکانات جیمیل مثل افزودن یک فیلتر بعد از ایمیل استفاده می‌کنند مثلا `john.doe+post42@gmail.com`. ### گیت‌هاب به عنوان کامنت‌دونی برخی افراد از ابزاری بنام [Staticman][استاتیک‌من] استفاده می‌کنند. این برنامه به ازای هر نظر یک پول‌ریکوئست در مخزن وبسایت روی گیت‌هاب ایجاد می‌کند. نحوه تایید نظرات هم این است که وبلاگ‌صاحاب هم می‌تواند پول‌ریکوئست را مرج کند یا نکند. البته امکان مرج خودکار هم هست که در اینصورت نظرات نیاز به تایید ندارند. بعد از مرج سایت از نو ساخته شده و نظرات نمایش داده می‌شود. این برنامه اوپن‌سورس است و هاست رایگان هم دارد. هر کسی می‌تواند خودش هم آنرا هاست کند. ### اجرای یک سرور اختصاصی این روش کم مقداری با روش قبلی همپوشانی دارد. این روش در حقیقت راه انداختن یک دیسکاس شخصی است. از اجرای یک [اسکریپت PHP][اسکریپت] ساده گرفته تا راه‌اندازی سروری کوچک و جمع و جور مثل [isso][ایسو] یا سرور عریض و طویلی مانند [Discourse][دیسکورس]. هرکس بنا به ترافیک و نیاز و سلیقه‌اش یکی را انتخاب می‌کند. البته این لیست کامل نیست و پلاگین‌های جکیل و برنامه‌های ریز و درشت دیگری هم باید باشند (بیشتر ریز البته!) ### استفاده از Firebase [فایربیس][فایربیس] یکی از محصولات شرکت گوگله که ساخت اپلیکیشن‌های serverless رو ساده می‌کنه. یعنی اپلیکیشن موبایل یا وب مستقیما با فایربیس صحبت می‌کنه و می‌تونه از دیتابیس و سایر امکانات اون استفاده کنه. پیاده کردن کامنت‌دونی استاتیک به کمک فایربیس امکانپذیره. مثلا [این پلاگین جکیل][فایرپلاگین] یک کامنت‌دونی به کمک فایربیس می‌سازه. ### صرف نظر از کامنت‌دونی کم نیستند کسانی که از کامنت‌دونی صرف‌نظر می‌کنند و تعامل با خوانندگانشان را به شبکه‌های اجتماعی مانند توئیتر و یا هکرنیوز منتقل می‌کنند. عده‌ای هم که به نهایت بی‌نیازی رسیده‌اند برای دل خودشان می‌نویسند و از هرچه رنگ تعلق پذیرد آزاد شده‌اند و کلا قید کامنت‌دونی را زده‌اند! ## الگوریتم کلی کامنت‌دونی استاتیک مهمترین تمایز کامنت‌دونی استاتیک با داینامیک در اینه که انتشار نظرات با تاخیر همراهه. چرا که سروری گوش به زنگ تغییرات در صفحه و ریفرش کردن اون نیست. اصلا امکان ریفرش کردن صفحه نیست و سایت باید ریبیلد بشه. یعنی مرحله جمع‌آوری نظرات و انتشار نظرات در وبسایت پیوسته نیستند. بنابراین یک کامنت‌دونی استاتیک به شکل زیر کار می‌کند: - جمع‌آوری نظر: ایمیل، گیت‌هاب، سرور شخصی، فایربیس - پردازش نظرات: حذف اسپم، سورت کردن و مانند اینها - تولید وبسایت:‌ ساخت دوباره صفحهات با نظرات بروز شده ## من کدامیک از روش‌های بالا را بکار گرفته‌ام؟ هیچ‌کدام. من یک کامنت‌دونی استاتیک مبتنی بر [نتلیفای][نتلیفای] ساختم. بسیاری از راهکارهایی که دیگران در وبسایت‌های استاتیکشان بکارگرفته‌اند لازمه‌اش اجرا کردن یک برنامه در یک سرور سوم است. من قصد داشتم همه چیز را در سرویس‌دهنده استاتیک وبسایتم خلاصه کنم. مدتی پیش در مورد [Netlify][نتلیفای] نوشتم. من در حال حاضر وبسایت و مدیریت دامنه آن و بیلدسرور آن را به ترتیب از گیت‌هاب و [DNSimple][دی‌ان‌سیمپل] و [ورکر][ورکر] به نتلیفای منتقل کرده‌ام. این تغییر باعث ساده‌سازی قابل توجه وبسایت و روند بیلد کردن آن شده است. نتلیفای امکانی دارد برای ثبت نتایج فرم‌های HTML. یعنی بدون ایجاد سرور جداگانه می‌توان فرم‌هایی در وبسایت گنجاند و نتایج آنها را در کنترل پنل نتلیفای مشاهده کرد. اما نکته اصلی اینجاست که نتلیفای پس از ثبت نظرات می‌تواند یک بیلد تریگر کند یا فرم ثبت شده را به یک آدرس ایمیل ارسال کند یا یک سرویس خارجی را به کمک WebHook صدا بزند. من از این امکان نتلیفای برای ساخت کامنتدونی استفاده کردم. ## طرح کلی کامنت‌دونی من برنامه من سه بخش دارد: 1. جمع‌آوری نظرات ارسالی به کمک نتلیفای 2. پردازش نظرات و کامیت آنها در گیت‌هاب 3. افزودن کامنت‌دونی استاتیک به وبسایت جکیل ### جمع‌آوری به کمک نتلیفای این قسمت از همه ساده‌تر است. کافیست یک فرم HTML در هرکجای صفحه قرار بدهیم و به آن یک برچسب نتلیفای بزنیم: ~~~html
~~~ هر بار که این فرم به سرور ارسال بشود نتلیفای نتیجه آن را ثبت می‌کند. از طریق کنترل پنل و API می‌توان فرم‌ها و ارسال‌ها را مدیریت کرد. ### پردازش نظرات پس از ثبت برای اینکار یک [اسکریپت شل][شل] و یک [اسکریپت پایتون][پایتون] نوشتم. با هر بار ارسال فرم، نتلیفای اسکریپت بیلد را اجرا می‌کند. این اسکریپت کارهای زیر را انجام می‌دهد: 1. پیش‌نیازهای اجرای اسکریپت پایتون را نصب می‌کند. 2. اسکریپت پایتون را جهت استخراج کامنتها از نتلیفای اجرا می‌کند. 3. فایلهای نظرات را به گیت‌هاب اضافه می‌کند. 4. سایت را از نو می‌سازد. از این جهار مرحله فقط گزینه شماره یک و دو به نتلیفای مربوط است و دیگر کاری با آن نداریم. اسکریپت پایتون ما کارهای زیر را انجام می‌دهد: 1. مقادیر ضروری از قبیل توکن نتلیفای و رشته‌ی سرّی را از محیط می‌خواند. 2. لیست نظرات را از نتلیفای دانلود می‌کند. 3. هر نظر را به فرمت مورد نظر وبسایت تبدیل می‌کند. 4. اطلاعاتی خصوصی را رمزنگاری می‌کند. 5. هر نظر را فایل مربوط به صفحه خودش اضافه می‌کند. حالا ما همه کامنت‌ها را به فرمت [YAML][یمل] تبدیل کرده‌ایم. [هر نظر][نمونه] فرمتی اینگونه خواهد داشت: ~~~yaml - bucket: !!binary | Z0FBQUFBQmFSN19RdWxHeU4tcGp5clR2Z2Z5d0ozZkRTRHV0OGtUYnpub1RIZ09qdkpaazVqQXZO bms5QURNQ25hcEp0cHZSaldEN01OaXBJNXQ5dUxRU215RS1HQjhOTlc5WGFEcWdfaG9hYnhpTzV5 RExodlE9 date: 2017-04-12 11:00:06+00:00 email: a84eca4314e52cf150347841e3a17cf1 message:

بسیار عالی جناب صادقی
زحمات شما و دیگر دوستان نادیده‌گرفته نخواهد شد.
ممنون

name: Amir H. page_date: 2017-04-08 00:00:00 +0200 page_id: /13-years-old-bug-fixed page_title: باگ سیزده ساله تعمیر شد page_uuid: 4b4fa077-5001-41b2-bdb3-f9f9638efdb2 website: https://disqus.com/by/firouzian/ ~~~ بیشتر فیلدها گویا هستند. برخی مستقیما از فرم HTML پای همین صفحه آمده‌اند. برخی دیگر به کمک داده‌هایی که نتلیفای در اختیار می‌گذارد ساخته شده‌اند، مثلا آدرس صفحه‌ای که فرم از آنجا ارسال شده است. در مورد فیلد ایمیل و باکت جلوتر شرح می‌دهم. ### افزودن کامنت‌دونی استاتیک به وبسایت جکیل بعد از اجرای اسکریپت مرحله قبل نظرات هر پست درون [فایلهای جداگانه][فایل‌ها] در مخزن وبسایت کامیت می‌شوند. تمام فیلدها را اسکریپت پایتون از دل نتلیفای بیرون کشیده و درون فایل‌ها ذخیره کرده می‌کند. حالا می‌ماند ساخت وبسایت با کامنت‌دونی. من از یک قابلیت جکیل بنام `Data Files` استفاده کردم. این‌ها فایل‌هایی هستند که در دایرکتوری `_data` ذخیره می‌شوند و در قالب می‌توان محتوای آنها را استفاده کرد. من تم وبسایت را طوری تغییر دادم که در صورتی که کامنت‌دونی استاتیک در کانفیگ جکیل فعال شده باشد زیر هر پست یک فرم تولید کند و همچنین از فایل‌ها کامنت‌های مربوط به هر مطلب را به صورت پاراگراف‌هایی قبل از فرم نظرات درج کند. جزئیات را می‌توانید با دیدن سورس همین صفحه بررسی کنید یا [تم][تم] را ببینید. ## چالش‌ها و ایده‌ها مهاجرت به کامنت‌دونی استاتیک پروژه‌ی بزرگی بود و هنوز هم ادامه دارد. مشکلات زیادی داشتم که برخی از آنها را در ادامه می‌آورم. ### استخراج ایمیل‌ها ایمیل باید برای من قابل رویت باشد ولی از دید اسپمرها و سایرین پنهان باشد. از جایی که من دیتابیسی جز مخزن گیت‌هابم ندارم باید چاره‌ای برای این مشکل پیدا می‌کردم. من در دو فیلد ایمیل را ذخیره کرده‌ام. یکبار به صورت هش یکبار رمز. هش هم الگوریتمی یک طرفه است. بنابراین از هش نمی‌توان به ایمیل رسید. من از این هش فقط برای نمایش آواتار به کمک سرویس عالی [گراواتار][گراواتار] استفاده کرده‌ام. اما اگر بخواهم خودم به ایمیل کامنت‌گذار دسترسی پیدا کنم چه؟ برای اینکار من ایمیل را رمز می‌کنم و در فیلد `bucket` ذخیره می‌کنم. فعلا مشکل نشت ایمیل‌ها برطرف شده ولی برای دیدن ایمیل مجبورم به شکل دستی باکت را دیکریپت کنم. ### انتقال کامنتهای قدیمی برای انتقال کامنتهای دیکساس به فرمت جدید یک [اسکریپت][اسکریپت‌دیسکاس] دیگر پایتون نوشتم. کمی دنگ و فنگ داشت ولی کارش را انجام می‌دهد. این اسکریپت فایل XML دانلودی از سایت دیسکاس را تبدیل می‌کند به تعدادی فایل YAML با فرمتی که پیش از این دیدیم. ### حذف راحت اسپم و مدیریت کامنت‌ها هنوز راه حلی ندارم. هر کامنتی مستقیما منتشر می‌شود. البته یک دیوار دفاعی ابتدایی در مقابل اسپم‌های رایج دارد. ### ریپلای راه حلی که برای این موضوع دارم شبیه کار گیت‌هاب است. بجای ریپلای مستقیم به نظرات، با کمک [مارک‌داون][مارک‌داون] می‌توان با کوت کردن نوشته دیگران و قراردادن علامت `@` پیش از نام آنها پاسخی نوشت. ### انتشار به صورت پلاگین در فکر انتشار کارم به صورت یک پلاگین جکیل هستم. طوری که براحتی بتوان آن را در هر وبسایتی مبتنی بر جکیل پیاده کرد. ## نتیجه‌گیری جایگزین کردن دیسکاس با یک کامنت‌دونی خانگی و دست‌ساز برای من کار مفرّحی بود. چیزهایی یاد گرفتم و سایتم سبک‌تر شد. امیدوارم برای دیگران هم مفید باشد و اگر وبسایت استاتیک دارید به دردتان بخورد. اگر این نوشته را دوست داشتید نظر بدهید یا آن را با دوستانتان به اشتراک بگذارید. [استاتیک‌من]: https://staticman.net/ [اسکریپت]: https://github.com/mpalmer/jekyll-static-comments/blob/master/commentsubmit.php [ایسو]: https://posativ.org/isso/ [دیسکورس]: https://www.discourse.org/ [فایربیس]: http://firebase.google.com/ [فایرپلاگین]: https://github.com/mimming/firebase-jekyll-comments [نتلیفای]: /netlify.html [دی‌ان‌سیمپل]: http://dnsimple.com/ [ورکر]: /wercker-intro.html [شل]: https://github.com/mehdisadeghi/mehdix.ir/blob/master/build.sh [پایتون]: https://github.com/mehdisadeghi/mehdix.ir/blob/master/rebuild_comments.py [فایل‌ها]: https://github.com/mehdisadeghi/mehdix.ir/tree/master/_data/comments [یمل]: http://yaml.org/ [نمونه]: https://github.com/mehdisadeghi/mehdix.ir/blob/master/_data/comments/13-years-old-bug-fixed.yml [گراواتار]: https://en.gravatar.com/ [تم]: https://github.com/mehdisadeghi/jekyll-theme-mehdix-rtl/blob/master/_includes/static_comments.html [اسکریپت‌دیسکاس]: https://github.com/mehdisadeghi/mehdix.ir/blob/master/disqus_converter.py [مارک‌داون]: http://commonmark.org/help/