Skip to content

About

๐Ÿ“ข ๊ณต์ง€ ๋‹ค๋ชจ์•„ ์•Œ๋ฆฌ๋ฏธ

Resources

Stars

29 stars

Watchers

0 watching

Forks

Latest commit

ย 

History

285 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ“ข ๊ณต์ง€ ๋‹ค๋ชจ์•„ ์•Œ๋ฆฌ๋ฏธ

  • ์—ฌ๋Ÿฌ ์‚ฌ์ดํŠธ์— ํฉ์–ด์ง„ ํ•™์‚ฌยทํ•™๊ณผยท์žฅํ•™ยท์ทจ์—…ยท๊ณต๋ชจ์ „ยท์ธํ„ด์‹ญ ๊ณต์ง€๋ฅผ ์ผ์ผ์ด ํ™•์ธํ•˜๊ธฐ ๋ฒˆ๊ฑฐ๋กœ์šฐ์…จ๋‚˜์š”?
  • ๊ด€์‹ฌ ์žˆ๋Š” ๊ณต์ง€๋ฅผ ๋งˆ๊ฐ ๊ธฐํ•œ์ด ์ง€๋‚œ ๋’ค์—์•ผ ๋ฐœ๊ฒฌํ•œ ์ ์ด ์žˆ์œผ์‹ ๊ฐ€์š”?

๊ณต์ง€ ์•Œ๋ฆฌ๋ฏธ๋Š” ์—ฌ๋Ÿฌ ๊ณต์ง€ ๊ฒŒ์‹œํŒ์„ ๋งค์ผ ๋‘ ๋ฒˆ ํ™•์ธํ•˜๊ณ , ์ƒˆ๋กœ์šด ๊ธ€์ด ๋“ฑ๋ก๋˜๋ฉด ์Šฌ๋ž™์œผ๋กœ ์•Œ๋ ค์ฃผ๋Š” ๋ด‡์ž…๋‹ˆ๋‹ค.

์ด์ œ ์Šฌ๋ž™ ์ฑ„๋„ ํ•˜๋‚˜๋งŒ ํ™•์ธํ•˜์„ธ์š”!

Python 3.12 Notice Checker




์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋‚˜์š”?

๋ณ„๋„์˜ ์„œ๋ฒ„๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—†์ด, GitHub Actions ํฌ๋ก ๊ณผ Git ์ปค๋ฐ‹๋งŒ์œผ๋กœ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

GitHub Actions ์‹คํ–‰ (๋งค์ผ ์˜คํ›„ 1์‹œยท6์‹œ KST)
        โ”‚
        โ–ผ
๊ฒŒ์‹œํŒ 19๊ณณ ํฌ๋กค๋ง
(requests + BeautifulSoup)
        โ”‚
        โ–ผ
์ด์ „์— ํ™•์ธํ•œ ๊ธ€ ID(state.json)์™€ ๋น„๊ต
        โ”‚
        โ”œโ”€ ์ƒˆ ๊ธ€ ์žˆ์Œ โ†’ Slack Webhook์œผ๋กœ ์•Œ๋ฆผ ์ „์†ก
        โ”‚
        โ–ผ
state.json ๊ฐฑ์‹  โ†’ ์ €์žฅ์†Œ์— ์ปค๋ฐ‹ ๋ฐ ํ‘ธ์‹œ



์™œ ์„œ๋ฒ„๋ฆฌ์Šค ๊ตฌ์กฐ๋ฅผ ์„ ํƒํ–ˆ๋‚˜์š”?

์ด ์„œ๋น„์Šค๋Š” ๊ณต์ง€๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์—ฌ๋Ÿฌ ๊ฒŒ์‹œํŒ์˜ ์ƒˆ ๊ธ€์„ ๋งค์ผ ๋น ์ง์—†์ด ํ™•์ธํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๊ณต์ง€๋“ค์€ ์‹ค์‹œ๊ฐ„์„ฑ์ด ๋‚ฎ๊ณ  ์‹ ์ฒญ ๊ธฐ๊ฐ„๋„ ๊ธธ๊ธฐ ๋•Œ๋ฌธ์—, ์ •ํ™•ํ•œ ์‹คํ–‰ ์‹œ๊ฐ๋ณด๋‹ค ์ •๊ธฐ์ ์ธ ์ˆ˜์ง‘์ด ๋” ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‹คํ–‰์ด ์ผ๋ถ€ ์ง€์—ฐ๋  ์ˆ˜ ์žˆ๋Š” GitHub Actions ํฌ๋ก ๋„ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ๋ถ„ํžˆ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹ค.

ํฌ๋กค๋ง์€ ํ•˜๋ฃจ ๋‘ ๋ฒˆ, ๋ช‡ ์ดˆ ๋™์•ˆ๋งŒ ์‹คํ–‰๋˜๋ฉฐ ์ €์žฅํ•  ์ƒํƒœ๋„ ๊ฒŒ์‹œํŒ๋ณ„๋กœ ํ™•์ธํ•œ ๊ธ€ ID๋ฟ์ž…๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ์„œ๋ฒ„์™€ DB๋ฅผ ์šด์˜ํ•˜๋Š” ๋Œ€์‹ , GitHub Actions๋กœ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๊ณ  state.json์„ Git์— ์ปค๋ฐ‹ํ•ด ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋‹จ์ˆœํ•œ ๊ตฌ์กฐ๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์€ ์ถฉ์กฑํ•˜๋ฉด์„œ ์ธํ”„๋ผ ๋น„์šฉ๊ณผ ์šด์˜ ๋ณต์žก๋„๋ฅผ ์ตœ์†Œํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.




์ง€์›ํ•˜๋Š” ๊ฒŒ์‹œํŒ

ํ˜„์žฌ ์ด 19๊ฐœ ๊ฒŒ์‹œํŒ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๋ถ„๋ฅ˜ ๊ฒŒ์‹œํŒ
ํ•™๊ต ๊ณต์ง€ ๊ณต์ง€์‚ฌํ•ญ, ํ•™์‚ฌ๊ณต์ง€, ์ทจ์—…, ์žฅํ•™, ์ฑ„์šฉยท๋ชจ์ง‘, ๊ตญ์ œ๊ต๋ฅ˜
ํ•™๊ณผ ๊ณต์ง€ ์ปดํ“จํ„ฐ๊ณตํ•™๊ณผ(ํ•™๋ถ€ยท์ทจ์—…๋‰ด์Šคยท๊ณต๋ชจ์ „), AIยท๋ฐ์ดํ„ฐ์‚ฌ์ด์–ธ์Šคํ•™๊ณผ, ์†Œํ”„ํŠธ์›จ์–ดํ•™๊ณผ, SW์ค‘์‹ฌ๋Œ€ํ•™์‚ฌ์—…๋‹จ
ํ•™๊ต ์†Œ์‹ ์„ธ์ข…๋‰ด์Šค๋ฃธ
์™ธ๋ถ€ ํ”„๋กœ๊ทธ๋žจ ICT ๊ธ€๋กœ๋ฒŒ ์ธํ„ด์‹ญ, ๊ตญ๋ฆฝ๊ตญ์ œ๊ต์œก์›, ์›”๋“œ์žก(ํ•ด์™ธ์ธํ„ด์‹ญยท๊ณต๋ชจ์ „), ์œ„๋น„ํ‹ฐ, ํ•œ๊ตญ์žฅํ•™์žฌ๋‹จ
  • ์‚ฌ์ดํŠธ๋งˆ๋‹ค ๊ฒŒ์‹œํŒ์˜ HTML ๊ตฌ์กฐ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ์กฐ๋ณ„๋กœ ํŒŒ์„œ๋ฅผ ๋ถ„๋ฆฌํ•ด ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ์‹œํŒ๋ณ„ ํŒŒ์„œ ์—ฐ๊ฒฐ ์ •๋ณด๋Š” bot/fetchers.py์˜ PARSER_MAP์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ƒˆ๋กœ์šด ์‚ฌ์ดํŠธ๋ฅผ ์—ฐ๋™ํ•˜๋ ค๋ฉด ํ•ด๋‹น ๊ตฌ์กฐ์— ๋งž๋Š” ํŒŒ์„œ ํ•จ์ˆ˜์™€ ๊ฒŒ์‹œํŒ ์„ค์ •์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.




ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

1. ๊ตฌํ˜• ์„œ๋ฒ„์™€ Python ๊ฐ„ SSL Handshake ์‹คํŒจ

๋ฌธ์ œ

sw.sejong.ac.kr, dept.sejong.ac.kr, pr.sejong.ac.kr์—์„œ SSLV3_ALERT_HANDSHAKE_FAILURE๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋กœ์ปฌ macOS์™€ GitHub Actions Ubuntu์—์„œ ๋™์ผํ•˜๊ฒŒ ์žฌํ˜„๋ผ, ํŠน์ • ์‹คํ–‰ ํ™˜๊ฒฝ์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹˜์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

์›์ธ

curl -v๋กœ ํ™•์ธํ•œ ๊ฒฐ๊ณผ ์„ธ ์„œ๋ฒ„๋Š” ๊ตฌํ˜• Cipher Suite์ธ AES256-SHA๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด Python ๊ธฐ๋ณธ SSL Context์˜ Cipher Suite ๋ชฉ๋ก์—๋Š” AES256-SHA๊ฐ€ ์—†์–ด, ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Cipher Suite๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ

๋‹ค์Œ ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ๋น„๊ตํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฐฉ๋ฒ• ๊ฒฐ๊ณผ
SECLEVEL=1๋กœ ๋ณด์•ˆ ์ˆ˜์ค€ ํ•˜ํ–ฅ ์—ฐ๊ฒฐ์€ ์„ฑ๊ณตํ•˜์ง€๋งŒ ๋ถˆํ•„์š”ํ•œ ๊ตฌํ˜• ์„ค์ •๊นŒ์ง€ ํ—ˆ์šฉ
ECDHE-RSA-AES256-SHA ์‚ฌ์šฉ ์„œ๋ฒ„๊ฐ€ ECDHE๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์•„ ์‹คํŒจ
๊ธฐ๋ณธ ๋ชฉ๋ก์— AES256-SHA๋งŒ ์ถ”๊ฐ€ ์—ฐ๊ฒฐ ์„ฑ๊ณต, ์ตœ์ข… ์ฑ„ํƒ

์ „์ฒด ๋ณด์•ˆ ์ˆ˜์ค€์„ ๋‚ฎ์ถ”๋Š” ๋Œ€์‹  Python ๊ธฐ๋ณธ Cipher Suite ๋ชฉ๋ก์— AES256-SHA๋งŒ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

context = ssl.create_default_context()
context.set_ciphers("DEFAULT:AES256-SHA")

๋‹ค๋งŒ ํ˜„์žฌ Adapter๊ฐ€ https:// ๋‹จ์œ„๋กœ ๋งˆ์šดํŠธ๋ผ ๊ณต์œ  ์„ธ์…˜์˜ ๋ชจ๋“  HTTPS ์š”์ฒญ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ—ˆ์šฉํ•˜๋Š” Cipher Suite์˜ ๋ฒ”์œ„๋Š” ์ตœ์†Œํ™”ํ–ˆ์ง€๋งŒ, ์ ์šฉ ๋Œ€์ƒ์„ ์„ธ ํ˜ธ์ŠคํŠธ๋กœ ์ œํ•œํ•˜๋Š” ์ž‘์—…์€ ํ›„์† ๊ณผ์ œ๋กœ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ์‹ ๊ทœ ๊ฒŒ์‹œํŒ ์ถ”๊ฐ€ ์‹œ ๊ณผ๊ฑฐ ๊ณต์ง€๊ฐ€ ๋ชจ๋‘ ๋ฐœ์†ก๋˜๋Š” ๋ฌธ์ œ

๋ฌธ์ œ

์šด์˜ ์ค‘ ์ƒˆ๋กœ์šด ๊ฒŒ์‹œํŒ์„ ์ถ”๊ฐ€ํ•˜์ž, ํ•ด๋‹น ๊ฒŒ์‹œํŒ์˜ ๊ณผ๊ฑฐ ๊ณต์ง€ ์ˆ˜์‹ญ ๊ฑด์ด ๋ชจ๋‘ ์ƒˆ ๊ธ€๋กœ ์ธ์‹๋ผ Slack์œผ๋กœ ๋ฐœ์†ก๋์Šต๋‹ˆ๋‹ค.

์›์ธ

๊ธฐ์กด์—๋Š” state.json ์ „์ฒด๊ฐ€ ๋น„์–ด ์žˆ๋Š”์ง€๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ฒซ ์‹คํ–‰ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.

is_first_run = not bool(state)

ํ•˜์ง€๋งŒ ์‹ค์ œ ์ƒํƒœ๋Š” ๊ฒŒ์‹œํŒ๋ณ„๋กœ ๋…๋ฆฝ์ ์œผ๋กœ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๋ด‡ ์ „์ฒด๊ฐ€ ์ฒ˜์Œ ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ์™€ ์šด์˜ ์ค‘ ํŠน์ • ๊ฒŒ์‹œํŒ์„ ์ฒ˜์Œ ์ˆ˜์ง‘ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ „์—ญ ํ”Œ๋ž˜๊ทธ ํ•˜๋‚˜๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์—†์—ˆ๋˜ ๊ฒƒ์ด ์›์ธ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ

์ตœ์ดˆ ์ˆ˜์ง‘ ์—ฌ๋ถ€์˜ ํŒ๋‹จ ๋‹จ์œ„๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์—์„œ ๊ฒŒ์‹œํŒ ๋‹จ์œ„๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

is_first_fetch = board_key not in state

์ฒ˜์Œ ์ˆ˜์ง‘ํ•˜๋Š” ๊ฒŒ์‹œํŒ์€ ๊ธฐ์กด ๊ธ€ ID๋ฅผ baseline์œผ๋กœ ์ €์žฅํ•˜๊ณ  ์•Œ๋ฆผ์„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ดํ›„ ์‹คํ–‰๋ถ€ํ„ฐ ์ด์ „ ์ƒํƒœ์™€ ๋น„๊ตํ•ด ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€๋œ ๊ธ€๋งŒ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ์šด์˜ ์ค‘ ๊ฒŒ์‹œํŒ์„ ์ถ”๊ฐ€ํ•˜๋”๋ผ๋„ ๊ธฐ์กด ๊ณต์ง€๊ฐ€ ํ•œ๊บผ๋ฒˆ์— ๋ฐœ์†ก๋˜์ง€ ์•Š๊ณ , ์ถ”๊ฐ€ ์ดํ›„ ๋“ฑ๋ก๋œ ๊ธ€๋ถ€ํ„ฐ ์•Œ๋ฆผ์ด ์ „์†ก๋˜๋„๋ก ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.




Slack ์•Œ๋ฆผ ์˜ˆ์‹œ

๐Ÿ“ข ์„ธ์ข…๋Œ€ ๊ณต์ง€์‚ฌํ•ญ ์ƒˆ ๊ณต์ง€ 2๊ฑด
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
[2026ํ•™๋…„๋„ 2ํ•™๊ธฐ ์ˆ˜๊ฐ•์‹ ์ฒญ ์•ˆ๋‚ด]
2026.08.30

[์ค‘์•™๋„์„œ๊ด€ ํ•˜๊ณ„ ํœด๊ด€ ์•ˆ๋‚ด]
2026.08.29

์ƒˆ๋กœ์šด ๊ธ€์ด ์—†๋Š” ๋‚ ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

์˜ค๋Š˜์€ ์—…๋ฐ์ดํŠธ๊ฐ€ ์—†์–ด์š” ๐Ÿ™‚



์ง์ ‘ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

์•Œ๋ฆผ๋งŒ ๋ฐ›๊ณ  ์‹ถ๋‹ค๋ฉด

Slack ์ฑ„๋„ ์ฐธ์—ฌํ•˜๊ธฐ

๋‹ค๋ฅธ ํ•™๊ต๋‚˜ ์กฐ์ง์— ์ ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด

git clone https://github.com/sehynn/notice-bot.git
cd notice-bot
pip install -r requirements.txt
  1. bot/config.py์˜ BOARDS์— ๊ฒŒ์‹œํŒ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ฒŒ์‹œํŒ ๊ตฌ์กฐ๊ฐ€ ๊ธฐ์กด๊ณผ ๋‹ค๋ฅด๋ฉด bot/fetchers.py์— ์ƒˆ๋กœ์šด ํŒŒ์„œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  3. Slack Incoming Webhook์„ ์ƒ์„ฑํ•˜๊ณ  SLACK_WEBHOOK_URL ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.
  4. python main.py --test๋ฅผ ์‹คํ–‰ํ•ด ์—ฐ๊ฒฐ ์ƒํƒœ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  5. GitHub Actions๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ €์žฅ์†Œ Secrets์— SLACK_WEBHOOK_URL์„ ๋“ฑ๋กํ•˜๊ณ , .github/workflows/check-notices.yml์—์„œ ์‹คํ–‰ ์‹œ๊ฐ„์„ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

About

๐Ÿ“ข ๊ณต์ง€ ๋‹ค๋ชจ์•„ ์•Œ๋ฆฌ๋ฏธ

Resources

Stars

29 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages