Mục lục bài viết

Muốn gửi thông báo qua Telegram từ code của mình? Chỉ cần tạo một bot và gọi đúng một đường dẫn API. Đọc xong bài này, điện thoại của bạn sẽ tự nhận tin nhắc việc mỗi sáng, ở bất cứ đâu.

Mục tiêu bài học:

  • Tạo được bot Telegram bằng BotFather.
  • Lấy được token và chat_id.
  • Viết được hàm Python gửi tin nhắn tự động.
  • Đặt lịch cho máy tự nhắc việc mỗi ngày.

1. Vì sao nên gửi thông báo qua Telegram?

Email thì dễ trôi vào thư rác. SMS thì tốn tiền. Telegram giải quyết cả hai chuyện đó:

  • Miễn phí: tạo bot và gửi tin không mất đồng nào.
  • Dễ tích hợp: API chỉ là các đường dẫn HTTP. Ngôn ngữ nào gọi được web là dùng được.
  • Nhận mọi nơi: tin đến cùng lúc trên điện thoại, máy tính và web.

Bạn có thể dùng nó để nhắc lịch họp, báo website bị sập, báo đơn hàng mới… Nói chung, việc gì máy làm xong cũng có thể “nhắn” cho bạn.

2. Tạo bot Telegram với BotFather

BotFather là bot chính chủ của Telegram, chuyên dùng để tạo bot khác. Các bước như sau:

  1. Mở Telegram, tìm @BotFather (có dấu tích xanh).
  2. Gõ lệnh /newbot.
  3. Đặt tên hiển thị, ví dụ Trợ lý nhắc việc.
  4. Đặt username, bắt buộc kết thúc bằng bot, ví dụ nhacviec_cua_vinh_bot.
  5. BotFather trả về một token dạng 123456789:ABCdef.... Lưu lại chuỗi này.
Gửi thông báo qua Telegram cực dễ: nhận tin mọi lúc mọi nơi
Tạo bot để gửi thông báo qua Telegram bằng BotFather

Lưu ý: Token giống như mật khẩu của bot. Ai có token là điều khiển được bot. Đừng đưa token lên GitHub hay chụp màn hình gửi người khác. Lỡ lộ thì vào BotFather, gõ /revoke để đổi token mới.

3. Lấy chat_id để bot biết gửi cho ai

Mỗi cuộc trò chuyện có một mã số riêng gọi là chat_id. Bot cần mã này để biết gửi tin vào đâu.

Trước tiên, tìm bot vừa tạo và bấm Start (hoặc gõ /start). Bước này bắt buộc. Bot không được phép nhắn trước cho người chưa từng chat với nó.

Sau đó mở trình duyệt, dán đường dẫn sau (thay <TOKEN> bằng token thật):

https://api.telegram.org/bot<TOKEN>/getUpdates

Kết quả trả về là JSON. Bạn tìm đến phần "chat", con số ở "id" chính là chat_id:

{
  "ok": true,
  "result": [{
    "update_id": 100000001,
    "message": {
      "chat": { "id": 987654321, "first_name": "Vinh", "type": "private" },
      "text": "/start"
    }
  }]
}

Muốn gửi vào nhóm thì thêm bot vào nhóm, nhắn một tin trong nhóm rồi gọi lại getUpdates. Chat_id của nhóm là số âm, ví dụ -1001234567890.

4. Gửi thông báo qua Telegram bằng Python

Mọi lời gọi API đều có dạng https://api.telegram.org/bot<TOKEN>/<tên phương thức>. Để gửi tin, ta dùng phương thức sendMessage với hai tham số bắt buộc:

  • chat_id: gửi cho ai.
  • text: nội dung, tối đa 4096 ký tự.

Muốn thử nhanh trước khi viết code? Dán đường dẫn sau vào trình duyệt, thay token và chat_id của bạn vào. Nếu điện thoại nhận được chữ “Xin chao” thì bot đã chạy đúng.

https://api.telegram.org/bot<TOKEN>/sendMessage?chat_id=<CHAT_ID>&text=Xin%20chao

Code Python dùng thư viện requests. Chưa có thì cài bằng lệnh pip install requests. Nếu máy chưa có Python, xem lại bài cài đặt Python và Visual Studio Code.

import requests

TOKEN = "123456789:ABCdefGhIJKlmNoPQRstuVWxyZ"  # token lấy từ BotFather
CHAT_ID = "987654321"                          # chat_id lấy ở bước 3

def gui_thong_bao(noi_dung):
    url = f"https://api.telegram.org/bot{TOKEN}/sendMessage"
    du_lieu = {"chat_id": CHAT_ID, "text": noi_dung, "parse_mode": "HTML"}
    phan_hoi = requests.post(url, data=du_lieu, timeout=10)
    ket_qua = phan_hoi.json()
    if not ket_qua["ok"]:
        print("Gửi thất bại:", ket_qua["description"])
    return ket_qua["ok"]

gui_thong_bao("<b>Nhắc việc:</b> Nộp điểm giữa kỳ trước 17h nhé!")

Vài điểm cần để ý trong đoạn code:

  • parse_mode: "HTML" cho phép định dạng tin bằng thẻ HTML như <b>, <i>, <a href="...">.
  • timeout=10 giúp chương trình không bị treo khi mạng chập chờn.
  • Telegram luôn trả về JSON có trường ok. Nếu ok là false, lý do nằm ở description.

Chạy file, vài giây sau điện thoại “ting” một tiếng. Quá dễ luôn!

5. Tự động gửi thông báo qua Telegram mỗi sáng

Gửi tay thì chưa “đã”. Giờ mình cho máy tự xem hôm nay là thứ mấy rồi nhắc đúng việc của ngày đó. Tạo file nhac_viec.py, giữ nguyên hàm gui_thong_bao ở trên, thay dòng gọi hàm cuối cùng bằng đoạn sau:

from datetime import date

# Danh sách việc theo thứ trong tuần: 0 = thứ Hai, 6 = Chủ nhật
VIEC_TRONG_TUAN = {
    0: ["Họp bộ môn lúc 8h", "Nộp kế hoạch giảng dạy"],
    2: ["Chấm bài thực hành lớp CĐ24"],
    4: ["Sao lưu dữ liệu website"],
}

thu = date.today().weekday()
viec_hom_nay = VIEC_TRONG_TUAN.get(thu, [])

if viec_hom_nay:
    noi_dung = "<b>Việc hôm nay:</b>\n" + "\n".join("• " + v for v in viec_hom_nay)
    gui_thong_bao(noi_dung)
else:
    print("Hôm nay không có việc cần nhắc.")

Hàm weekday() trả về số từ 0 đến 6. Phương thức get(thu, []) lấy danh sách việc của ngày đó, không có thì trả về danh sách rỗng. Bạn chỉ cần sửa từ điển VIEC_TRONG_TUAN là đổi được lịch nhắc, không phải đụng vào phần code còn lại.

Bước cuối là hẹn giờ cho file tự chạy. Trên Linux, gõ crontab -e rồi thêm dòng sau để chạy lúc 6h30 mỗi sáng:

30 6 * * * /usr/bin/python3 /home/ban/nhac_viec.py

Trên Windows, mở Task Scheduler và chọn Create Basic Task. Đặt lịch Daily, chọn hành động Start a program. Ô Program trỏ tới python.exe, ô Arguments điền đường dẫn file nhac_viec.py.

Gửi thông báo qua Telegram cực dễ: nhận tin mọi lúc mọi nơi
Task Scheduler trên Windows

Mẹo: Máy tính cá nhân tắt thì lịch cũng không chạy. Muốn nhắc đều đặn, hãy đặt script lên VPS hoặc hosting có hỗ trợ cron.

6. Lỗi thường gặp

Lỗi trả vềNguyên nhânCách sửa
401 UnauthorizedSai token hoặc token đã bị đổiCopy lại token từ BotFather
400 Bad Request: chat not foundSai chat_id hoặc chưa bấm Start với botBấm Start rồi lấy lại chat_id
getUpdates trả về "result": []Chưa nhắn tin nào cho bot, hoặc tin đã quá 24 giờNhắn một tin mới rồi gọi lại
400 Bad Request: can't parse entitiesNội dung có ký tự <, >, & khi dùng chế độ HTMLĐổi chúng thành &lt;, &gt;, &amp; bằng hàm html.escape()
429 Too Many RequestsGửi quá dồn dậpMỗi chat chỉ nên gửi khoảng 1 tin/giây

Lỗi cuối hay gặp khi gửi trong vòng lặp. Thêm time.sleep(1) giữa các lần gửi là ngon lành.

7. Bài tập

  1. Chuyển token và chat_id ra biến môi trường, đọc bằng os.getenv() thay vì ghi thẳng vào code.
  2. Viết script kiểm tra một website cứ 5 phút một lần, báo qua Telegram khi web không phản hồi.
  3. Dùng phương thức sendPhoto để gửi kèm một ảnh biểu đồ.

Tóm lại: tạo bot, lấy token và chat_id, gọi sendMessage, đặt lịch là xong.

Tài liệu tham khảo:

Tác giả

HV Lee

500+ bài viết về lập trình, phần cứng, mạng máy tính và công nghệ. Chia sẻ kiến thức từ những gì đã học, đã dạy và đã trải nghiệm — để người học CNTT hiểu sâu hơn và làm được nhiều hơn.

Gợi ý tiếp theo

Thuật toán sắp xếp đổi chổ trực tiếp (Interchange Sort)

Học tiếp