顯示具有 adsense 標籤的文章。 顯示所有文章
顯示具有 adsense 標籤的文章。 顯示所有文章

2021年10月26日 星期二

Python 筆記 - 使用 AdSense / AdMob API 製作 Dashboard

約莫經營流量變現三年多,大部分的工作都是靠 adsense/admob 網站就夠用了,但如果要整合到其他儀表板的話,就必須靠 AdMob/AdSense API 來撈點資料。

原先一直只靠 AdSense API 做事,但是舊版 AdSense API 在 2021-10-12 下線了,接著新版 AdSense API 就不在有 AdMob 數據,因此需要分開存取。

筆記瑣事:
  • 使用 Python3 開發,並安裝套件相關套件
    • google-api-python-client
    • google-auth-oauthlib
  • AdSense 跟 AdMob 授權的 Scope 是分開的
    • 'https://www.googleapis.com/auth/admob.readonly'
    • 'https://www.googleapis.com/auth/adsense.readonly'
  • Google 專案必須分別啟用 AdSense Management api 跟 AdMob api 使用權
  • Google 專案的憑證,只需使用 "OAuth 2.0 用戶端 ID" ,並採用 "電腦版應用程式" 即可
  • AdSense 跟 AdMob API 輸出的 DATE 欄位的格式不同
    • "2021-10-26"
    • "20211026"
因此,若要符合之前舊版 Adsense 的輸出,需要分別使用 AdSense api v2 跟 AdMob API v1 來整理數據,例如先將 AdMob 收益用日期作為關鍵字紀錄,接著輸出 AdSense 來源時,在計算當日營收時,再順便查表累計 AdMob 收益。

完整程式碼:

    result = service.accounts().reports().generate(
        account=account_id,
        dateRange='CUSTOM',
        startDate_year=startDate['year'],
        startDate_month=startDate['month'],
        startDate_day=startDate['day'],
        endDate_year=endDate['year'],
        endDate_month=endDate['month'],
        endDate_day=endDate['day'],
        metrics=output['data']['metrics'],
        dimensions=output['data']['dimensions'],
        currencyCode="USD",
        reportingTimeZone="ACCOUNT_TIME_ZONE",
    ).execute()

AdMob API 片段程式碼:

    result = service.accounts().networkReport().generate(
        parent=account_id,
        body= {
            'reportSpec': {
                'dateRange' : {
                    'startDate': output['data']['startDate'],
                    'endDate': output['data']['endDate'],
                },
                'dimensions': output['data']['dimensions'],
                'metrics': output['data']['metrics'],
                'localizationSettings': {
                    'currencyCode': 'USD',
                    'languageCode': 'en-US',
                },
            },
        },
    ).execute()

2021年10月22日 星期五

使用中國境內公司建立 Google Adsense 帳號以及收匯事宜:Google 合同、發票



起因是2021年春天起,Google開始對 Youtube Ads 項目開始有預扣稅額,原本一直用香港收匯,這時美國與香港關係上,在 Youtube Ads 項目上需預扣 30% 稅額。後來發現中國跟美國有租稅優惠,可以省掉這段,因此改用中國境內公司來收稅,由於公司剛好有這樣的組織架構,就來試試看吧。

首先,建立個中國 Google Adsense 上,最容易踩到的雷就是地址驗證無法通過 XD Google 永遠都寄平信去驗證地址,接著地址是在園區內,不知是不是少寫了聯絡人跟電話啥關係?連寄了四次都沒收到,是的,一次要耗時一個月。

最後跟 Adsense 客服要求,能否公司支付快遞費,請用快遞吧!誰知道,只要累積四次沒驗證通過後,這時就蹦出了另一種驗證方式:主動遞交公司資訊證明文件(需有地址資訊)。就這樣,拿個公司營業執照上傳後一天就搞定了,那過去四個月的時間是?接著 Google Adsense 立馬就匯錢到指定的中國境內銀行,又是另一個故事了。

Google Adsense 匯款到中國境內銀行時,銀行會先把錢擺在虛擬帳號(中間帳),並且要求公司提交文件,包括與 Google 合同以及發票。故事的起因是廣告費歸類在服務費,這時就得提供這些資訊,中國境內收匯真的滿嚴格的,這些在香港銀行沒有碰到。

其實 Adsense 網站上並沒有哪邊可以下載 Google 合同,並且討論區只有滿滿的抱怨文,可能大多都是使用個人身份收匯吧?大部分的解法是嘗試拿 "Adsense 服務條款" 列印下來去申請看看。

再次詢問 Adsense 客服,才發現這也是個申請服務 XD 在信中說明後,得到回信,要求提供公司中英文名字和公司銀行中英文名字後,可以在一週內收到 Google 合同(就一份文件帶有 Google 章),而發票部分,請用原先的 付款收據 即可,把網頁輸出成 PDF 遞交即可,如此終於可以收下錢了。

如此,結案 Orz 一段將近半年的旅程真是漫長。

2020年10月21日 星期三

處理 Adsense 政策中心 帳戶問題 廣告放送量受限 無效流量疑慮

Adsense-政策中心-帳戶問題-廣告放送受限-無效流量疑慮

負責幫公司經營流量變現不知不覺也三年了?時間過得真快。這個題目說真的是好玩的,運作原理不複雜,但變化無窮。如何幫公司從流量轉換現金是需要許多智慧的。這個題目也是任何做服務的終極目標,如何產生現金流來養活團隊!

近一年半來,月初結算才能發現上個月被扣了多少無效流量,緊接著要去拆解為何導致這個現象。這點一直以來都沒標準答案,尚未深入此領域的同事,總是認為這一定要有標準答案才對,殊不知 Google Adsense 就是不告訴你為什麼,連 Adsense 客服也不會跟你說,好心一點只會模糊的指導,甚至像遊戲 NPC 一樣,永遠只會說固定的對話。因為告訴你怎樣判斷無效流量後,有心人士就拿它吃 Google 豆腐的,這也是一條完全沒有標準答案的生活模式,趣味無限。

這幾年累積的經驗,常見處理無效流量的方式:

  • 降低廣告被誤點
  • 避免手機內 webview 被過早初始化(如 android TabHost 在背景初始化了網頁及 adsense 內容)
  • 避免在無使用版權的內容網頁上投放廣告(無內容)
  • 遵守 Adsense 廣吿政策

由於本就正派經營沒在買流量,一直認為無效流量的判定大多是 Google Adsense 誤判(過去也曾收過 google adsense 事後補償),直到最近在政策中心直接顯示有帳戶問題,廣告放送量受限。這招很恐怖,一刀見骨不給廣告投放。跟之前面對的無效流量不同,以前是正常拿到廣告來投放,月底在減去無效投放。而這次是一開始就不給廣告,涵蓋率約 2% 水準。

解法呢?回歸原理,除了重新檢視廣告投放是否符合 adsense 政策外,請記得多去思考無效流量的定義,真的快走到冥想階段 XD

Adsense - 營利和廣告 - 無效流量的定義

ref: https://support.google.com/adsense/answer/16737?hl=zh-Hant

當頭棒喝的句子:發布商仍有義務確保自己的廣告流量有效!

一直以來都正派經營,完全忘了無效流量可能來自既有的客戶,甚至有心人士!因此,需要花心思去抓可能的兇手,這時就回歸自身廣告投放的情境是如何,規劃怎樣抓出異常行為。

最後,我偷懶設計了一些 GA event 且設法紀錄 IP 資訊(例如把 IP 記錄在 event label,正規一點應當掃 web server access logs)。透過簡單的機制,就可以發現異常行為。例如期待正常的使用者一週使用服務最高只會瀏覽 50次,那單週超過百次的就很有可能是異常。再搭配 ipinfo.io/ip 去察看基本資訊,有時會找到一些相關訊息。對症下藥實現 IP 黑名單管理法,該名單內的 IP 在使用服務時就不會投放廣告,就能達成自身過濾無效廣告流量。

最終無效流量議題,仍回歸到避免在無效用戶上投放廣告!每一則廣告都是買家的錢, Google 要確保廣告投放是有意義的,這樣買家才會繼續在 Google Ads 買廣告,而邪惡的事件就是...有心人士可以故意一直去點擊廣告消耗掉別人(競爭對手)廣告預算。

我想,這無效流量的戰鬥還是會持續下去的。

2019年11月24日 星期日

[JS] Google Adsense 自動廣告 - 關閉 錨定廣告/重疊廣告 方式

前陣子跟 Google Adsense 的新加坡客戶經理聊過幾句,被她引導開啟了一些自動化廣告最佳化的項目。最近發現公司的網站出現 錨釘 廣告,想說是不是不小心誤上程式碼,最後想起應當是自動化廣告的機制。

對於一些頁面不想開啟置頂或置底的錨定廣告,可用以下方式關閉:

<script>
(adsbygoogle = window.adsbygoogle || []).push({
enable_page_level_ads: false
});
</script>


剛好去年是要手動靠 enable_page_level_ads: true 啟用的,一時之間還以為實驗的程式碼不小心發布了 :P 因為去年研究時感受到他很容易覆蓋掉一些網路應用的版面,如導覽功能,因此決議不讓他上線。

2019年5月19日 星期日

Google Adsense 無效流量 排除方式

Adesne 無效流量

Google Adsense 有自己一套的無效流量判斷方式(黑盒子),在今年三月時,忽然發現無效流量大量提升,由於有追蹤各大服務的廣告單元,幾乎可以判定某個服務全部都被判定為無效流量,該廣告單元的收入全部歸零。

這時只好寄信煩一下 Google Adsense 支援小組,負責回應的,可以透露無效流量由高到底的廣告單元,如此就能證實自己的猜想,緊接著要想想到底該怎樣解決。

由於 Google Adsense 為了避免亂買流量、亂跟人行銷合作。因此並不透露什麼判定規則,只會像 NPC 回饋:
  • 用戶來自哪里?
  • 用戶如何與我的應用進行互動?
  • 用戶在我的應用中查看了哪些屏幕?
後來想了一陣子後,想到的“網域切換"的行爲,會不會被誤判成無效流量(買流量),事實證明真的解掉了!而我一開始則不斷抱怨服務已經超過半年沒改版,怎會突然被判定成無效流量?最終 Google Adsense 支援小組則是回饋:不是誤判,而是 Google Adsense 判斷機制變嚴格了!

此例被判定成無效流量的情境:
  1. 為了做服務轉移,從 A Domain 轉換到 B Domain 來維護,其中 A Domain 還富有 Session 等大量追蹤機制初始化
  2. A 跟 B Domain 都有註冊到 Google Adsense 
  3. 服務使用時,會很快從 A Domain 轉址到 B Domain
後續排除的解法就轉址時,從原本要進入 A Domain 內的 PHP Code 處理,改移至到 Web server rewrite rules 來排除,加速更快的跳轉,也避開 A Domain 的 session 初始化。

2019年5月5日 星期日

服務流量變現和數據追蹤儀表板 - 透過 Google Adsense 和 Google Analytics 建置免費的儀表板

AnalyticsXAdsense

至今執行了一年半的流量變現任務,也進入了成長瓶頸。進入成長瓶頸時,會越來越依賴數據的推敲跟追蹤。雖然翻著 GA 跟 Adsense 報表也很夠用,但如果要追蹤的項目超過二十項時,就會非常累了,非常耗時,便開始適合建置 Dashboard 一眼觀看。

好在一年前已經有想好規則,但一直沒空製作儀表板,這週末剛好擠出了點時間,就把這些想法筆記也產出個雛形:github.com/changyy/TrackingLibrary

需求:
  • 想要追蹤新舊使用者類型的價值(value per person),究竟我們可以從單一使用者身上挖出多少礦呢?
  • 想要細膩到小小功能的變現能力
  • 能否讓 GA 數據跟 Adsense 數據自動匹配
推敲方式:
  • 讓新舊使用者觀看到的廣告單元是不一樣的
  • 讓想追蹤的小小功能的廣告單元是不一樣的
  • 在 GA 數據裡,採用 event ,並且對 event report 進行設計;在 Adsense 則是在廣告名稱進行設計。後續就可以依據撈出來的資料,自動組出對應的報表。
最後產出的規則:

有兩個服務 Service1, Service2 ,其中 Service 1 共有 1 個功能,而 Service 2 有 3 個功能。假設 Service 2 的第三個功能還有兩個子功能。

Service1
Function1 [GA event report = (ec="pageview",ea="Service1",el="Function1")]
Service2
Function1 [GA event report = (ec="pageview",ea="Service2",el="Function1")]
Function2 [GA event report = (ec="pageview",ea="Service2",el="Function2")]
Function3 [GA event report = (ec="pageview",ea="Service3",el="Function3")]
SubFunction1
Google Analytics event = (ec="pageview",ea="Service3",el="Function3,SubFunction1")
Google Adsense AdName =
New User 觀看 = "[#]NU,Service2,Function3,SubFunction1"
Old User 觀看 = "[#]OU,Service2,Function3,SubFunction1"
SubFunction2 [GA event report = (ec="pageview",ea="Service3",el="Function3,SubFunction2")]


上述的高度結構後,也不是沒有缺點的,缺點就是 Adsense 的廣告單元會爆多,例如自己經手製作的廣告單元就高達兩百個,如某個想關注服務其底下共有 80 個廣告單元時,這時靠 Adsense 內建的報表,篩選了 80 個廣告單元時,這時報表很容易產不出來的。而用 GA 觀看時,因為不是用常見的網頁 ga pageview 的方式,而是靠 ga event 查看,這時也會有些不方便。上述更別說還有對應的服務開發時,需要設置規則,讓新舊使用者、不同子服務觀看不同的廣告單元和 GA event report。

最後,則是 Dashboard 要產生時,需要呼叫多次 adsense api 跟 analytics api ,而免費版使用要留意會不會踩到額度限制。

其他資訊 - 關於 TrackingLibrary 的使用:
  1. 先將程式碼中 ga_adsense_rule.json 複製至 dev.json ,程式判斷出 dev.json 就會以此為優先處理
  2. 先建立一個 Google Cloud Project,來使用 Google Adsense / Google Analytics API。
    • 切換到 "API 與服務" -> 憑證 -> OAuth 同意畫面
      • 應用程式名稱:Tracking
      • 已授權網域:changyy.org
    • 切換到 "API 與服務" -> 憑證 -> 建立憑證
      • OAuth 用戶端 ID
        • 網路應用程式:TrackingDashboard
        • 已授權的 JavaScript 來源:http://tracking.changyy.org:8000
        • 已授權的重新導向 URI:http://tracking.changyy.org:8000
    • 取得 "這是您的用戶端 ID" 並更新在 dev.json
      • 將各個 project -> google_api_project 欄位更新成 XXXXXX.apps.googleusercontent.com 即可
  3. 開啟 Google Adsense / Google Analytics API
    • API和服務 -> 資訊主頁 -> 啟用 API和服務
      • 搜尋 "Analytics API" 以及點擊啟用
      • 搜尋 "AdSense Management API" 以及點擊啟用
  4. 切換至程式碼,編輯 dev.json ,建置想要關注的 GA 專案,例如單純複製 GA only 專案內容,只修改 project -> analytics -> ga_profile_id 欄位即可
  5. 切換到專案 php/web 位置,並運行本地端 web server ,即可瀏覽
    • $ cd TrackingLibrary/php/web
    • $ php -S tracking.changyy.org:8000 ../tools/ci-routing.php
    • $ open "http://tracking.changyy.org:8000/dashboard"

2018年10月22日 星期一

[PHP] Dashboard 開發筆記 - 使用 Google Analytics 和 Google Adsense API 追蹤數據

AU_GroupByCountry

大概三個禮拜前已經做好了一些研究,一直偷懶沒寫點紀錄 :P 程式碼片段:

https://github.com/changyy/TrackingLibrary/tree/master/php/Codeigniter-3.1.9/application/libraries

取得 Google Analytics 數據 - Google_Service_Analytics 用法:

$this->load->library('GaQuery_lib', array(
'vendor/autoload.php' => 'vendor/autoload.php',
'access_token' => $access_token,
));

$ret = $output = $this->gaquery_lib->query(
$this->ga_profile_id,
'20180901', // $this->input->get_post('date_start'),
'20190930', // $this->input->get_post('date_end'),
'ga:users,ga:newUsers', // $this->input->get_post('metrics'),
[
'dimensions' => 'ga:countryIsoCode',
'sort' => '-ga:users'
], // $options
);


取得 Google Adsense 數據 - Google_Service_AdSense 用法:

$this->load->library('AdsenseQuery_lib', array(
'vendor/autoload.php' => 'vendor/autoload.php',
'access_token' => $access_token,
));

$ret = $output = $this->adsensequery_lib->getReport(
'20180901', // $this->input->get_post('date_start'),
'20190930', // $this->input->get_post('date_end'),
[
'dimension' => ['AD_UNIT_CODE'],
'metric' => [
'AD_REQUESTS',
'AD_REQUESTS_COVERAGE',
'AD_REQUESTS_CTR',
'CLICKS',
'COST_PER_CLICK',
'AD_REQUESTS_RPM',
'EARNINGS',
]
]
);


如此一來,光 GA 就可以組出不錯的數據,例如取出 60 天的數據,可以做出近30天與上個近30天的變化量,得知活躍用戶是否有對應成長,讓人決定要做哪個國家的客製化服務。