Telegram ็พค็ป็ฎก็ๆบๅจไบบ๏ผๅบไบ Telethonใ
ไปๅบ๏ผhttps://github.com/SCys/GoalKeepr
็ฟป่ฏๆ่ฐข 77 ่ๅธใ
ๅฐๆบๅจไบบๅ ๅ ฅ็พค็ปๅนถ่ฎพไธบ็ฎก็ๅ๏ผๆไบ็ธๅบๆ้๏ผๅ๏ผๅฏไฝฟ็จๅ ฅ็พค้ช่ฏๅไปฅไธๅฝไปคใ
- ๆฐๆๅๅ ฅ็พคๅ๏ผๆบๅจไบบไผ้ๅถๅ ถๅ่จๆ้ๅนถๅ้้ช่ฏๆถๆฏ๏ผๅซ้ๆบๅพๆ ้ช่ฏ็ ๏ผใ
- ้ช่ฏๆถๆฏๅ
ๅซๆฌข่ฟๆๆกใ5 ไธช้ช่ฏๆ้ฎใ็ฎก็ๅๆไฝๆ้ฎ๏ผ
- ็นๅปๆญฃ็กฎๅพๆ โ ้่ฟ้ช่ฏ๏ผๆขๅคๅ่จๆ้
- ็นๅป้่ฏฏๅพๆ โ ๅทๆฐ้ช่ฏ็ ้่ฏ
- 30 ็งๅ ๆชๆไฝ โ ่ธขๅบ็พค็ป๏ผ60 ็งๅ่งฃๅฐๅ ่ฎธ้ๆฐๅ ๅ ฅ
- โ๏ธ ็ฎก็ๅ็ดๆฅ้่ฟ๏ผ่ทณ่ฟ้ช่ฏ๏ผ
- โ ็ฎก็ๅ่ธขๅบๅนถๅ ๅ ฅ้ปๅๅ๏ผ้ป่ฎค 30 ๅคฉ๏ผ
- ็พค็ปๅค็ๆนๅผๅฏๅจ็พคๅ
้่ฟ
/group_setting้ ็ฝฎ๏ผ้้ ็ฝฎ Redis๏ผ๏ผ่ฎค่ฏๅ้ค๏ผ้ป่ฎค๏ผใๆๅจ่งฃๅฐใๆ ไฝไธบใ้้ป 1/2 ๅจ็ญใ - ้ช่ฏ่ฟ็จไธญไผ้่ฟ LLM ๅฏน็จๆท่ตๆ่ฟ่กๅๅพๅนฟๅๆฃๆต๏ผๅฝไธญๅ่ชๅจ่ธขๅบใ
- ๆฏๆ้ข็ๆงๅถ๏ผ24 ๅฐๆถๅ ๅๅค่ฟๅบ่ถ ่ฟ้ๅผๅฐ่ชๅจ่ธขๅบใ
| ๅฝไปค | ่ฏดๆ |
|---|---|
/k |
่ธขๆๅๆถๆฏ็ไบบใ |
/sb |
ๅฐๅๆถๆฏ็ไบบๅ ๅ ฅ้ปๅๅใ |
/id |
่ทๅ็จๆทไฟกๆฏ๏ผๅๅคๆไบบๆ่ชๅทฑ๏ผ๏ผ่ฟๅ IDใๆต็งฐใๅไบซ้พๆฅ็ญใ |
/image |
ๆ นๆฎๆๆฌ็ๆๅพ็ใๆฏๆ่ฑๆ๏ผไธญๆไผๅ ็ฟป่ฏไธบ่ฑๆใๅฏ้ ็ฝฎๅ ่ฎธ็็จๆท/็พค็ปๅๅพๅบ๏ผimgproxy๏ผ๏ผ้ๅจไปฃ็ ไธญๅฏ็จ๏ผใ |
/shorturl |
ๅฐๆถๆฏไธญ็ URL ่ฝฌไธบ็ญ้พๆฅ๏ผ้ๅจไปฃ็ ไธญๅฏ็จ๏ผใ |
/tr |
ๅฐ่พๅ ฅๆๆฌ็ฟป่ฏไธบไธญๆ๏ผ้ๅจไปฃ็ ไธญๅฏ็จ๏ผใ |
/tts |
ๆๆฌ่ฝฌ่ฏญ้ณ๏ผ้ๅจไปฃ็ ไธญๅฏ็จ๏ผใ |
/asr |
่ฏๅซ่ฏญ้ณๆถๆฏไธญ็ๆๆฌ๏ผไพ่ต้ ็ฝฎ็ ASR ๆๅก็ซฏ็น๏ผ้ๅจไปฃ็ ไธญๅฏ็จ๏ผใ |
/sdxl |
ไฝฟ็จ SDXL ๆฅๅฃๆ นๆฎๆๆฌ็ๆๅพ็๏ผ้ๅจไปฃ็ ไธญๅฏ็จ๏ผใ |
/chat |
ๅบ็ก AI ไผ่ฏ๏ผ30 ๅ้ TTL ไธไธๆ๏ผใ/chat <้ฎ้ข> ๆๅๅคๆถๆฏๅๅ /chat ็ปง็ปญ๏ผ/chat reset ้็ฝฎไผ่ฏใ้้
็ฝฎ [ai] + Redis๏ผ้ป่ฎคๅทฒๅฏ็จ๏ผใ |
/group_setting |
็พค็ป่ฎพ็ฝฎ๏ผๆฐๆๅๅ ฅ็พคๅค็ๆนๅผ็ญ๏ผ้้ ็ฝฎ Redis๏ผใ |
้จๅๅฝไปค๏ผๅฆ /imageใ/shorturl ็ญ๏ผๅจ handlers/commands/__init__.py ไธญ้ป่ฎคๆชๅฏผๅ
ฅ๏ผ้ๅๆถๆณจ้ๅ้ๅฏๆนๅฏไฝฟ็จใ/chat ไธบ็ฎๅๅ็ๅบ็กไผ่ฏๅ่ฝ๏ผๅทฒ้ป่ฎคๅฏ็จใ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Telegram ChatAction โ
โ (user_joined / user_added) โ
โโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ member_captcha() [ChatMemberไบไปถ] โ
โ 1. ่ทๅ chat, user โ
โ 2. ๅ ้คๅ
ฅ็พคๆถๆฏ โ
โโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ validate_basic_conditions() โ
โ โข ็พค็ป็ฑปๅๆฃๆฅ (supergroup/group) โ
โ โข ็จๆทๅญๅจๆฃๆฅ โ
โ โข ไบไปถ่ฟๆๆฃๆฅ (60s) โ
โโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ CaptchaSession.check_and_record() โ
โ โ
้ข็ๆงๅถ + ๅป้ๆฃๆฅ โ
โ โข SETNX ๅๅญ้้ฒ้ๅค โ
โ โข 24hๅ
ๅ
ฅ็พคๆฌกๆฐ็ป่ฎก โ
โโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโดโโโโโโโโ
โผ โผ
state=throttled state=duplicate ๆญฃๅธธ้่ฟ
(ๅ
ฅ็พคโฅ30ๆฌก) (ไบไปถ้ๅค)
โ โ
โผ โผ
Kick 60s + ้้ป่ทณ่ฟ
่ฐๅบฆ unban
โ
โโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ get_verification_method() โ
โ ไป Redis ่ฏปๅ็พค็ป้ช่ฏๆจกๅผ โ
โโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโผโโโโโโโโโโโโโโ
โผ โผ โผ
NONE SILENCE BAN
(ๆ ไฝไธบ) (้้ปๆจกๅผ) (้ช่ฏ็ )
โ โ โ
โผ โผ โผ
ๆพ่ก ้ๅถๆ้+ restrict_permissions()
้็ฅ็ฎก็ๅ ็ฆๆญขๅ้ๆถๆฏ
โ โ
โผ โผ
handle_silence_mode() โโโโโโโโโโโ
โข ้็ฅ็ฎก็ๅ โ ๅๅปบSessionโ
โข ้ๅถ1/2ๅจ่ชๅจ่งฃๅฐ โโโโโโฌโโโโโ
โ โ
โ (ๅคฑ่ดฅ) โผ
โโโโโโโโโโโโโโโโโโโโบ sleep(3s)
โ
โผ
โโโโโโโโโโโโโโโโโโโ
โ ๅฎๅ
จๆฃๆฅ(LLM+ๅนฟๅ)โ
โ ่ฟๅๅๅ ๆ ่ฎฐ โ
โโโโโโโโโโฌโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโ
โ build_captcha_msgโ
โ ้ๆบๅพๆ ้ช่ฏ็ โ
โ MD5ๅ ๅฏcallback โ
โโโโโโโโโโฌโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโ
โ send_message() โ
โ ๅ้้ช่ฏๆถๆฏ โ
โโโโโโโโโโฌโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโ
โ โข ่ฎฐๅฝ็ญๆกๅฐRedisโ
โ โข ่ฐๅบฆ่ถ
ๆถๆฃๆฅ โ
โ โข 30sๅ่ชๅจๅ ้ค โ
โโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ็จๆท็นๅปๆ้ฎ (callback_query) โ
โโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ validate_callback_conditions() โ
โ โข ๆถๆฏๅญๅจ/็พค็ป็ฑปๅ/botๆถๆฏๆฃๆฅ โ
โ โข ๆ้ฎๅธๅฑ้ช่ฏ (5+2) โ
โโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ่งฃ็ callback_data (MD5โRedis) โ
โโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๆ้ๅคๆญ โ
โ โข is_admin โ handle_admin_operation โ
โ โข is_self โ handle_self_verificationโ
โโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโดโโโโโโโโโโโโ
โผ โผ
โโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ handle_admin_op โ โ handle_self_verification โ
โ โ โ โ
โ โข O (Accept) โ โ โข ๆญฃ็กฎ โ accepted_member โ
โ โข X (Reject) โ โ โข ้่ฏฏ โ ้่ฏ+1 โ
โโโโโโโโโโโโโโโโโโโโโ โ โข ่ถ
่ฟ3ๆฌก โ Kick 60s โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโฌโโโโโโโโโโโโ
โผ
โโโโโโโโโโโโโโโโโโโโโ
โ accepted_member() โ
โ โข ๆขๅค็จๆทๆ้ โ
โ โข ๅ้ๆฌข่ฟๆถๆฏ โ
โ โข ๆธ
็ session โ
โโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Worker Loop (0.25s/1s) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโ
โผ โผ โผ
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
โnew_member_check โ โ unban_member โ โsafety_timeout โ
โ (30s่ถ
ๆถ) โ โ (60s่งฃๅฐ) โ โ (180sๅ
ๅบ) โ
โโโโโโโโโโฌโโโโโโโโโ โโโโโโโโโโฌโโโโโโโโโ โโโโโโโโโโฌโโโโโโโโโ
โ โ โ
โผ โผ โผ
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
โ _kick_member() โ โ edit_permissionsโ โ _kick_member() โ
โ โข ๅนฟๅโ30ๅคฉๅฐ็ฆ โ โ ๆขๅคๆๆๆ้ โ โ ๅ new_member โ
โ โข LLM/้ป่ฎค โ โ โ โ โ
โ โ 60sๅฐ็ฆ โ โ โ โ โ
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
- Python 3.10+๏ผๅฝๅไฝฟ็จ 3.14 ๅผๅ๏ผ
- ไพ่ต็ฑ uv ็ฎก็๏ผ่ง
pyproject.toml๏ผ
ๅ่ example/main.ini๏ผๅจ้กน็ฎๆ น็ฎๅฝๅๅปบ main.ini๏ผๆ้ๅกซๅไปฅไธ่ใ
[default]
debug = false
[telegram]
token = <ไฝ ็ BOT TOKEN>
api_id = <Telegram API ID>
api_hash = <Telegram API Hash>
proxy = socks5://127.0.0.1:1080 ; ๅฏ้๏ผ่ฟๆฅไปฃ็๏ผsocks5/http๏ผไป my.telegram.org ๅฏ่ทๅ api_id ไธ api_hashใ
[telegram]
admin = <็ฎก็ๅ TG ็จๆท ID๏ผ็จไบ้ๅถ้จๅ็ฎก็่ฝๅ>
[redis]
dsn = redis://localhost:6379/0้ ็ฝฎ Redis ๅ๏ผไผไฝฟ็จ Redis ๅค็ๅปถ่ฟๅ ๆถๆฏใๅ ฅ็พค้ช่ฏไผ่ฏ็ญ๏ผๆช้ ็ฝฎๅไฝฟ็จๅ ็ฝฎ SQLiteใ
[asr]
endpoint = <่ฏญ้ณ่ฏๅซๆๅก URL๏ผไพ /asr ไฝฟ็จ>[sd_api]
endpoint = https://api.snowdusk.meไพ /imageใ/sdxl ็ญๆ็ๅพไฝฟ็จใ
[image]
users = 123,456
groups = -100xxxๅ ่ฎธไฝฟ็จๅพ็็ๆๅฝไปค็ TG ็จๆท ID ไธ็พค็ป ID๏ผ้ๅทๅ้๏ผไธๅกซๅๆไปฃ็ ้ป่ฎค็ญ็ฅใ
[imgproxy]
domain = https://img.example.com
imgproxy_key = <key>
imgproxy_salt = <salt>
imgproxy_source_url_encryption_key = <key>ๅพๅบไปฃ็๏ผ็จไบๅพ็็ๆๅ็่ฎฟ้ฎไธ่ฃๅช๏ผๅฏ้๏ผใ
[ai]
proxy_host = <AI ไปฃ็ๅฐๅ>
proxy_token = <ไปฃ็ token>
# administrator / manage_group ไธบๆง็ /chat ้ซ็บงๆ้็ฎก็้็๏ผๅบ็ก็ /chat ๅทฒไธๅไฝฟ็จ๏ผ
chat_model = deepseek-r1
spam_models = openai/gpt-oss-120b;gemini-3.1-flash-lite-preview;openai/gpt-oss-20b;gemma-4-31b-it
image_optimize_models = deepseek-r1;gemini-flash
# chat_model ็จไบ /chat ๅบ็กไผ่ฏ๏ผ30min ไธไธๆ๏ผใๅฏไฝฟ็จไปปๆๅ็ซฏๆฏๆ็ๆจกๅๅ๏ผ
# SUPPORTED_MODELS ไธญ็ key ไผ่ทๅพ็ฒพ็กฎ็ไธไธๆ้ฟๅบฆๅๅๅฅฝๆพ็คบๅ๏ผๅฆๅไฝฟ็จ 128k ้ป่ฎค้ฟๅบฆ + ๅๅงๆจกๅๅไฝไธบ "Powered by"ใ
# spam_models ็จไบๆฐๆๅๅ
ฅ็พค็ LLM ๅๅพๆฃๆต๏ผhandlers/member_captcha/security.py + utils/llm.py๏ผ๏ผๆฏๆๅคๆจกๅ ; ๅ้ fallback
# image_optimize_models ็จไบ /image ๅฝไปค็ๆ็คบ่ฏ LLM ่ชๅจไผๅๆๆ LLM ็ธๅ
ณๅ่ฝ๏ผ/chatใๅ
ฅ็พค captcha ็ LLM spam ๆฃๆฅใ /image ๆ็คบ่ฏไผๅ๏ผๅ
ฑไบซ [ai] ไธ็ proxy_host/proxy_token ้
็ฝฎ๏ผไป
ๆจกๅไธๅใๆจกๅๅๅๅฏๅจ main.ini ไธญ้
็ฝฎ๏ผไธ้
็ฝฎๅไฝฟ็จไปฃ็ ๅ
็ฝฎ้ป่ฎคๅผ๏ผใchat_model ไธๅๅผบๅถ่ฆๆฑๅฟ
้กปๆฏ SUPPORTED_MODELS ็ keyใ
[advertising]
enabled = false
words = ่ฏ1,่ฏ2
regex_patterns = ๅ็งฐ1:ๆญฃๅ1;ๅ็งฐ2:ๆญฃๅ2ๅนฟๅ/ๅ ณ้ฎ่ฏๆฃๆต๏ผๅฏ้๏ผใ
# ๅฎ่ฃ
ไพ่ต๏ผ้ๅทฒๅฎ่ฃ
uv๏ผ
uv sync --group dev
# ๅๅฐ่ฟ่ก
uv run python main.py้ๅไฝฟ็จ้กน็ฎๅ
docker/Dockerfile ๆๅปบ๏ผๅ
ฅๅฃไธบ startup.sh๏ผไผๅๅปบ log ็ฎๅฝๅนถๆง่ก python main.py๏ผใ
# ๅจๅ
ๅซ docker-compose ็็ฎๅฝไธญ
docker compose build gk
docker compose up -d gkๆๅปบไฝฟ็จ Python 3.14 Alpine๏ผๅทฒๅ ๅซ ffmpeg ็ญ่ฟ่กๆถไพ่ตใ
้ๅๆๆบ็ ๅ้ ็ฝฎ/ๆฐๆฎๅ็ฆป็ๅบๆฏ๏ผ
ๆจ่็ฎๅฝ็ปๆ๏ผ
/data/goalkeepr/
โโโ main.ini # ้
็ฝฎๆไปถ๏ผๅซ token ็ญๆๆไฟกๆฏ๏ผ
โโโ src/ # git ไปๅบๅ
้ไฝ็ฝฎ
โ โโโ main.py
โ โโโ pyproject.toml
โ โโโ uv.lock
โ โโโ ...
โโโ data/ # ่ฟ่กๆถๆฐๆฎ๏ผmain.db + bot.session๏ผ๏ผไปฃ็ ไผ่ชๅจๅๅปบ
โโโ log/ # ๅฏ้๏ผ้ systemd ๆนๅผๆถไฝฟ็จ๏ผ
- ๆฏๆ็ฏๅขๅ้
GOALKEEPR_CONFIGๅGOALKEEPR_DATA_DIR - ๆฏๆๅฝไปค่กๅๆฐ
--config/--data-dir - Telethon session ๅ SQLite ๆฐๆฎๅบไผๆพๅจ
GOALKEEPR_DATA_DIRไธ - ๅๅๅ ผๅฎน๏ผไธ่ฎพ็ฏๅขๅ้ๆถ่กไธบไธๅๆฅๅฎๅ จไธ่ด๏ผ็ธๅฏน่ทฏๅพ๏ผ
# ๅ
้ไปฃ็ ๅฐ src
mkdir -p /data/goalkeepr
cd /data/goalkeepr
git clone https://github.com/your/repo.git src
# ๅๅค้
็ฝฎๆไปถ
cp src/example/main.ini main.ini
# ็ผ่พ main.ini๏ผๅกซๅ
ฅ็ๅฎ token ็ญ
# ๅๅปบๆฐๆฎ็ฎๅฝ๏ผๆ้็ป่ฟ่ก bot ็็จๆท๏ผ
mkdir -p /data/goalkeepr/data
chown -R $USER:$USER /data/goalkeepr
cd src
uv sync --frozen --no-dev
# ๅฎ่ฃ
systemd user service
mkdir -p ~/.config/systemd/user
cp systemd/goalkeepr.service ~/.config/systemd/user/goalkeepr.service
# ๆ นๆฎๅฎ้
ๆ
ๅต็ผ่พ ~/.config/systemd/user/goalkeepr.service ไธญ็่ทฏๅพๅ uv ไฝ็ฝฎ
systemctl --user daemon-reload
systemctl --user enable --now goalkeeprๆฅ็ๆฅๅฟ๏ผ
journalctl --user -u goalkeepr -fcd /data/goalkeepr/src
git pull
uv sync --frozen --no-dev
systemctl --user restart goalkeeprไปๅบๆไพ .github/workflows/deploy.yml ็คบไพใ
้ป่ฎคไฝฟ็จ src + uv + systemd user service ๆต็จ๏ผไธไธ้ข็ฎๅฝ็ปๆๅน้ ๏ผ๏ผ
- ่งฆๅ๏ผpush ๅฐ master
- ้่ฟ SSH ๅจๆๅกๅจๆง่ก
cd /data/goalkeepr/src; git pull; uv sync --frozen --no-dev; systemctl --user restart goalkeepr
้ ็ฝฎ Secrets๏ผ
DEPLOY_HOSTDEPLOY_USER๏ผๅฟ ้กปๆฏๅฏ็จไบ user service ็้ฃไธช Linux ็จๆท๏ผDEPLOY_KEY๏ผSSH private key๏ผ
ๅฆๆไปไฝฟ็จๆง็ Docker + docker-compose ๅธๅฑ๏ผๅฏไปฅๅจ workflow ้ๆณจ้ๅๆขๆ็ปดๆคไธคไธช jobใ
่ฏฆ็ป็ service ๆไปถๆจกๆฟ่ง systemd/goalkeepr.service๏ผๅ
ๆๆณจ้๏ผใ