๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
IT

QWebEngineView ์›น ๊ธฐ๋Šฅ 100% ํ™œ์šฉ๋ฒ• PySide6 ๋ธŒ๋ผ์šฐ์ €

๋ฐ˜์‘ํ˜•

PySide6์˜ QWebEngineView๋กœ ์›น ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋Šฅ ๊ตฌํ˜„ํ•˜๊ธฐ

QWebEngineView๋Š” Qt์˜ ์›น ๋ Œ๋”๋ง ์—”์ง„์„ ํ™œ์šฉํ•ด, Python ๊ธฐ๋ฐ˜ GUI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋„ ๊ณ ๊ธ‰ ์›น ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ, ํŒ์—…์ฐฝ, ๋น„๋””์˜ค ์ž๋™์žฌ์ƒ, ์ „์ฒดํ™”๋ฉด, ์‹ฌ์ง€์–ด ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๊นŒ์ง€! ๊ธฐ๋ณธ ์„ค์ •๋งŒ์œผ๋กœ๋Š” ์•ˆ ๋ณด์ด๋˜ ๊ธฐ๋Šฅ๋“ค์„ ์„ค์ •ํ• ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธ€์—์„œ๋Š” PySide6๋ฅผ , QWebEngineView๋ฅผ ์›น ๋ธŒ๋ผ์šฐ์ €์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์„ค์ • ๋ฐฉ๋ฒ•์„ ํ•ญ๋ชฉ๋ณ„๋กœ ์ •๋ฆฌ ํ•ด๋ด…๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ ๊ธฐ๋Šฅ์ด ์™œ ํ•„์š”ํ•œ์ง€, ์–ด๋–ป๊ฒŒ ์„ค์ •ํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์‹ค๋ฌด์—์„œ ์–ด๋–ป๊ฒŒ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ• ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PySide6 QWebEngineView ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ, ํŒ์—…, ๋ฏธ๋””์–ด ์„ค์ • ์ •๋ฆฌ

PySide6์˜

QWebEngineView๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์Šคํฌํƒ‘ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์›น ๋ธŒ๋ผ์šฐ์ €์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋„๋ก ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

1. ๊ธฐ๋ณธ ์›น ๊ธฐ๋Šฅ ํ™œ์„ฑํ™”

์›น ํŽ˜์ด์ง€๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ, ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€ ๋“ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

settings = self.webview.settings()
settings.setAttribute(QWebEngineSettings.JavascriptEnabled, True)
settings.setAttribute(QWebEngineSettings.LocalStorageEnabled, True)
settings.setAttribute(QWebEngineSettings.PluginsEnabled, True)
settings.setAttribute(QWebEngineSettings.WebGLEnabled, True)
  • JavascriptEnabled: ๋Œ€๋ถ€๋ถ„์˜ ํ˜„๋Œ€ ์›น ํŽ˜์ด์ง€๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์ด ๊บผ์ ธ ์žˆ์œผ๋ฉด ์›น ํŽ˜์ด์ง€๊ฐ€ ์ •์ƒ ์ž‘๋™ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜, ๋ฒ„ํŠผ ํด๋ฆญ, ๋ฉ”๋‰ด ์ด๋™ ๋“ฑ์ด ์•ˆ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • LocalStorageEnabled: ์›น ํŽ˜์ด์ง€๊ฐ€ ๋ธŒ๋ผ์šฐ์ € ๋‚ด์— ์ •๋ณด๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด๋‘๊ณ  ๋‹ค์Œ ์ ‘์† ์‹œ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
  • PluginsEnabled: PDF ๋ทฐ์–ด๋‚˜ ๋ฏธ๋””์–ด ๊ธฐ๋Šฅ์„ ์œ„ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ง€์›.
  • WebGLEnabled: 3D ๊ทธ๋ž˜ํ”ฝ ์ฝ˜ํ…์ธ ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

2. ํŒ์—… ๋ฐ ์ฐฝ ๊ด€๋ จ ๊ธฐ๋Šฅ

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

settings.setAttribute(QWebEngineSettings.JavascriptCanOpenWindows, True)
settings.setAttribute(QWebEngineSettings.AllowWindowActivationFromJavaScript, True)
settings.setAttribute(QWebEngineSettings.AllowGeolocationOnInsecureOrigins, True)
settings.setAttribute(QWebEngineSettings.FullScreenSupportEnabled, True)
  • JavascriptCanOpenWindows
    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ƒˆ ์ฐฝ์„ ์—ด ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.์›น์—์„œ window.open() ๋ช…๋ น์ด ๋™์ž‘ํ•˜๋ ค๋ฉด ์ด ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
    ์˜ˆ: ๋งํฌ ํด๋ฆญ ์‹œ ์ƒˆ ํƒญ์œผ๋กœ ์—ด๋ฆฌ๋Š” ๊ฒฝ์šฐ, ๊ด‘๊ณ  ํŒ์—… ๋“ฑ.
  • AllowWindowActivationFromJavaScript
    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์—ด๋ฆฐ ์ƒˆ ์ฐฝ์ด ์ž๋™์œผ๋กœ ํ™œ์„ฑํ™”(ํฌ์ปค์Šค ์ด๋™) ๋˜๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ํŒ์—…์ด ๋’ค์— ์ˆจ์–ด ๋ณด์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • AllowGeolocationOnInsecureOrigins
    HTTPS๊ฐ€ ์•„๋‹Œ ์›น์‚ฌ์ดํŠธ์—์„œ๋„ ์œ„์น˜ ์ •๋ณด(GPS ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.๋ณด์•ˆ์ƒ ๋ฏผ๊ฐํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ•„์š”ํ•  ๋•Œ๋งŒ ์ผœ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
  • FullScreenSupportEnabled
    ์›น ํŽ˜์ด์ง€์—์„œ ์ „์ฒด ํ™”๋ฉด ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.์›น ๊ธฐ๋ฐ˜ ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ์•ฑ์ด ์ „์ฒด ํ™”๋ฉด์„ ์ง€์›ํ•˜๋ ค๋ฉด ๊ผญ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

3. ๋ฏธ๋””์–ด ๊ด€๋ จ ๊ธฐ๋Šฅ

์›น ํŽ˜์ด์ง€์—์„œ ๋น„๋””์˜ค๋‚˜ ์˜ค๋””์˜ค๋ฅผ ์žฌ์ƒํ•˜๊ฑฐ๋‚˜, ํ™”๋ฉด ์บก์ฒ˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋“ฑ์˜ ๋ฏธ๋””์–ด ๊ด€๋ จ ๊ธฐ๋Šฅ์€ ๋งŽ์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. QWebEngineView์—์„œ๋„ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ๋“ค์„ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

settings.setAttribute(QWebEngineSettings.PlaybackRequiresUserGesture, False)
settings.setAttribute(QWebEngineSettings.AutoLoadIconsForPage, True)
settings.setAttribute(QWebEngineSettings.ScreenCaptureEnabled, True)
settings.setAttribute(QWebEngineSettings.WebRTCPublicInterfacesOnly, False)

PlaybackRequiresUserGesture

  • ๊ธฐ๋Šฅ: ์ด ์„ค์ •์€ ์›น ํŽ˜์ด์ง€์—์„œ ๋น„๋””์˜ค๋‚˜ ์˜ค๋””์˜ค๊ฐ€ ์ž๋™์œผ๋กœ ์žฌ์ƒ๋  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ ๋™์ž‘: ๋Œ€๋ถ€๋ถ„์˜ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํด๋ฆญํ•˜๊ฑฐ๋‚˜ ์Šคํฌ๋กค์„ ํ•œ ํ›„์—์•ผ ๋ฏธ๋””์–ด๊ฐ€ ์žฌ์ƒ๋ฉ๋‹ˆ๋‹ค.
  • ์„ค๋ช…: PlaybackRequiresUserGesture๋ฅผ False๋กœ ์„ค์ •ํ•˜๋ฉด, ์‚ฌ์šฉ์ž์˜ ํด๋ฆญ ์—†์ด๋„ ์ž๋™์œผ๋กœ ๋น„๋””์˜ค๋‚˜ ์˜ค๋””์˜ค๊ฐ€ ์žฌ์ƒ๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

AutoLoadIconsForPage

  • ๊ธฐ๋Šฅ: ์›น ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œํ•  ๋•Œ, ํŒŒ๋น„์ฝ˜(์ž‘์€ ์•„์ด์ฝ˜)์„ ์ž๋™์œผ๋กœ ๋กœ๋“œํ•˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ์„ค๋ช…: ๊ฐ ์›น์‚ฌ์ดํŠธ๋Š” ๋ธŒ๋ผ์šฐ์ € ํƒญ์— ์ž‘์€ ์•„์ด์ฝ˜์„ ํ‘œ์‹œํ•˜๋Š”๋ฐ, ์ด๋ฅผ ํŒŒ๋น„์ฝ˜์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ์ด ์„ค์ •์„ True๋กœ ํ™œ์„ฑํ™”ํ•˜๋ฉด, ์›น ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ์ž๋™์œผ๋กœ ํ•ด๋‹น ์‚ฌ์ดํŠธ์˜ ์•„์ด์ฝ˜๋„ ํ•จ๊ป˜ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.

ScreenCaptureEnabled

  • ๊ธฐ๋Šฅ: ํ™”๋ฉด ์บก์ฒ˜ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ์„ค๋ช…: ์ด ์„ค์ •์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด ์›น ํŽ˜์ด์ง€์—์„œ ํ™”๋ฉด ์บก์ฒ˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ์ฃผ์˜์‚ฌํ•ญ: ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€์—์„œ ์บก์ฒ˜ํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ˜ํ…์ธ ๊ฐ€ ๋ฌด์—‡์ธ์ง€์— ๋”ฐ๋ผ ๋ณด์•ˆ์ด๋‚˜ ํ”„๋ผ์ด๋ฒ„์‹œ์™€ ๊ด€๋ จ๋œ ๊ณ ๋ ค๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

WebRTCPublicInterfacesOnly

  • ๊ธฐ๋Šฅ: WebRTC(์›น ์‹ค์‹œ๊ฐ„ ํ†ต์‹ )๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ณต๊ฐœ๋œ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ์„ค๋ช…: WebRTC๋Š” ์‹ค์‹œ๊ฐ„ ๋น„๋””์˜ค ๋ฐ ์˜ค๋””์˜ค ํ†ตํ™”๋ฅผ ์ง€์›ํ•˜๋Š” ๊ธฐ์ˆ ๋กœ, ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ตฌ๊ธ€ Meet๋‚˜ Zoom๊ณผ ๊ฐ™์€ ํ™”์ƒ ํšŒ์˜ ์•ฑ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ์„ค์ •์„ False๋กœ ์„ค์ •ํ•˜๋ฉด, WebRTC์˜ ์ „์ฒด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด, ์‹ค์‹œ๊ฐ„ ํ†ตํ™”, ๋น„๋””์˜ค ์ŠคํŠธ๋ฆฌ๋ฐ, P2P ์—ฐ๊ฒฐ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์„ค์ •์ด ์ค‘์š”ํ•œ ์ด์œ : WebRTCPublicInterfacesOnly๋ฅผ True๋กœ ์„ค์ •ํ•˜๋ฉด WebRTC์˜ ์ผ๋ถ€ ๊ธฐ๋Šฅ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์ œํ•œ์ ์ธ ํ†ต์‹ ๋งŒ ์ง€์›๋˜๋ฏ€๋กœ ์ „๋ฉด์ ์ธ WebRTC ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ์—๋Š” False๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

4. ๋ณด์•ˆ ๋ฐ ์ ‘๊ทผ ๊ถŒํ•œ

์›น ํŽ˜์ด์ง€๊ฐ€ ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜, ๋กœ์ปฌ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์„ค์ •์€ ์ค‘์š”ํ•œ ๋ณด์•ˆ ์ธก๋ฉด์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์„ค์ •๋“ค์€ ์›น ํŽ˜์ด์ง€๊ฐ€ ๋กœ์ปฌ ํŒŒ์ผ์ด๋‚˜ ์›๊ฒฉ ๋ฆฌ์†Œ์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

settings.setAttribute(QWebEngineSettings.LocalContentCanAccessRemoteUrls, True)
settings.setAttribute(QWebEngineSettings.LocalContentCanAccessFileUrls, True)
settings.setAttribute(QWebEngineSettings.HyperlinkAuditingEnabled, True)
settings.setAttribute(QWebEngineSettings.AllowRunningInsecureContent, True)

LocalContentCanAccessRemoteUrls

  • ๊ธฐ๋Šฅ: ๋กœ์ปฌ ์ฝ˜ํ…์ธ ๊ฐ€ ์›๊ฒฉ URL์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์„ค๋ช…: ์ด ์„ค์ •์€ ๋กœ์ปฌ ํŒŒ์ผ ์‹œ์Šคํ…œ์—์„œ ์‹คํ–‰ ์ค‘์ธ HTML ํŒŒ์ผ์ด ์™ธ๋ถ€ ์ž์›(์˜ˆ: ์™ธ๋ถ€ ์„œ๋ฒ„์—์„œ ์ œ๊ณตํ•˜๋Š” ์ด๋ฏธ์ง€๋‚˜ ์Šคํƒ€์ผ ์‹œํŠธ, JavaScript ํŒŒ์ผ ๋“ฑ)์„ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต ๋กœ์ปฌ ํŒŒ์ผ(file://)์—์„œ ์›๊ฒฉ URL(http:// ๋˜๋Š” https://)์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์€ ๋ณด์•ˆ์ƒ ์ œํ•œ์ด ์žˆ์ง€๋งŒ, ์ด ์„ค์ •์„ True๋กœ ์„ค์ •ํ•˜๋ฉด ์ด๋Ÿฌํ•œ ์ œํ•œ์„ ํ•ด์ œํ•˜์—ฌ ์›น ํŽ˜์ด์ง€๊ฐ€ ๋กœ์ปฌ ์ฝ˜ํ…์ธ ์—์„œ ์™ธ๋ถ€ ์ž์›์— ์ ‘๊ทผํ•˜๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

LocalContentCanAccessFileUrls

  • ๊ธฐ๋Šฅ: ๋กœ์ปฌ ํŒŒ์ผ ์ฝ˜ํ…์ธ ๊ฐ€ ๋กœ์ปฌ ํŒŒ์ผ ์‹œ์Šคํ…œ์—์„œ ๋‹ค๋ฅธ ํŒŒ์ผ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์„ค๋ช…: ๋กœ์ปฌ HTML ํŒŒ์ผ์ด ๋‹ค๋ฅธ ๋กœ์ปฌ ํŒŒ์ผ์— ์ ‘๊ทผํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, HTML ํŒŒ์ผ์ด ๋กœ์ปฌ์˜ ์ด๋ฏธ์ง€ ํŒŒ์ผ์ด๋‚˜ ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค๋ฅผ ๋กœ๋“œํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์ด ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

HyperlinkAuditingEnabled

  • ๊ธฐ๋Šฅ: ํ•˜์ดํผ๋งํฌ ํด๋ฆญ ์‹œ ๋งํฌ ๊ฐ์‚ฌ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ์„ค๋ช…: ์ด ์„ค์ •์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด ์›น ํŽ˜์ด์ง€์—์„œ ํ•˜์ดํผ๋งํฌ๋ฅผ ํด๋ฆญํ•  ๋•Œ, ํ•ด๋‹น ๋งํฌ์˜ ๋ฐฉ๋ฌธ ์ƒํƒœ๋ฅผ ์ถ”์ ํ•˜๊ณ  ๊ธฐ๋กํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋งํฌ๊ฐ€ ํด๋ฆญ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋งํฌ ๊ฐ์‚ฌ ๊ธฐ๋Šฅ์€ ์‚ฌ์šฉ์ž์˜ ํด๋ฆญ์„ ์ถ”์ ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

AllowRunningInsecureContent

  • ๊ธฐ๋Šฅ: ํ˜ผํ•ฉ ์ฝ˜ํ…์ธ (mixed content)๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์„ค๋ช…: ํ˜ผํ•ฉ ์ฝ˜ํ…์ธ ๋ž€, HTTPS ์›น ํŽ˜์ด์ง€์—์„œ HTTP๋ฅผ ํ†ตํ•ด ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ณด์•ˆ์ด ์ ์šฉ๋œ ์›น ํŽ˜์ด์ง€(HTTPS)์—์„œ ๋ณด์•ˆ๋˜์ง€ ์•Š์€ ๋ฆฌ์†Œ์Šค(HTTP)๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. AllowRunningInsecureContent๋ฅผ True๋กœ ์„ค์ •ํ•˜๋ฉด HTTPS ์›น ํŽ˜์ด์ง€์—์„œ HTTP ์ฝ˜ํ…์ธ ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ฑฐ๋‚˜ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค..

5. ๊ฐœ๋ฐœ์ž ๋„๊ตฌ ํ™œ์„ฑํ™”

settings.setAttribute(QWebEngineSettings.DeveloperExtrasEnabled, True)
settings.setAttribute(QWebEngineSettings.Accelerated2dCanvasEnabled, True)
settings.setAttribute(QWebEngineSettings.ScrollAnimatorEnabled, True)

์ด ์„ค์ •์€ F12๋ฅผ ๋ˆŒ๋ €์„ ๋•Œ ๋‚˜์˜ค๋Š” ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์ฒ˜๋Ÿผ ๋””๋ฒ„๊น…์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6. ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ(User-Agent) ์„ค์ •

profile = self.webview.page().profile()
profile.setHttpUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)...")

์›น์‚ฌ์ดํŠธ์— ์ ‘์† ์‹œ ์–ด๋–ค ๋ธŒ๋ผ์šฐ์ €๋กœ ์ ‘์†ํ–ˆ๋Š”์ง€๋ฅผ ์„œ๋ฒ„์— ์•Œ๋ฆฝ๋‹ˆ๋‹ค. ๋ชจ๋ฐ”์ผ ์‚ฌ์ดํŠธ ์šฐํšŒ, ํŠน์ • ๊ธฐ๋Šฅ ํ•ด์ œ ๋“ฑ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

7. ์ „์ฒด ์ฝ”๋“œ ์˜ˆ์‹œ

def enable_full_browser_features(self):
    settings = self.webview.settings()
    settings.setAttribute(QWebEngineSettings.JavascriptEnabled, True)
    settings.setAttribute(QWebEngineSettings.LocalStorageEnabled, True)
    settings.setAttribute(QWebEngineSettings.PluginsEnabled, True)
    settings.setAttribute(QWebEngineSettings.WebGLEnabled, True)
    settings.setAttribute(QWebEngineSettings.JavascriptCanOpenWindows, True)
    settings.setAttribute(QWebEngineSettings.AllowWindowActivationFromJavaScript, True)
    settings.setAttribute(QWebEngineSettings.AllowGeolocationOnInsecureOrigins, True)
    settings.setAttribute(QWebEngineSettings.FullScreenSupportEnabled, True)
    settings.setAttribute(QWebEngineSettings.PlaybackRequiresUserGesture, False)
    settings.setAttribute(QWebEngineSettings.AutoLoadIconsForPage, True)
    settings.setAttribute(QWebEngineSettings.ScreenCaptureEnabled, True)
    settings.setAttribute(QWebEngineSettings.WebRTCPublicInterfacesOnly, False)
    settings.setAttribute(QWebEngineSettings.LocalContentCanAccessRemoteUrls, True)
    settings.setAttribute(QWebEngineSettings.LocalContentCanAccessFileUrls, True)
    settings.setAttribute(QWebEngineSettings.HyperlinkAuditingEnabled, True)
    settings.setAttribute(QWebEngineSettings.AllowRunningInsecureContent, True)
    settings.setAttribute(QWebEngineSettings.DeveloperExtrasEnabled, True)
    settings.setAttribute(QWebEngineSettings.Accelerated2dCanvasEnabled, True)
    settings.setAttribute(QWebEngineSettings.ScrollAnimatorEnabled, True)

    profile = self.webview.page().profile()
    profile.setPersistentCookiesPolicy(QWebEngineProfile.AllowPersistentCookies)
    profile.setCachePath("cache")
    profile.setHttpUserAgent("Mozilla/5.0 (...)")

๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • OpenGL ๋ฌธ์ œ: ๋‹ค์Œ ์„ค์ •์œผ๋กœ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ
    QApplication.setAttribute(Qt.AA_ShareOpenGLContexts)
  • PySide6 ๋ฒ„์ „: 6.4.0 ์ด์ƒ ๊ถŒ์žฅ
    from PySide6.QtCore import __version__
    print(__version__)
๋ฐ˜์‘ํ˜•

'IT' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๋ธ”๋กœ๊ทธ ์• ๋“œ์„ผ์Šค ๊ด‘๊ณ  ! ๋Œ“๊ธ€๋ž€๊นŒ์ง€ ํ™•์žฅํ•ด ์ˆ˜์ต ๊ทน๋Œ€ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•  (9) 2025.04.29
์›Œ๋“œํ”„๋ ˆ์Šค Human ํ…Œ๋งˆ AMP ๋ชจ๋ฐ”์ผ ๋ฉ”๋‰ด ํ† ๊ธ€ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•  (7) 2025.04.20
ํŒŒ์ด์ฌ PySide6 ์›น๋ทฐ์—์„œ ๋งํฌ๊ฐ€ ์•ˆ ์—ด๋ฆด ๋•Œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•  (5) 2025.04.17
๋ธ”๋กœ๊ทธ ์ฝ˜ํ…์ธ  ๊ด€๋ฆฌ ํ”„๋กœ๊ทธ๋žจ v2 ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ! ์ž๋™ํ™” ๋„๊ตฌ์™€ IPTV ๊ธฐ๋Šฅ  (6) 2025.04.15
ํŒŒ์ด์ฌ ์›น ๋ธŒ๋ผ์šฐ์ € โ€“ PySide6์œผ๋กœ ์ฃผ์†Œ์ฐฝ๊ณผ ํ™•๋Œ€/์ถ•์†Œ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ํ•˜๊ธฐ  (4) 2025.04.15
AI๋กœ ๋ธ”๋กœ๊ทธ ๊ธ€ ์ œ์ž‘์‹œ, ๋ชจ๋ฅด๋ฉด ๋ฌด์กฐ๊ฑด ์†ํ•ด ๋ณด๋Š” '๊ผญ' ์•Œ์•„์•ผ ํ•  ๊ฟ€ํŒ ๊ณต๊ฐœ!  (15) 2025.04.11
๋ธ”๋กœ๊ทธ์— SNS ๊ณต์œ  ๋ฒ„ํŠผ ๋„ฃ๋Š” ์‰ฌ์šด ๋ฐฉ๋ฒ• (์นด์นด์˜คํ†ก/ํŽ˜์ด์Šค๋ถ/ํŠธ์œ„ํ„ฐ)  (7) 2025.04.07