낙서장

애드센스 막장기록 1탄 - 무효 트래픽 트집잡는 구글 / 특정 IP에 대해 광고를 숨기는 실험?

K66Google 2020. 11. 9. 23:44

애드고시에 합격하고 광고판을 달은지 벌써 열흘이 지났다.

놀이터에서 10원짜리 동전 몇개씩 줍는 수준에 불과한 수익이었다. 하지만 '소확행' 이라는 말도 있듯이, 쥐꼬리만한 수익이더라도 다마고치 키우기라고 생각하면서 어디까지 성장할지 지켜보자는게 내 생각이었다.


열흘동안 이상없이 돌아가는 광고판... 신기하게도 아무 트집도 잡지 않는 구글...

나는 평화에 취해서, 앞으로 어떤 일이 벌어질지 전혀 모르고 있었다...


"게재할 수 있는 광고의 수가 제한되었습니다."


때는 11월 9일, 애드센스 관리페이지에 청천벽력같은 메시지가 뜬다.

드디어 구글놈들이 본색을 드러낸 것인가? 

총 수익 1달러를 눈앞에 둔 시점에서 이런 트집을 잡는 걸 보니, 역시 구글은 잔인하기 짝이 없다.


메일로 보낸 통보문도 똑같은 내용을 담고 있었다. 구글놈들이 보내는 메일은 이상하게도 항상 읽기가 싫다. 아니 싫다기 보다는 짜증이 난다.

어쩌면 통보문 내에 포함된 싸가지 없는 말투때문에 그럴지도 모른다. 

'거듭 말씀드리지만?' 이라는 대목은 마치 자기들이 여러번 교육했는데도 니가 말을 안들어서 조치를 취한거라고 으스대는 것 같아 보인다.


구글의 웃기는 태도에 대해 좀 더 논하고 싶지만, 게시물 주제를 벗어나는 일이므로 이쯤 하겠다.

인터넷으로 무효 트래픽 문제를 해결할 방법을 찾아보니 30일동안 기다려서 풀렸다는 보고가 많았다. 무효 트래픽을 유발한 IP를 잡아내서 신고를 하니 좀 더 빨리 풀렸다는 말도 있지만 전자보다는 보고가 적었다.

솔직히 트집잡히고 난 뒤에 무효 트래픽 신고를 해봤자 구글놈들이 콧방귀도 안 낄 것 같지만, 쓸데없는 경험한다 치고 해보기로 하였다.


다행히 본 블로그는 광고판을 처음 부착할때 태그매니저와 애널리틱스를 조합하여 광고를 클릭한 IP를 따오는 시스템까지 도입하였으므로, 그동안 광고판을 클릭한 IP들을 추려낼 수 있었다. (도입 시 참고 게시물은 #1, #2 이다.)


맞춤 보고서에는 약 열흘 동안 수집된 정보들이 빼곡히 쌓여있었다.

그럼 이제부터는 어떤 IP가 무효 클릭을 한 IP인지 밝혀내야 한다. 그러기 위해서는 무효 클릭의 기준이 무엇인지도 정해야 된다. 마음같아서는 구글놈들에게 애널리틱스 보고서 통째로 넘기고 알아서 분석하라고 하고 싶지만, 고객센터마저도 안 만드는 작자들에게 많은 걸 바라는 것 뿐이다. 다른 블로거들은 눈에 띄게 광고 클릭 횟수가 높은 IP를 잡으면 된다고 하는데, 아무리 기록을 보아도 클릭수가 비정상적으로 높은 IP는 없었다. 따라서 다른 기준을 잡아야 한다.


일단 '클릭한 애드센스 광고' 가 제일 많은 순서대로 정렬해봤을때 제일 많이 클릭한 IP는 6회다. 이걸로 판단하기엔 무리라서 나는 다른 분류를 보기로 하였다. 이때 '애드센스 클릭률' 이라는 것이 내 눈길을 끌었다.


애드센스 클릭률은 [클릭한 애드센스 광고 ÷ 애드센스 페이지 노출수] 의 백분율로 출력되는 것 같다. '애드센스 페이지 노출 수'는 게시물이 몇 번 열리는지를 뜻하는 것 같다. 흠.. 그럼 클릭률을 신고 기준으로 잡아볼까?

제재 당시의 내 블로그는 게시물 하나에 광고판 두 개를 달았다. 그러므로 중복 없이 광고를 클릭하려면 1게시물당 최대 2회까지다. 이유는 광고차단 확장기능을 쓰면 0회, 상단광고만 존재하는 게시물이거나 보다가 중간에 이탈하면 1회에 불과하기 때문이다.

물론 상단이나 하단, 둘 중 하나를 두 번 클릭하는 경우도 있지만 그것까지 상정하기엔 복잡해서 일단 넘어간다.

그렇게 하면 2(최대) ÷ 1 = 2 / 2 x 100 = 200 / 200%다. 200%를 초과하는 클릭률은 반드시 중복 클릭이라는 뜻이다. 따라서 무효 트래픽 신고 대상은 클릭률 200%를 초과하는 IP들만 하는 것으로 정했다.


제3자에 의한 무효 클릭을 신고하는 주소 (링크) 로 가서 클릭률이 높은 IP들을 신고했다.


좋은 결과는 바라지도 않는다.

자, 그러면 여기서 끝인가? 아니다. 기왕 이렇게 됐으니, 하나 실험해볼 것이 있다.

바로 특정 IP에 대해 광고를 숨겨버리는 기능을 구현해보자는 것이다.


먼저 특정 IP가 블로그에 들어오면 다른 페이지로 이동시키는 스크립트를 찾아서 적용해보았다. (참고한 사이트 주소는 #3 이다.) 


차단 대상 IP에 집 IP를 넣으니 경고 메시지가 출력되는 모습을 볼 수 있었다.


여기서 광고판의 div class명을 확인할 필요가 있다. 내 블로그에서 애드센스와 관련있는 div class명은...


revenue_unit_item adsense  responsive (띄어쓰기 주의)

revenue_unit_wrap position_list

revenue_unit_info


...였다. (티스토리 관리자 메뉴 '수익'-'애드센스 관리' 에서 광고판을 설정한 경우만 해당)

class명을 확인하고 기존 스크립트를 수정해서 head 부분의 <script data-ad-client="ca-pub-어쩌구저쩌구... 하는 곳 위에 붙여넣었더니 잘 작동되었다.


 <!-- IP에 따른 JQuery 광고 차단 실험 -->

<script>
(function () {
  function resp() {
  var arrUserIP = ['111.111.111.111','55.55.55.55']; // 광고차단할 아이피 입력
  var json = JSON.parse(this.responseText);
  for (var i = 0; i < arrUserIP.length; i++) {
    if (arrUserIP[i] == json.ip) {
      // 차단할 아이피 접속 시 보여줄 메시지(특정 주소로만 보내려면 아래 줄 삭제)
 $("div").removeClass("revenue_unit_wrap position_list");
$("div").removeClass("revenue_unit_item adsense  responsive");
$("div.revenue_unit_info").remove();
      //alert("너 차단");
      // 다른 곳으로 보낼 URL주소 입력
     // window.location.replace("http://error.com");
    }
  }
}
var request = new XMLHttpRequest();
request.addEventListener("load", resp);
request.open("GET", 'https://api.ipify.org?format=json');
request.send();
}());
</script>


원본 스크립트에서 removeClass와 remove 메소드를 추가했다.

이제 arrUserIP 에 추가된 IP들은 광고가 뜨자마자 바로 사라지게 된다. 모바일웹 자동연결 페이지에서는 작동하지 않고, 데스크탑 페이지 또는 반응형 스킨에서만 작동한다.


그런데 블로그의 HTML에 자꾸 IP주소를 추가하면 보기에 좋지 않은 것 같아서, 어딘가에다 IP주소를 텍스트 파일 형식으로 기록하고 로딩할때 확인하는 게 낫겠다는 생각이 들었다.

Pastebin은 뭔가 신뢰하기 어렵고... 그때 찾아낸게 바로 Github의 Gist였다.


Gist (링크) 에 로그인을 하고,

Create a gist를 눌렀다. (오른쪽 위의 + 버튼을 눌러도 된다)



그리고 설명란에 광고차단 IP주소라고 쓰고 차단할 IP주소를 작성한 뒤 Create secret gist를 클릭했다.

(꼭 secret gist로 해야된다. 만약 public gist로 하면 검색엔진에 떠서 골치아프다.)



이렇게 하면 텍스트 파일이 저장된다. IP주소의 추가·삭제를 하고 싶으면 Edit 버튼을 눌러서 고친 뒤 Update secret gist 버튼을 누르면 된다.

이제 파일 주소를 알아 볼 차례다. Raw 버튼을 누르면


https://gist.githubusercontent.com/[계정ID]/[엄청 긴 문자열1]/raw/[엄청 긴 문자열2]/gistfile1.txt


라는 주소로 이동하는데, 여기서 /raw/ 뒷부분을 모두 버린다. 그러면..


https://gist.githubusercontent.com/[계정ID]/[엄청 긴 문자열1]/raw/ 이것만 남게 되는데, 이것이 Gist에 입력한 텍스트 파일의 최신판을 얻는 주소다. 이 주소를 블로그 script 부분에서 불러온 뒤, 접속한 IP와 비교하게 만들면 된다.

(여기서 /raw/ 까지 버리면 텍스트 파일 관리 페이지 직링크가 되니까 즐겨찾기에 저장해놓고 수정하면 편하다.)


이렇게 해서 만들어진 최종 스크립트 코드는 다음과 같다.


<!-- IP에 따른 JQuery 광고, 접근차단 실험 (2021.01.15 수정) -->

<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>

<script type="text/javascript">

$(function() {

 var arrUserIP = new Array(); // Gist에서 가지고 올 IP목록 저장변수

 

 function resp2() {

  var gisttxt = this.responseText;

    var arraygo = gisttxt.split("\n"); //개행문자로 구분

    for (var i = 0; i < arraygo.length; i++) {

        arrUserIP.push(arraygo[i])}

 }

 

  function resp() {

  var json = JSON.parse(this.responseText);

  for (var i = 0; i < arrUserIP.length; i++) {

    if (arrUserIP[i] == json.ip) {

      // 광고 Class 없애기 (필요없으면 맨 앞에 // 처리)

  // $("div").removeClass("revenue_unit_wrap position_list");

   //$("div").removeClass("revenue_unit_item adsense  responsive"); 

  // $("div.revenue_unit_info").remove();

      // 알림 표시 (필요없으면 맨 앞에 // 처리)

      //alert("차단");

      // 다른 곳으로 리다이렉트 (필요없으면 맨 앞에 // 처리)

     window.location.replace("https://www.tistory.com/error");

    }

  }

}

var request2 = new XMLHttpRequest();

request2.addEventListener("load", resp2);

request2.open("GET", 'https://gist.githubusercontent.com/[계정ID]/[엄청 긴 문자열1]/raw/'); //이 Gist 주소는 사용자에 맞게 수정해야 함.

request2.send();

 

var request = new XMLHttpRequest();

request.addEventListener("load", resp);

request.open("GET", 'https://api.ipify.org?format=json');

request.send(); 

});

</script>

Gist-특정IP광고,접근차단(데스크탑용).txt


이 스크립트는 head 부분의 <script data-ad-client="ca-pub-어쩌구저쩌구... 하는 곳 위에다 넣으면 되고 (body 부분 최하단에 넣어도 상관없을거다.) request2.open의 gist 주소만 사용자에 맞게 수정해서 쓰면 된다.

마찬가지로 모바일웹 자동연결 페이지에서는 위의 스크립트가 로드되지 않아서 효과가 없다. 텐핑 플러그인에 붙여넣어도 작동하지 않는다. 다만 반응형 스킨을 적용하면 완벽하지는 않지만 모바일에서도 차단 기능이 일부 먹힌다.

데스크탑은 크롬, 파폭, 엣지 브라우저에서만 효과가 있다.


애널리틱스에서 이메일 보고서 발송 예약도 해놓고... 이제 내가 할 수 있는 일은 다 한 것 같다.

간만에 머리 쓰느라 고생했다...

과연 구글놈들이 언제까지 트집 잡고 있을지 좀 더 지켜봐야겠다.


그런데...


구글 애널리틱스·태그매니저 쪽의 클릭수 집CPC(클릭해야 실적으로 인정) 광고뿐만 아니라, CPM(클릭 안해도 실적으로 인정) 광고까지 포함되어 있다는 댓글을 접했다. ( 링크 )


진짜 통계는 구글 애드센스 사이트 쪽의 보고서라는 게 해당 댓글의 주장이다.


그래서 구글 애드센스 사이트에서 CTR 보고서를 만들어봤더니, 비정상적으로 높지도 않았다. 보통 CTR은 평균 2% 미만이라고 하는데, 이를 초과하는 수치도 아니고..


그럼 무엇때문에 구글놈들이 무효 트래픽 타령을 하는거지?


역시 내 예상대로 트집이었나? 잔인한 놈들...


진실은 어둠속에 묻혀버리고 말았다.



- 2탄에서 계속 -

https://k66google.tistory.com/663