Skip to content

SCys/GoalKeepr

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

829 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

GoalKeepr

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 ่ฟ่กŒ

้•œๅƒไฝฟ็”จ้กน็›ฎๅ†… docker/Dockerfile ๆž„ๅปบ๏ผŒๅ…ฅๅฃไธบ startup.sh๏ผˆไผšๅˆ›ๅปบ log ็›ฎๅฝ•ๅนถๆ‰ง่กŒ python main.py๏ผ‰ใ€‚

# ๅœจๅŒ…ๅซ docker-compose ็š„็›ฎๅฝ•ไธญ
docker compose build gk
docker compose up -d gk

ๆž„ๅปบไฝฟ็”จ Python 3.14 Alpine๏ผŒๅทฒๅŒ…ๅซ ffmpeg ็ญ‰่ฟ่กŒๆ—ถไพ่ต–ใ€‚


ไฝฟ็”จ systemd ็”จๆˆทๆœๅŠก่ฟ่กŒ๏ผˆๆŽจ่็”จไบŽ่ฃธๆœบ/ VPS๏ผ‰

้€‚ๅˆๆŠŠๆบ็ ๅ’Œ้…็ฝฎ/ๆ•ฐๆฎๅˆ†็ฆป็š„ๅœบๆ™ฏ๏ผš

ๆŽจ่็›ฎๅฝ•็ป“ๆž„๏ผš

/data/goalkeepr/
โ”œโ”€โ”€ main.ini                 # ้…็ฝฎๆ–‡ไปถ๏ผˆๅซ token ็ญ‰ๆ•ๆ„Ÿไฟกๆฏ๏ผ‰
โ”œโ”€โ”€ src/                     # git ไป“ๅบ“ๅ…‹้š†ไฝ็ฝฎ
โ”‚   โ”œโ”€โ”€ main.py
โ”‚   โ”œโ”€โ”€ pyproject.toml
โ”‚   โ”œโ”€โ”€ uv.lock
โ”‚   โ””โ”€โ”€ ...
โ”œโ”€โ”€ data/                    # ่ฟ่กŒๆ—ถๆ•ฐๆฎ๏ผˆmain.db + bot.session๏ผ‰๏ผŒไปฃ็ ไผš่‡ชๅŠจๅˆ›ๅปบ
โ””โ”€โ”€ log/                     # ๅฏ้€‰๏ผˆ้ž systemd ๆ–นๅผๆ—ถไฝฟ็”จ๏ผ‰

1. ไปฃ็ ไฟฎๆ”นๆ”ฏๆŒ๏ผˆๅทฒๅฎŒๆˆ๏ผ‰

  • ๆ”ฏๆŒ็Žฏๅขƒๅ˜้‡ GOALKEEPR_CONFIG ๅ’Œ GOALKEEPR_DATA_DIR
  • ๆ”ฏๆŒๅ‘ฝไปค่กŒๅ‚ๆ•ฐ --config / --data-dir
  • Telethon session ๅ’Œ SQLite ๆ•ฐๆฎๅบ“ไผšๆ”พๅœจ GOALKEEPR_DATA_DIR ไธ‹
  • ๅ‘ๅŽๅ…ผๅฎน๏ผšไธ่ฎพ็Žฏๅขƒๅ˜้‡ๆ—ถ่กŒไธบไธŽๅŽŸๆฅๅฎŒๅ…จไธ€่‡ด๏ผˆ็›ธๅฏน่ทฏๅพ„๏ผ‰

2. ๅฎ‰่ฃ… service

# ๅ…‹้š†ไปฃ็ ๅˆฐ 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 -f

3. ๆ›ดๆ–ฐ้ƒจ็ฝฒ

cd /data/goalkeepr/src
git pull
uv sync --frozen --no-dev
systemctl --user restart goalkeepr

้ƒจ็ฝฒ๏ผˆGitHub Actions๏ผ‰

ไป“ๅบ“ๆไพ› .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_HOST
  • DEPLOY_USER๏ผˆๅฟ…้กปๆ˜ฏๅฏ็”จไบ† user service ็š„้‚ฃไธช Linux ็”จๆˆท๏ผ‰
  • DEPLOY_KEY๏ผˆSSH private key๏ผ‰

ๅฆ‚ๆžœไปไฝฟ็”จๆ—ง็š„ Docker + docker-compose ๅธƒๅฑ€๏ผŒๅฏไปฅๅœจ workflow ้‡Œๆณจ้‡Šๅˆ‡ๆขๆˆ–็ปดๆŠคไธคไธช jobใ€‚

่ฏฆ็ป†็š„ service ๆ–‡ไปถๆจกๆฟ่ง systemd/goalkeepr.service๏ผˆๅ†…ๆœ‰ๆณจ้‡Š๏ผ‰ใ€‚

About

A Telegram group manager

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages