สิ่งที่ต้องเตรียม (Prerequisites)
Node.js (LTS Version)
โหลดและติดตั้ง Node.js เวอร์ชันล่าสุดจาก nodejs.org
VS Code
โปรแกรมเขียนโค้ดที่แนะนำสำหรับ Node.js
ขอ API Key และ Token (เริ่มที่นี่)
ก่อนเขียนโค้ด เราต้องไปขอ "กุญแจ" จากทั้ง 2 ฝั่งมาก่อน เพื่อให้โปรแกรมของเราเข้าไปใช้งานได้
1.1 ขอ Telegram Token
จาก @BotFather
- เข้าแอป Telegram ค้นหา @BotFather (ต้องมีติ๊กถูก)
- กดปุ่ม Start เพื่อเริ่มคุย
- พิมพ์คำสั่ง
/newbotแล้วกดส่ง - เขาจะถามชื่อบอท (Name) ให้ตั้งชื่ออะไรก็ได้ เช่น "My Smart AI"
- เขาจะถาม Username (ต้องจบด้วยคำว่า bot และห้ามซ้ำ) เช่น "smart_ai_99_bot"
- สำคัญ! ก๊อปปี้รหัส HTTP API Token เก็บไว้
ตัวอย่างการคุยกับ BotFather
1.2 ขอ DeepSeek API Key
สมองของ AI
- เข้าเว็บ platform.deepseek.com
- สมัครสมาชิก (Sign up) หรือล็อกอินให้เรียบร้อย
- มองหาเมนู API Keys ที่แถบด้านซ้าย
- กดปุ่ม Create new API key
- ตั้งชื่อ Key (เช่น "My Telegram Bot")
- สำคัญที่สุด! ก๊อปปี้รหัส
sk-...เก็บไว้ทันที (ระบบจะโชว์แค่ครั้งเดียว)
สร้างโปรเจกต์และติดตั้ง Library
เริ่มจากสร้างโฟลเดอร์สำหรับเก็บโค้ด และติดตั้งเครื่องมือที่จำเป็น
1. เปิด Terminal แล้วพิมพ์คำสั่ง:
cd my-ai-bot
npm init -y
คำสั่งนี้จะสร้างโฟลเดอร์ชื่อ my-ai-bot และไฟล์ package.json เพื่อเตรียมเริ่มงาน
2. ติดตั้ง Library ที่ต้องใช้:
- telegraf: ตัวช่วยจัดการ Telegram Bot ที่นิยมที่สุดใน Node.js เขียนง่ายมาก
- axios: ตัวส่งข้อมูลไปหา DeepSeek API (เหมือนบุรุษไปรษณีย์)
- dotenv: ช่วยเก็บรหัสลับ (API Key) ไม่ให้หลุดไปในโค้ด
เก็บกุญแจลับ (Config .env)
นำ Token และ Key ที่ได้จาก ขั้นตอนที่ 1 มาใส่ในไฟล์นี้
DEEPSEEK_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxx # วาง Key จาก DeepSeek ตรงนี้
หากคุณอัปโหลดโค้ดขึ้น GitHub หรือส่งให้เพื่อน การแยกไฟล์
.env ไว้ จะช่วยให้คุณไม่ต้องส่งรหัสลับไปด้วย (อย่าลืมเพิ่ม .env ลงใน .gitignore ถ้าใช้ Git)
เขียนโค้ด Node.js เชื่อมต่อ AI
ให้สร้างไฟล์ชื่อ index.js ไว้ในโฟลเดอร์โปรเจกต์ my-ai-bot (ที่เราสร้างไว้ในขั้นตอนที่ 2)
/my-ai-bot/index.js
จากนั้นก๊อปปี้โค้ดด้านล่างไปวางในไฟล์ index.js ครับ
Flow การทำงานของบอท (Message Flow)
// 1. โหลด Library ที่จำเป็น
require('dotenv').config(); // โหลดค่าจากไฟล์ .env
const { Telegraf } = require('telegraf');
const axios = require('axios');
// 2. ตรวจสอบว่ามี Token ครบไหม
if (!process.env.BOT_TOKEN || !process.env.DEEPSEEK_API_KEY) {
console.error("❌ กรุณาใส่ BOT_TOKEN และ DEEPSEEK_API_KEY ในไฟล์ .env");
process.exit(1);
}
// 3. เริ่มต้นบอท
const bot = new Telegraf(process.env.BOT_TOKEN);
const DEEPSEEK_URL = 'https://api.deepseek.com/chat/completions'; // API Endpoint ของ DeepSeek
// --- ส่วนการทำงานของบอท ---
// เมื่อมีคนพิมพ์ /start
bot.start((ctx) => {
ctx.reply("สวัสดีครับ! 🤖 ผมคือ AI Bot ยินดีรับใช้ครับ ถามอะไรมาได้เลย!");
});
// เมื่อมีข้อความเข้ามา (Event Listener)
bot.on('text', async (ctx) => {
const userMessage = ctx.message.text;
// 4. แสดงสถานะ "กำลังพิมพ์..." ให้ผู้ใช้เห็น (User Experience)
await ctx.sendChatAction('typing');
try {
// 5. ส่งข้อความไปหา DeepSeek API (Request)
const response = await axios.post(
DEEPSEEK_URL,
{
model: "deepseek-chat", // รุ่นของโมเดล AI
messages: [
{ role: "system", content: "คุณคือผู้ช่วยคนไทยที่ฉลาดและสุภาพ ตอบคำถามสั้นกระชับและเข้าใจง่าย" },
{ role: "user", content: userMessage }
],
temperature: 0.7 // ความคิดสร้างสรรค์ (0.0 - 1.0)
},
{
headers: {
'Authorization': `Bearer ${process.env.DEEPSEEK_API_KEY}`,
'Content-Type': 'application/json'
}
}
);
// 6. ดึงคำตอบจาก AI แล้วส่งกลับให้ผู้ใช้
const aiReply = response.data.choices[0].message.content;
await ctx.reply(aiReply);
} catch (error) {
console.error("Error calling AI:", error);
await ctx.reply("ขออภัยครับ ระบบ AI ขัดข้องชั่วคราว 😵💫");
}
});
// 7. เริ่มรันบอท
bot.launch();
console.log("✅ Bot is running...");
// จัดการการปิดโปรแกรมอย่างนุ่มนวล (Graceful Stop)
process.once('SIGINT', () => bot.stop('SIGINT'));
process.once('SIGTERM', () => bot.stop('SIGTERM'));
อธิบายการทำงานของโค้ด:
- async/await: การคุยกับ AI ต้องใช้เวลา (ประมาณ 1-3 วินาที) เราจึงต้องใช้คำสั่งนี้เพื่อบอกโปรแกรมว่า "รอคำตอบก่อนนะ แล้วค่อยทำต่อ" โดยไม่ให้โปรแกรมค้าง
- system role: บรรทัดที่มี
role: "system"คือการสั่งบุคลิกให้ AI รู้ว่าเขาคือใคร ในที่นี้เราสั่งให้เป็น "ผู้ช่วยคนไทยที่สุภาพ" - ctx.reply(): คำสั่งพื้นฐานของ Telegraf ใช้ส่งข้อความกลับไปหาผู้ใช้คนนั้น
แยกส่วนโค้ดอธิบายเพิ่มเติม (Code Breakdown)
🔹 require('dotenv').config()
โหลดค่า environment variables จากไฟล์ .env มาใช้ในโปรแกรม (เก็บรหัสลับ)
🔹 new Telegraf(process.env.BOT_TOKEN)
สร้างบอทจาก Token ที่ได้จาก BotFather (เหมือนการ Log in เข้าสู่ระบบ)
🔹 bot.on('text', async (ctx) => {...})
Event Listener: ฟังว่ามีข้อความเข้ามา พอมีก็ทำงานในวงเล็บ {...}
🔹 ctx.sendChatAction('typing')
แสดงไอคอน "กำลังพิมพ์..." ให้ผู้ใช้เห็น เพื่อประสบการณ์ที่ดี
🔹 axios.post(DEEPSEEK_URL, {...}, {headers: {...}})
ส่ง HTTP Request แบบ POST ไปหา API ของ DeepSeek พร้อม Header Authorization เพื่อยืนยันตัวตน
🔹 response.data.choices[0].message.content
ดึงข้อความที่ AI ตอบกลับมาจาก Response JSON (เหมือนแกะของในกล่อง)
ตัวอย่างการใช้งานบอท (Demo)
รันบอทด้วย PM2 (Production Ready)
ถ้าเรารันด้วยคำสั่ง node index.js พอกดปิดหน้าต่าง บอทก็ดับ
เราจะใช้ PM2 (Process Manager) มาช่วยดูแลบอท ให้ทำงานตลอดเวลา ถ้าบอทล่ม PM2 จะปลุกขึ้นมาใหม่ให้ทันที
ติดตั้ง PM2 (ทำครั้งเดียว)
* -g หมายถึงติดตั้งลงเครื่อง globally ใช้ได้ทุกโปรเจกต์
สั่งรันบอท
แทนที่จะใช้ node index.js ให้ใช้คำสั่งนี้:
บอทจะเริ่มทำงานใน background ทันที! คุณสามารถปิดหน้าต่าง Terminal ได้เลย
คำสั่ง PM2 ที่ควรรู้
PM2 Process Management
ตั้งค่าให้บอทเปิดเองเมื่อ Server รีสตาร์ท (Auto Startup)
สำคัญมาก! หาก Server ของคุณดับหรือถูกรีสตาร์ท ปกติแล้ว PM2 จะไม่รันเองอัตโนมัติ เราต้องใช้คำสั่งพิเศษเพื่อสร้าง "Startup Script"
1. สร้าง Startup Script
พิมพ์คำสั่งนี้ใน Terminal:
2. บันทึกสถานะปัจจุบัน (Save)
เมื่อรันบอทครบทุกตัวแล้ว ให้สั่งบันทึกเพื่อให้ PM2 จำว่าต้องเปิดตัวไหนบ้าง:
เรียบร้อย! ตอนนี้บอทจะทำงานตลอดไปแม้ Server จะรีบูต
สรุปคำสั่ง PM2 สำหรับดูแลระบบ
| คำสั่ง (Command) | ความหมาย |
|---|---|
| pm2 monit | เปิดหน้าจอ Dashboard ดูกราฟ CPU/RAM แบบสดๆ |
| pm2 list | ดูรายชื่อแอปทั้งหมด สถานะ Online/Offline |
| pm2 logs [id/name] | ดูประวัติการทำงาน หรือ Error ล่าสุด |
| pm2 flush | ล้างประวัติ Logs ทั้งหมด (เคลียร์หน้าจอ) |
| pm2 delete [name] | ลบบอทออกจากระบบ PM2 (เลิกใช้งาน) |
| pm2 update | อัปเดตระบบ PM2 ให้เป็นเวอร์ชันล่าสุด |
ปัญหาที่พบบ่อย (FAQ)
บอทไม่ตอบอะไรเลย ทำไงดี?
pm2 logs ดูว่ามี Error สีแดงๆ ขึ้นไหม 2. เช็คไฟล์
.env ว่าใส่ Token ถูกต้องและไม่มีช่องว่างเกินมา 3. เช็คว่ามีเงิน/เครดิตเหลือในบัญชี DeepSeek API หรือไม่
อยากเปลี่ยนให้บอทฉลาดขึ้น หรือเปลี่ยนนิสัย?
messages: [{ role: "system", ... }] เปลี่ยนข้อความข้างใน เช่น "คุณคือผู้เชี่ยวชาญด้านการตลาด..." บอทก็จะเปลี่ยนสไตล์การตอบทันที