yous / YousList

Block filter for advertisements, mainly on Korean sites
300 stars 34 forks source link

나무위키 하단 파워링크 #201

Open lunamoth opened 2 years ago

lunamoth commented 2 years ago

나무위키 개별 항목 하단 파워링크 광고가 언제인가부터 차단이 안되고 있습니다. 차단 지원 해주시면 좋을 것 같습니다.

예제: https://namu.wiki/w/uBlock%20Origin

yous commented 2 years ago

제보 감사합니다. #198 이슈 대응 이후에 차단하기 까다롭게 업데이트 되어 방법을 고민 중입니다.

yous commented 2 years ago

aac6f9f 커밋에서 업데이트했습니다. 자리까지 없어지진 않지만 실제 광고는 나오지 않습니다.

추가로 아이디가 있는 경우 스킨을 변경하면 광고가 나오지 않는다는 정보가 있습니다. https://board.namu.wiki/b/free/2768161

yous commented 2 years ago

확인해보니 또 사이트가 업데이트되어 광고가 보이는 상태입니다.

lunamoth commented 2 years ago

2022-01-22 오후 5:39 광고 안나오네요. 적용 감사드립니다

gaeulbyul commented 2 years ago

개발자도구를 열어보니 "https://namu.wiki/i/" + 무작위 문자열 로 시작하는 URL을 차단하던데, 이 때문에 오류가 발생하는 것으로 보입니다..

yous commented 2 years ago

파이어폭스에서는 가만히 있으면 다시 정상적인 페이지로 이동하는데, 크롬에선 안 되네요.

yous commented 2 years ago

문제가 생기는 부분은 되돌렸습니다.

gaeulbyul commented 2 years ago
namu.wiki#?#article div[id]:-abp-has(.wiki-macro-toc:not(#toc))

제가 방금 만든 필터인데(AdBlock 기준), 이렇게 해보시면 어떨까요?


크롬 개발자도구 스크린샷

  1. 나무위키의 광고영역에는 "fakewiki"라고 하는[^1], 화면상에는 안보이지만 마치 문서 내용같이 .wikik-paragraph.wiki-link-internal등이 들어있는 요소가 있는데요. 얘가 왜 존재하는 지는 확실치는 않으나, 이걸 이용해서 광고영역을 구분하는 게 먹히더라구요.

  2. 나무위키의 목차는 <div class="wiki-macro-toc" id="toc"> ... </div> 처럼 생겼고, id가 toc로 되어있으나 저 fakewiki 영역의 경우엔 id가 없습니다. 웹 표준상 같은 아이디를 두 번이상 사용하는 걸 허용하지 않으므로, 문서에서 사용하는 목차인지 아닌지를 구분할 수 있을거 같습니다.

[^1]: 나무위키의 전역변수 webpackJsonp 내부에 있습니다.

yous commented 2 years ago

@gaeulbyul 감사합니다. 지금도 .wiki-macro-toc 항목이 보이시나요? 지금은 #toc 외에는 안 잡히는 것 같습니다.

gaeulbyul commented 2 years ago

어... 이번엔 저 요소가 없어졌네요... 예상보다 금방 대응하는 걸 보면 이쪽을 모니터링이라도 하는거 같습니다... 😅 다른 방법을 강구해봐야겠네요..

yous commented 2 years ago

이런 식으로 해볼 수는 있을 것 같습니다.

namu.wiki#?#article div[id]:-abp-has(img[src*="//searchad-phinf.pstatic.net/"])
gaeulbyul commented 2 years ago

다만 가끔가다 이미지가 없는 광고가 있더라구요. 이 점을 감안하면 다른 방법도 연구해봐야겠습니다..

gaeulbyul commented 2 years ago
namu.wiki##article div[id]:empty + div[id]:empty + div[id]:not(:empty) + div[id]:not(:empty)

광고영역 주변에 내용없이 비어있는 <div>태그가 있다는 점을 이용하여 작성한 규칙입니다. (솔직히, 이것도 오래 못가서 금방 우회할거 같긴 합니다만...)

yous commented 2 years ago

searchad-phinf.pstatic.net은 최근에 추가해서 이미지와 같이 있는 광고인데 텍스트만 보이는 중입니다.

item4 commented 2 years ago

PR을 남기고 싶었는데 방법을 잘 모르겠어서 댓글로 남깁니다.

namu.wiki##:xpath(//article//div[div[count(.//div/img[starts-with(@src, '//w.namu.la/s/')]) > 2]/following-sibling::div[count(.//div[2]/span[starts-with(text(), 'http')]) = 3]])
yous commented 2 years ago

div>span>img 형태로 사이트가 변경되었네요.

item4 commented 2 years ago
namu.wiki##:xpath(//article//div[count(div) = 2][count(div[1]//img[starts-with(@src, '//w.namu.la/s/')]) > 2][count(div[2]//div[starts-with(text(), 'http')]) = 3])

바뀐 디자인에도 대응 가능한 버전입니다

tjtnsgns commented 2 years ago

어느 순간 다시 나오기 시작했습니다. ![Uploading Screenshot_20220129-232622_Kiwi Browser.jpg…]()

yous commented 2 years ago

광고 텍스트에서 프로토콜을 뺐네요.

yous commented 2 years ago

@item4 이런 건 어떤가요?

namu.wiki##:xpath(//article//div[count(div)=2][count(div[1]//img[starts-with(@src,'//w.namu.la/s/')])>2][div[2][count(div)=3]/div/div[last()][count(div)=3]])
item4 commented 2 years ago

프로토콜 검사를 넣었던게 오작동 방지목적이었는데 프로토콜이 없는 URL 패턴을 xpath로 검사하는 건 매우 비현실적인듯하니 그냥 저게 나아보입니다.

yous commented 2 years ago

하단 div에 빈 div가 추가되었네요.

yous commented 2 years ago

이번엔 상위 div에 빈 div가 추가되었네요.

piquark6046 commented 2 years ago

@yous Umanle S.R.L. updated their website to prevent List-KR Script and Youslist blocking their PowerLink advertisement.

yous commented 2 years ago

Accidentally closed in ac876de (#212), re-opening for future issues.

seia-soto commented 2 years ago

Note that namu.wiki site owner updated their structure, so we need an update to the filter.

seia-soto commented 2 years ago

Please, update to following filter as simply removing [id] condition from div works:

##article>p+div div[id]:has(div[id]:has(div>ul>li,div>a[href*="/w/%EB%B6%84%EB%A5%98:"]))~div:has(img[src*="//w.namu.la/s/"],img[src^="data:image/png;base64,"])

div[id]>ul>li to div>ul>li

image

seia-soto commented 2 years ago

Namuwiki removed <p/> tag inside article tag and rule update is required.

Here is another rule that works:

##article div:has(a[href*="/w/%EB%B6%84%EB%A5%98:"]) ~ div:has(td > img[src*="w.namu.la"], td > img[src^="data:image/png;base64,"])

Using td to detect the image is bit dangerous as we can make false-positive case when namuwiki updates their website to use td tag in content area.

image
seia-soto commented 2 years ago

Namuwiki updated their site structure again. Also, changed the image host to ww.namu.la.

namu.wiki##article div:has(a[href*="/w/%EB%B6%84%EB%A5%98:"]) ~ div:has(tr > td img[src^="//ww.namu.la"])

image

Update 1

Fixes invalid blocking

##article div:has(a[href*="/w/%EB%B6%84%EB%A5%98:"]) ~ div:has(tr > td img[src^="//ww.namu.la"] + div[class] + div[class])

Update 2

Found new edge case

##article div:has(a[href*="/w/%EB%B6%84%EB%A5%98:"]) ~ div:has(div.wiki-paragraph) ~ div:has(tr > td img[src^="//ww.namu.la"])

Update 3

Found yet another edge case that DOM structure was completely different

namu.wiki##article div:has(a[href*="/w/%EB%B6%84%EB%A5%98:"]) ~ div:has(div.wiki-paragraph) ~ div:has(img[src*="w.namu.la"])
seia-soto commented 2 years ago

@yous Someone has dom structure that doesn't include table related tag on their view. Also, their image links that shown on dom started with //w.namu.la. Please, consider the edge case. I don't know why but the structure was really different.

image

From @Bananamilk452

yous commented 2 years ago

Okay, temporarily I'll check the both of //w.namu.la/s/ and //ww.namu.la/s/.

kjm1922 commented 2 years ago

11 03.25 기준으로는 파워링크의 호출이 javascript 내에서 /i/ 링크를 가진것으로 호출하는 형태인것으로 보이는데요.

22 이 URL 패턴도 랜덤하게 변형될 것으로 보이지만 굳이 div 부분을 캐치해서 가리기 보다는 아예 파워링크를 호출하는 것을 막는식으로 진행해도 광고차단 그 자체는 유효하게 동작할 것으로 보입니다.

https://namu.wiki/i/nyNyU2rnMoy-MZ1SzZ98UZOm6fB9v4_GqU_92tRloeyivPLVybAgp40Sa4zirZ0pUH_1skiQ4blDej0xTbCM

https://namu.wiki/i/gFg8FRtMhBObh0FHB0byF0y76fB9v4_OR_SN5QRkXSNR4PQTXfRbp40SpFpMrhkyFLb

seia-soto commented 2 years ago

11 03.25 기준으로는 파워링크의 호출이 javascript 내에서 /i/ 링크를 가진것으로 호출하는 형태인것으로 보이는데요.

22 이 URL 패턴도 랜덤하게 변형될 것으로 보이지만 굳이 div 부분을 캐치해서 가리기 보다는 아예 파워링크를 호출하는 것을 막는식으로 진행해도 광고차단 그 자체는 유효하게 동작할 것으로 보입니다.

https://namu.wiki/i/nyNyU2rnMoy-MZ1SzZ98UZOm6fB9v4_GqU_92tRloeyivPLVybAgp40Sa4zirZ0pUH_1skiQ4blDej0xTbCM

* 파워링크

https://namu.wiki/i/gFg8FRtMhBObh0FHB0byF0y76fB9v4_OR_SN5QRkXSNR4PQTXfRbp40SpFpMrhkyFLb

* 나무뉴스

요청을 차단하는 경우에는 특정 웹 브라우저에서 지속적으로 오류를 일으키는 현상이 있었습니다.

https://github.com/yous/YousList/issues/201#issuecomment-1019144481

kjm1922 commented 2 years ago

이미지 147 X-Chika: b932f5886a7ff42e6 Fiddler 로 해당 request 를 봤을 때, 특정 헤더가 포함된 항목을 요청(User-Agent 도 포함필요, 미포함시 CF 차단)하면 항상 200 을 return 받는것을 응용해서 이용할 수 있을 것 같은데

다만 조건이 Ublock Origin 의 고급설정에서 filterOnHeaders 를 True 로 설정해야 되는 것이 있고, Ublock 설정을 보았을 때 response 에 대한 응답만 필터링 할 수 있는 것으로 보입니다. https://github.com/gorhill/uBlock/wiki/Static-filter-syntax#header

seia-soto commented 2 years ago

I am suggesting new pattern only using table tag:

seia-soto commented 2 years ago

iOS 및 macOS용 Safari AdGuard를 사용하시는 경우에는 현재 버그가 있으니 다음 글을 참조하여 나무위키 규칙이 정상적으로 동작할 수 있도록 하세요. 광고 차단기의 동작이 전부 중지되어 원하는 규칙이 정상적으로 실행되지 않을 수 있습니다.

현재 AdGuard에 새 이슈를 등재했습니다.

item4 commented 2 years ago

새 패턴 작성해서 공유드립니다.

namu.wiki##:xpath(//div[@*[starts-with(name(), 'data-v-')]][@class != ''][count(div[@*[starts-with(name(), 'data-v-')]][@class != ''][count(div[count(div[normalize-space(text()) = '']) > 0]) > 0]) > 0])
yous commented 2 years ago

벌써 사이트가 바뀐 것인지는 몰라도 해당 패턴으로 검출되지 않는 것 같습니다.

seia-soto commented 2 years ago

나무위키가 빨리 업데이트되므로 금방 패치되어 오차단이 있을 수 있으나 현재 다음 규칙이 사용 가능합니다: namu.wiki##div[class=""]>div[class=""]>div[class=""]>table

piquark6046 commented 2 years ago

Can be resolved by NamuLink. CC: @yous

yous commented 2 years ago

유저스크립트를 통해 차단할 수 있어 보입니다. https://github.com/List-KR/NamuLink 일단은 YousList로 차단할 수 없고 광고가 사라진 것은 아니니 이슈는 열어 두겠습니다.