Bot Discord để xác minh thành viên qua trang web (Google reCAPTCHA). Dự án bao gồm một bot Discord chính (main.py) và một web server nhẹ dùng Flask (web_server.py) để hiển thị captcha và ghi nhận trạng thái xác minh.
Tính năng
Gửi embed xác minh có nút Xác Minh trong kênh đã cấu hình
Mỗi user nhận một đường dẫn xác minh riêng (dựa trên guild_id và user_id)
Trang web xác minh hiển thị avatar và tên user
Sử dụng Google reCAPTCHA để chặn bot/spam
Sau khi xác minh, bot tự động cấp role đã cấu hình
Hỗ trợ cấu hình riêng cho từng server (lưu vào guild_settings.json)
Hỗ trợ public URL thông qua PUBLIC_URL hoặc dùng ngrok (pyngrok)
Tạo file .env từ .env.example và điền giá trị cần thiết:
cp .env.example .env# Mở .env và điền các giá trị:# DISCORD_TOKEN — token bot Discord# VERIFY_CHANNEL_ID — (tùy chọn) ID kênh mặc định để bot gửi embed# VERIFIED_ROLE_ID — (tùy chọn) ID role mặc định để cấp khi hoàn tất xác minh# RECAPTCHA_SITE_KEY / RECAPTCHA_SECRET_KEY — Google reCAPTCHA v2 keys# NGROK_AUTH_TOKEN — (tùy chọn) token ngrok nếu muốn tự động mở tunnel# PUBLIC_URL — (tùy chọn) nếu bạn host web ở môi trường có URL công khai, đặt vào đây
Chạy bot:
python main.py
Lưu ý: main.py khởi động một thread Flask (port 3000) rồi chạy bot. Nếu bạn muốn chạy Flask / bot riêng biệt khi deploy, tách cách khởi chạy theo nhu cầu.
Cấu hình URL công khai
Cách 1 (khuyến nghị local/test): Sử dụng ngrok — đặt NGROK_AUTH_TOKEN trong .env rồi chạy python main.py. Ứng dụng sẽ cố gắng dùng pyngrok để mở tunnel tới port 3000.
Cách 2 (production): Set PUBLIC_URL thành URL công khai của server (ví dụ https://example.com:3000), khi đó bot sẽ dùng URL đó để tạo link verify.
Các lệnh (Admin)
/verifychannel — Đặt kênh xác minh cho server hiện tại
/verifyrole — Đặt role sẽ được cấp sau khi xác minh
/refreshverify — Làm mới embed xác minh trong kênh đã set
/verifyinfo — Hiển thị cài đặt hiện tại của server
Lệnh prefix cũ:
!refresh — tương đương /refreshverify (Admin)
Biến môi trường (chi tiết)
DISCORD_TOKEN (bắt buộc): Token bot Discord
VERIFY_CHANNEL_ID (tùy chọn): ID kênh mặc định để bot gửi embed
VERIFIED_ROLE_ID (tùy chọn): ID role mặc định để cấp
RECAPTCHA_SITE_KEY và RECAPTCHA_SECRET_KEY (nên có): Google reCAPTCHA v2
SESSION_SECRET (tùy chọn): Flask session secret (mặc định có fallback)
NGROK_AUTH_TOKEN (tùy chọn): token cho ngrok nếu muốn tự mở tunnel
PUBLIC_URL (tùy chọn): nếu set thì dùng URL này thay vì mở ngrok
Triển khai (gợi ý)
Đặt PUBLIC_URL tới domain/host nơi Flask app reachable (port 3000). Đảm bảo firewall mở port nếu cần.
Chạy python main.py trong một process manager (systemd, pm2, supervisord, v.v.) để giữ bot và web server chạy.
Debug & Troubleshoot
Nếu bot không khởi động: kiểm tra DISCORD_TOKEN trong .env.
Nếu trang verify báo reCAPTCHA chưa được cấu hình: kiểm tra RECAPTCHA_SITE_KEY / RECAPTCHA_SECRET_KEY.
Nếu public URL rỗng và bạn không muốn dùng ngrok: set PUBLIC_URL.
Nếu role không được cấp: kiểm tra bot có quyền Manage Roles và role verified nằm dưới role bot trong danh sách role server.
Ghi chú kỹ thuật
Dữ liệu cài đặt guild được lưu vào guild_settings.json (JSON đơn giản). Tệp này được tạo/tự động cập nhật khi admin dùng lệnh set.
Flask app lưu trạng thái tạm verified_users và user_info_store trong bộ nhớ process — khi deploy nhiều instance, nên chuyển sang persistence bên ngoài (Redis / DB) để đồng bộ.
Tạo file .env từ .env.example và điền giá trị cần thiết:
cp .env.example .env# Mở .env và điền các giá trị:# DISCORD_TOKEN — token bot Discord# VERIFY_CHANNEL_ID — (tùy chọn) ID kênh mặc định để bot gửi embed# VERIFIED_ROLE_ID — (tùy chọn) ID role mặc định để cấp khi hoàn tất xác minh# RECAPTCHA_SITE_KEY / RECAPTCHA_SECRET_KEY — Google reCAPTCHA v2 keys# NGROK_AUTH_TOKEN — (tùy chọn) token ngrok nếu muốn tự động mở tunnel# PUBLIC_URL — (tùy chọn) nếu bạn host web ở môi trường có URL công khai, đặt vào đây
Chạy bot:
python main.py
Lưu ý: main.py khởi động một thread Flask (port 3000) rồi chạy bot. Nếu bạn muốn chạy Flask / bot riêng biệt khi deploy, tách cách khởi chạy theo nhu cầu.
Cấu hình URL công khai
Cách 1 (khuyến nghị local/test): Sử dụng ngrok — đặt NGROK_AUTH_TOKEN trong .env rồi chạy python main.py. Ứng dụng sẽ cố gắng dùng pyngrok để mở tunnel tới port 3000.
Cách 2 (production): Set PUBLIC_URL thành URL công khai của server (ví dụ https://example.com:3000), khi đó bot sẽ dùng URL đó để tạo link verify.
Các lệnh (Admin)
/verifychannel — Đặt kênh xác minh cho server hiện tại
/verifyrole — Đặt role sẽ được cấp sau khi xác minh
/refreshverify — Làm mới embed xác minh trong kênh đã set
/verifyinfo — Hiển thị cài đặt hiện tại của server
Lệnh prefix cũ:
!refresh — tương đương /refreshverify (Admin)
Biến môi trường (chi tiết)
DISCORD_TOKEN (bắt buộc): Token bot Discord
VERIFY_CHANNEL_ID (tùy chọn): ID kênh mặc định để bot gửi embed
VERIFIED_ROLE_ID (tùy chọn): ID role mặc định để cấp
RECAPTCHA_SITE_KEY và RECAPTCHA_SECRET_KEY (nên có): Google reCAPTCHA v2
SESSION_SECRET (tùy chọn): Flask session secret (mặc định có fallback)
NGROK_AUTH_TOKEN (tùy chọn): token cho ngrok nếu muốn tự mở tunnel
PUBLIC_URL (tùy chọn): nếu set thì dùng URL này thay vì mở ngrok
Triển khai (gợi ý)
Đặt PUBLIC_URL tới domain/host nơi Flask app reachable (port 3000). Đảm bảo firewall mở port nếu cần.
Chạy python main.py trong một process manager (systemd, pm2, supervisord, v.v.) để giữ bot và web server chạy.
Debug & Troubleshoot
Nếu bot không khởi động: kiểm tra DISCORD_TOKEN trong .env.
Nếu trang verify báo reCAPTCHA chưa được cấu hình: kiểm tra RECAPTCHA_SITE_KEY / RECAPTCHA_SECRET_KEY.
Nếu public URL rỗng và bạn không muốn dùng ngrok: set PUBLIC_URL.
Nếu role không được cấp: kiểm tra bot có quyền Manage Roles và role verified nằm dưới role bot trong danh sách role server.
Ghi chú kỹ thuật
Dữ liệu cài đặt guild được lưu vào guild_settings.json (JSON đơn giản). Tệp này được tạo/tự động cập nhật khi admin dùng lệnh set.
Flask app lưu trạng thái tạm verified_users và user_info_store trong bộ nhớ process — khi deploy nhiều instance, nên chuyển sang persistence bên ngoài (Redis / DB) để đồng bộ.