Chào mọi người, gần đây mình có nhận được câu hỏi về cách tạo bot telegram thế nào. Hôm nay mình sẽ hướng dẫn mọi người code một con bot với chức năng mỗi khi có thành viên mới tham gia group thì nó sẽ chào mừng giống như thế này.

bot telegram welcome new member
Tin nhắn chào mừng thành viên mới

Rồi ok bắt đầu nhé.

Telegram là gì?

Cho bạn nào chưa biết thì telegram là một dịch vụ nhắn tin tuyệt vời hơn tất cả những ứng dụng mình đã dùng qua, và đặc biệt là nó không hề có quảng cáo và bảo mật cao.

Đầu tiên là phải tạo con bot đã

Để có thể tạo được một con bot thì bạn có thể chat với BotFather (Bot bố) bảo nó sản xuất cho bạn một đứa con để cho nó phục vụ bạn.

Bạn chat với nó lệnh bên dưới để tạo bot mới

/newbot

Nó sẽ yêu cầu bạn nhập nhập tên của con BOT. Bạn nhập tên mà bạn thích vào, ví dụ mình đặt là: Thị Màu

Sau đó bạn tiếp tục nhập username của bot, bạn lưu ý là tên phải viết liền không dấu và phải kết thúc bằng từ khoá bot , mình tiếp tục đặt là: thimau_bot

via GIPHY

Sau khi tạo thành công thì bạn sẽ có được thông báo kèm TOKEN thế này:

bot telegram token
Telegram Token

Vậy là đã xong bước tạo bot, tiếp đến là thêm bot vào group mà bạn muốn.

Mình lại tạo group và đặt tên là Hội chửa hoang và thêm con Thị Màu vào làm trưởng hội, cấp cho nó quyền sinh quyền sát luôn.

bot telegram tao group
Tạo group và thêm bot

Sau đó thì thêm Thị Màu làm admin group đó

bot telegram them admin
Thêm bot làm admin

Tiếp đến là mở cửa cho tất cả bạn bè của Thị Màu vào group

bot telegram public group
Đổi thành public group

Group này có thể chứa chấp tối đa là 200k bạn của Thị Màu nha mọi người.

Tiếp theo thì vọc code thôi

Tất cả API của Telegram đều có ở đây bạn có thể vào để xem thêm.

Mục tiêu đặt ra là bot sẽ gửi một tin nhắn chào mừng khi có thành viên mới join group, vậy thì ta cần có một api để bắt biết lúc nào có người join vào và 1 api để gửi tin nhắn.

Bắt đầu tìm kiếm trong docs xem có gì.

Telegram cung cấp cho bạn api để get được những hoạt động mới trong group có tên getUpdates

Bạn có thể mở trình duyệt lên và thử đường dẫn này xem nó lấy được gì về nhé

https://api.telegram.org/bot_BOT_TOKEN_/getUpdates

bạn thay _BOT_TOKEN_ bằng token khi nãy bạn mới lấy được ở bước trên trên.

Kết quả trả về nó đại loại thế này:

{
    "ok": true,
    "result": [
        {
            "update_id": 210414451,
            "message": {
                "message_id": 2,
                "from": {
                    "id": 565007961,
                    "is_bot": false,
                    "first_name": "Nguyên",
                    "last_name": "Nguyên"
                },
                "chat": {
                    "id": -1001421779945,
                    "title": "Hội chửa hoang",
                    "username": "hoichuahoang",
                    "type": "supergroup"
                },
                "date": 1600944809,
                "new_chat_participant": {
                    "id": 565007961,
                    "is_bot": false,
                    "first_name": "Nguyên",
                    "last_name": "Nguyên"
                },
                "new_chat_member": {
                    "id": 565007961,
                    "is_bot": false,
                    "first_name": "Nguyên",
                    "last_name": "Nguyên"
                },
                "new_chat_members": [
                    {
                        "id": 565007961,
                        "is_bot": false,
                        "first_name": "Nguyên",
                        "last_name": "Nguyên"
                    }
                ]
            }
        }
    ]
}

API getUpdates khi nào call thì mới trả về kết quả, vậy chả nhẽ cứ vài phút lại call một lần 🤔 🤔 mà như vậy thì khi có người join vào group nó lại không chào ngay.

May quá Telegram có cung cấp cho chúng ta Webhook. Nếu bạn chưa biết Webhook là gì thì hiểu đơn giản nó là callback, do server Telegram đảm nhiệm, mỗi khi có một hành động nhất định thì bên đó sẽ call api mà bạn chỉ định sẵn.

Vậy để làm được điều đó thì bạn chỉ cần gọi api setWebhook params của api này là url, certificate, max_connections, allowed_updates chi tiết bạn xem trong docs nhé.

Vậy là đã xong vấn đề lấy được hành động mới, giờ làm sao để gửi tin nhắn vào group

Bạn chỉ cần call api sendMessage là xong, api này giúp bạn có thể gửi một đoạn text vào group, còn nếu bạn muốn gửi những loại khác như ảnh, audio, … thì có những api khác trong docs nhé.

Coi như xong phần research chuyển qua phần code thôi.

Code gửi tin nhắn vào group

Trước khi code thì cần nghĩ sau khi code xong thì cho code lên đâu để chạy đã nhé, không có đến lúc làm xong lại để chạy ở localhost thì nó không có làm việc được đâu. 🤣 🤣

Bạn có thể sử dụng Heroku, Vercel, Vultr, … lần này thì mình sử dụng Vercel để chứa code nhé, chi tiết bạn có thể tham khảo thêm tại đây.

Tạo một thư mục mới chứa code đặt tên là thimau-telegram-bot cấu trúc thư mục như thế này:

- api/
--- telegram.ts
- package.json
- index.html

Bật terminal lên chạy lệnh yarn init hoặc npm init sau đó nhập thông tin vào và tiếp tục

Sau đó cài đặt 2 lib tiếp tục gõ lệnh yarn add axios && yarn add --dev @vercel/node

Chạy xong xuôi thì nó ra được file package.json thế này

{
  "name": "thimau-telegram-bot",
  "version": "1.0.0",
  "main": "index.js",
  "repository": "https://github.com/kungfu321/thimau-telegram-bot.git",
  "author": "Vo Manh Kien <[email protected]>",
  "license": "MIT",
  "devDependencies": {
    "@vercel/node": "^1.8.1"
  },
  "dependencies": {
    "axios": "^0.20.0"
  }
}

Quay lại file telegram.ts hồi nãy thêm code vào

import { NowRequest, NowResponse } from "@vercel/node";
import axios from "axios";

export default async (req: NowRequest, res: NowResponse) => {
  try {
    res.status(200).json({ success: true });
  } catch (error) {
    console.log(error);
    res.status(400).json({ success: false });
  }
};

À quên các bạn nhớ cài Vercel vào để run dev nhé và sau còn deploy app lên nữa, Cách cài thì xem ở đây. Nếu không thì bạn phải chạy và config nodejs để chạy và push lên git rồi vào app quản lý vercel để deploy.

Bạn chạy vercel dev sau đó ra trình duyệt bật localhost:3000/api/telegram xem có gì xảy ra không, nếu trả về { success: true } là ok.

Tiếp theo thì thêm đoạn code này vào,

...
const body = req.body.message;
console.log(body);
const teleToken = req.query.token;

if (body.new_chat_member) {
      const newMember = body.new_chat_member;
      const data = {
        chat_id: `@${body.chat.username}`,
        text: `Hi <i><b>${parseUsername(newMember.first_name, newMember.last_name)}</b></i>,\nChào mừng bạn đến với <strong>${body.chat.title}</strong>.\nChúc bạn chửa hoang thành công.`,
        parse_mode: "HTML"
      };

      await axios.post(
        `https://api.telegram.org/bot${teleToken}/sendMessage`,
        data
      );
    }
...

Đại loại thì mình lấy params trong body của request mà telegram trả về ra, rồi lấy token ra. Check xem hoạt động mới đó có phải là thành viên mới join hay không thông qua object new_chat_member nếu new_chat_member có tức là có thành viên mới.

Sau đó lấy data trong object ra và tạo một object mới có tên data để tạo một request sendMessage gửi tin nhắn vào group. Chi tiết params có thể xem tại đây.

Sau đó thì call một request bằng axios thôi.

Dưới đây là code đầy đủ.

Bật Postman lên và chạy thử thôi. http://localhost:3000/api/telegram để method là POST và chọn như hình.

bot telegram postman
Call thử API bằng Postman

Fill seed data vào

{
    "message": {
        "message_id": 7,
        "from": {
            "id": 565007961,
            "is_bot": false,
            "first_name": "Nguyên"
        },
        "chat": {
            "id": -1001270066558,
            "title": "Hội chửa hoang",
            "username": "hoichuahoang",
            "type": "supergroup"
        },
        "date": 1594911555,
        "new_chat_participant": {
            "id": 565007961,
            "is_bot": false,
            "first_name": "Nguyên"
        },
        "new_chat_member": {
            "id": 565007961,
            "is_bot": false,
            "first_name": "Nguyên"
        },
        "new_chat_members": [
            {
                "id": 565007961,
                "is_bot": false,
                "first_name": "Nguyên"
            }
        ]
    }
}

Nó trả về { success: true } là ok.

Check xem đã có tin nhắn trong group chưa, nếu có rồi thì đã thành công.

Bây giờ deploy lên vercel thôi, bạn chỉ cần gõ lệnh vercel --prod chờ lúc cho nó build là xong, bạn sẽ nhận lại một link dạng: https://thimau-telegram-bot.velcel.app

Bước cuối cùng của cuộc tình

Quay lại Postman tạo một request mới

https://api.telegram.org/bot_BOT_TOKEN_/setWebhook

param là { "url": "https://thimau-telegram-bot.velcel.app" }

Sau khi nhận được thông báo thành công thì coi như đã hoàn thành.

via GIPHY

Giờ thì bạn thử join vào group xem sẽ nhận được thông báo chào mừng ngay.

Tạm kết

Vậy là mình đã hướng dẫn xong bạn làm một con bot để thao tác với Telegram, nền tảng này còn rất nhiều thứ hay ho có thể khai thác.

Nếu bạn không muốn tự code thì có thể sử dụng những nền tảng họ đã build sẵn, tất nhiên là mất phí rồi.

Nếu có bất kỳ thắc mắc nào có thể để lại comment ở bên dưới, đừng quên join group để cùng thảo luận nhé.