- กรณีตัวอย่างของการทำให้เว็บไซต์แบบสแตติกสามารถแสดงคอมเมนต์ได้ด้วย Bluesky API
- Bluesky จัดการ การยืนยันตัวตนบัญชี, การจัดการสแปม, ที่เก็บข้อมูล, การมอดเดอเรชัน ให้ จึงไม่จำเป็นต้องดูแลเซิร์ฟเวอร์แยกต่างหาก
- การพัฒนาประกอบด้วยโค้ด TypeScript ราว 200 บรรทัด และใช้
@bluesky/api กับ Tanstack react-query
- คอมเมนต์จะแสดงในรูปแบบ อ่านอย่างเดียว โดยเชื่อม ID โพสต์ของ Bluesky ไว้ในเมทาดาทาของแต่ละบทความเพื่อโหลดอัตโนมัติ
- เป็นการทดลองที่แสดงให้เห็นถึง ความเป็นไปได้ในการผสานแพลตฟอร์มโซเชียลแบบเปิดเข้ากับบล็อกแบบสแตติก
ที่มาของการทำส่วนคอมเมนต์ด้วย Bluesky
- จุดเริ่มต้นมาจากข้อจำกัดที่ว่าเว็บไซต์แบบสร้างล่วงหน้าโฮสต์ฟังก์ชันคอมเมนต์เองได้ยาก
- คอนเทนต์แบบสแตติกที่เผยแพร่ผ่าน CDN ไม่สามารถเก็บข้อมูลแบบไดนามิกได้
- หากต้องดูแล VPS หรือบริการคลาวด์แยกเอง ก็มีทั้งค่าใช้จ่ายและภาระในการจัดการสูง
- Bluesky เป็น แพลตฟอร์มแบบเปิดบนพื้นฐานของ public API และ AT Protocol ซึ่งมีฟังก์ชันที่จำเป็นต่อการจัดการคอมเมนต์ให้อยู่แล้ว
- Bluesky จัดการการยืนยันตัวตนบัญชี, การกรองสแปม, ที่เก็บข้อมูล และการมอดเดอเรชัน
- ฝั่งบล็อกเพียงแค่เรียก API มาแสดงคอมเมนต์ก็พอ
ทางเลือกอื่นและเหตุผลที่เลือก Bluesky
- มีการพิจารณาทางเลือกอย่าง Twitter, Disqus, giscus (บนพื้นฐาน GitHub Discussions) เป็นต้น
- Bluesky สร้างอยู่บน AT Protocol แบบกระจายศูนย์ จึงมีความเสี่ยงจากการถูกควบคุมโดยบริษัทใดบริษัทหนึ่งน้อยกว่า
- เมื่อเทียบกับแพลตฟอร์มที่อิง GitHub แล้ว Bluesky เหมาะกับการโฮสต์คอมเมนต์มากกว่าในฐานะ แพลตฟอร์มที่เน้นบทสนทนา
วิธีการพัฒนา
- อ้างอิง แพ็กเกจ bluesky-comments ที่ Cory Zue เผยแพร่ไว้ แต่เลือกลงมือทำเอง
- เขียนโค้ดเองเพื่อให้ปรับแต่งให้เข้ากับสไตล์ของเว็บไซต์และรองรับการขยายต่อในอนาคต
- การพัฒนาทั้งหมด รวม UI คอมโพเนนต์และฟังก์ชัน API มีขนาดราว 200 บรรทัด
- ตอนแรกเคยพิจารณาเพิ่มฟังก์ชัน โพสต์ได้โดยตรง ผ่าน OAuth ด้วย แต่ตัดออกเพราะความซับซ้อนของ UI และข้อจำกัดด้านเวลา
- ผลลัพธ์คือทำเฉพาะ ฟังก์ชันแสดงคอมเมนต์แบบอ่านอย่างเดียว
โครงสร้างทางเทคนิค
- เว็บไซต์สร้างด้วย React Server Components และ Parcel
- คอนเทนต์เขียนด้วย MDX จึงสามารถใส่ JavaScript/JSX ได้โดยตรง
- ในอ็อบเจ็กต์
metadata ของแต่ละบทความจะมี bskyPostId เพื่อเชื่อมกับโพสต์ของ Bluesky
- ใช้ Bluesky TypeScript SDK (
@bluesky/api) เพื่อรับข้อมูลเธรดคอมเมนต์จาก เอนด์พอยต์ getPostThread
- คำขอ API ถูกจัดการด้วย Tanstack react-query
- จัดการสถานะ error, loading และ retry ได้อัตโนมัติ
การออกแบบ UI
- ดึงมาเฉพาะ เนื้อหาข้อความ จากผลลัพธ์ตอบกลับของ Bluesky แล้วแสดงเป็น UI คอมเมนต์แบบเรียบง่าย
- โครงสร้างเธรด แยกด้วยการย่อหน้าและเส้นขอบด้านซ้าย
- รูปโปรไฟล์และวันที่โพสต์อ้างอิงดีไซน์ของ Bluesky
- ด้านบนเพิ่มลิงก์ไปยังโพสต์ต้นฉบับบน Bluesky เพื่อ กระตุ้นให้เข้าร่วมบทสนทนา
- ไม่มีฟังก์ชันเขียนคอมเมนต์ ผู้ใช้ต้องไปตอบกลับโดยตรงบน Bluesky
ความเป็นไปได้ในอนาคต
- หากจำเป็น การพัฒนานี้สามารถ เผยแพร่เป็นแพ็กเกจแยกอิสระ ได้
- อย่างไรก็ตาม โค้ดปัจจุบันยังปรับให้เหมาะกับเว็บไซต์ส่วนตัว
- เนื่องจากโครงสร้างไม่ซับซ้อน นักพัฒนาคนอื่นก็สามารถอ้างอิงซอร์สโค้ดแล้วทำตามได้ไม่ยาก
- การเชื่อมคอมเมนต์ผ่าน Bluesky จะช่วยเพิ่ม การมีส่วนร่วม ให้บล็อกได้จริงหรือไม่ ยังต้องรอดู
ปฏิกิริยาจากผู้ใช้ Bluesky
- ผู้ใช้ Bluesky หลายคนแสดงความเห็นเชิงบวก เช่น “ไอเดียดี”, “ตอบสนองเร็ว”, “เหมาะเป็นทางเลือกแทน Disqus”
- บางส่วนตั้งคำถามเกี่ยวกับ การจัดการสแปม, การจัดการคอมเมนต์แบบซ้อน, การรองรับไฟล์แนบ
- ผู้เขียนอธิบายว่าสามารถซ่อนคอมเมนต์บางรายการได้ด้วย ฟังก์ชันมอดเดอเรชันส่วนบุคคล ของ Bluesky
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ถ้าคุณเรนเดอร์บล็อกหรือเว็บไซต์ด้วย static site generator ก็มีข้อเสนอให้ดึงคอมเมนต์มาเป็นไฟล์คอนเทนต์แล้วรวมเข้าไปในขั้นตอน build
.mdหรือ.htmlและกระบวนการนี้ใช้แรงมาก แต่มีข้อดีคือ กันสแปม และ เป็นเจ้าของข้อมูลได้ทั้งหมด
ถ้าไม่อยากใช้ React ก็ลองดู Bluesky comments web component ที่ผมทำไว้ได้
ดูได้ที่ GitHub repository และ theme playground
ปรับแต่ง ธีม ได้ง่ายมาก
ผมนำไอเดียจากโพสต์ต้นฉบับไปทำเป็น ระบบคอมเมนต์บน Mastodon
ดูรายละเอียดได้ในบล็อกโพสต์ของผม
อ้างอิง: บล็อกโพสต์ที่เกี่ยวข้อง
มีคนพูดกันว่าเพราะกฎหมาย คำพูดแสดงความเกลียดชัง ของ EU ถ้าเจ้าของเว็บไม่กรองคอมเมนต์อาจโดนลงโทษ เลยสงสัยว่าจริง ๆ แล้วเป็นอย่างไร
เพราะงั้นผมเลยปิดฟีเจอร์คอมเมนต์ไปเลย
บล็อกของผมเป็นโครงสร้าง static ล้วน และใช้ Cloudflare Worker script แค่ 50 บรรทัด รับคอมเมนต์แล้วเพิ่มลง Markdown โดยตรง
ทำได้โดยไม่ต้อง embed ฟีเจอร์คอมเมนต์เลย
ใช้ Bluesky API เพื่อค้นหาโพสต์แรกที่มีลิงก์บล็อกนั้นโดยอัตโนมัติ แล้วเอามาเชื่อมเป็นคอมเมนต์ก็สามารถ ทำให้เป็นอัตโนมัติ ได้
ดูเหมือนจะช่วยให้ Bluesky เติบโตได้ด้วย เลยลองสร้างแอ็กเคานต์ไว้ทดสอบ มันดูเป็น ไอเดีย growth hacking ที่ค่อนข้างสนุก
ในอุดมคติแล้ว ระบบคอมเมนต์แบบ self-hosted หรือ อิง Fediverse น่าจะยั่งยืนกว่า
บล็อกของผมไม่ได้ดังมาก แต่เมื่อก่อนเคยเจอ นรกของสแปมกับคอมเมนต์เกลียดชัง
เพราะงั้นผมจะไม่เปิดคอมเมนต์ในบล็อกส่วนตัวอีกแล้ว
ต่อให้เป็นระบบบน Bluesky ก็ยังเพิ่ม labeler ของตัวเองเพื่อกรองคอมเมนต์ที่ติดบาง label ได้ เป็น การกลั่นกรองด้วยตัวเอง แบบหนึ่ง
ผมก็ทำอะไรคล้ายกัน โดยนอกจากบล็อกของตัวเองแล้ว ยังเพิ่ม ฟีเจอร์คอมเมนต์ตามสถานที่ใน OSM บน cartes.app ด้วย
สามารถรีวิวด้วยบัญชี ATproto ได้ และข้อมูลถูกเก็บใน PDS ในรูปแบบ JSON ที่ผู้ใช้เป็นเจ้าของ