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月25日 星期一

2021年秋天

一些機會遠遠地接觸了幾位約莫三十的年輕人,瞬間發現大家的思維已經像當年我在看 35, 40 歲那些人的眼界。時間輪轉的步調比我想像中快的多,可能是近十年對岸資訊及蓬勃網路交流發展所致?那種感覺就像自己過時了似的。

上一次有這種感觸到自己步調慢了,大概是十年前吧!那時在研究單位時常看到新東西也挽起衣袖嘗試,常寫些技術筆記,還會有類似出版社小編問有沒興趣出書。當時在研究單位約滿後,就衝離職,想趕緊去外頭闖闖,意外又加入到一間小公司上班,但說真的沒有沒太顯著的貢獻 orz 除了自己還不給力外,則是老闆的路線專注在重新設計有趣的事物,屬於重複造輪子的工作哲學,在這種方式上可以享受樂趣,步調反而又更慢了許多,自己也沒了耐心,選擇了其他跑道。

這幾天聽了李開復與樊登在2019.02年新書 AI.未來 訪談,大聊 AI 的發展,那時李開復說的角度至今2021年末了,我還滿認同的,就是 AI 會稍微侷限在特定領域跟維度,主因是身處資訊領域略知AI訓練的方式,AI的強項是單點深耕去突破,但很難像人類可以做 general-purpose learning。這對談已經過了近三年,卻還是一樣的新鮮且呼應著,代表 AI 的進程還是持續地找突破吧!像特斯拉的自動駕駛尚未完全可以無人的概念,但已經有一些有條件的領域可以無人了,如固定路線的公車、掃地機器人等。

瞬間,因為聽了李開復跟樊登2019年初的訪談,讓自己的心態又回穩了點?當年公司的老闆不知不覺也在今年退休,好像什麼事都沒發生的停滯著。或許,這正是高估了近幾年的發展,而低估了十年的狀態?想想自己和周邊好友,也跟十年前的彼此身處在不同知識水準跟產業位置,只要正念持著複利思維跟學習,慢慢地進步就好,勝過凡事完美而躊躇不進。

此外,最近學弟哈拉著投資,談論起對指數開槓桿的事,想想也是一樣的概念,可能都過於看重最近的動作。這時,想起股癌的一些思維還滿不錯的,只要能賺錢,慢慢賺就好。雖說股癌爆料本身是開槓桿起家的,卻也深知自己是多麽幸運避開了歸零,並努力不讓運氣賺來的又靠實力賠回去,做了不少學習精進跟風險配置。面對著這幾天川普社群網站要搭的順風車 SPAC 標的兩天十倍的井噴,只會遠遠的 respect!! 但依舊過著自己的生活步調。

我想,此刻的心情就是這樣吧!回穩了。當大家的背景、資源和包袱都不同時,靜靜地欣賞著彼此,也是不錯的。

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 一段將近半年的旅程真是漫長。

[書] 矽谷阿雅 追不到夢想就創一個!從台灣記者到臉書電商產品經理的顛覆筆記

斷斷續續地把這本書看完了。原本是在 kobo 買大量書籍湊總額買的XD 剛好那一陣子常看到他的出現,好像在宣傳他的課程,看了點書目跟一堆名人推薦,想說應該有什麼精神是可以吸收的就買了,就這樣把它看完了。


最大的心得還是凡事積極進取,成功的人總會找方法的。另外,則是對美國昂貴的學費,多了另一種投資思維。書末提到了美國昂貴的學費,通常是一種投資概念,出去後只要花 2-3 年就可以賺回來,同時,進入名校獲得的標籤/人脈是無價的人生寶藏。


翻完書後,讓我想起以前念大學時,有碰過那種教授不收補習班出身或是要從同大學部上來的學生,粗略了解教授的意思,想要找到那種有潛力自學的人。過去大學教育的本質著重在讓學生有自學能力,教授稍微侷限在找出有潛力的人,因此故意避開那類不自我整理知識的人才。我以前覺得這類教授的說詞也不錯,但出社會後,反而更加能接受透過”方法”加速自己成長還是最重要的,甚至近幾年的數位教育夯,甚至有那個風向,主導老師們不要在課堂教育,讓最會教的人製作學習影片,讓學生看最會教的人就好,而一般實體課仍保留,主要讓學生來問問題。


如同創業圈常講:點子不重要,執行力才重要。(雖然並不是說點子不重要啦 XD 努力的方向錯了也是場空的)


回過頭來,這本書帶給人的心態是不錯的,當發現自己有弱點時,請努力去補好它,而不是當個藉口就停滯下來。此外,則是著重在團體戰角度,我習慣把這稱作資方思維(花錢買別人的時間),中性一點應該是管理者思維,凡事不要自己單打獨鬥去證明什麼,而是透過團體戰,缺什麼就找什麼樣人才來幫忙。


這時跟幾位朋友哈拉這位作者時,包括人在 FB 當 RD 的學弟,立馬都互給出很強烈的負面思維 XD 容易把管人工作當作零產出,可能是職場上碰到太多悶虧了吧?這時,只能凡事盡可能正向思考吧!不因言廢人,也不因人廢言。


這本書提到的一些精髓,我覺得還是很受用醒腦的,適合 25 歲以下的人閱讀,超過 25歲可能心思都被定型或是早已有所對應成就。

2021年10月19日 星期二

Python 筆記 - 研究 yt-dlp / youtube-dl 流程與開發方式

幫同事查了一下程式邏輯,下手的方向:
  • 入口點在哪
  • 到底怎樣跑
  • 我要怎樣擴充或貢獻一個影音網站 extractor
github.com/yt-dlp/yt-dlp 來看,入口點就直接看 yt-dlp.sh 即可:

% git clone https://github.com/yt-dlp/yt-dlp
% cd yt-dlp 
% python3 yt_dlp/__main__.py 
Usage: __main__.py [OPTIONS] URL [URL...]

__main__.py: error: You must provide at least one URL.
Type yt-dlp --help to see a list of all options.

接著掃一下 yt_dlp/__main__.py 和 yt_dlp/__init__.py 就略懂他在處理 command line 的參數,而程式的本體是在 yt_dlp/YoutubeDL.py 檔案,一樣在追個 yt_dlp/YoutubeDL.py 裡的 class YoutubeDL 中的 def __init__() 裡,可以看到 self.add_default_info_extractors() 這步,如此就把 yt_dlp/extractor/ 眾多網站影音分析爬蟲狀態初始化好。

接著,給予一則影音網站連結:

% python3 yt_dlp/__main__.py https://www.facebook.com/UserID/videos/VideoID/

程式就會在 yt_dlp/YoutubeDL.py extract_info() 分析做事,像是把所有 extractor 都瀏覽一次,透過呼叫 ie.suitable(url) 的機制判斷。這時可以對應在 yt_dlp/extractor/common.py 中,看到 class InfoExtractor(object) 裡的 suitable() 定義並用 _match_valid_url() 和 _VALID_URL 實作,這時回去猜 yt_dlp/extractor/facebook.py 時,找不到 suitable() 也找不到 _match_valid_url() 時,就可以猜應該是 _VALID_URL 的實作方式了。

回到 yt_dlp/YoutubeDL.py 時,在 extract_info() 分析做事時,找到合適的 extractor 後,就會立即靠 ie.extract(url) 解析,而實際實作是靠 _real_extract()。再找一下 yt_dlp/extractor/facebook.py 中是否有定義 extract() 或 _real_extract(),即可當作解析網站的程式邏輯入口點。

最後,想要擴充某個網站或是修補加強某個網站,就可以去改對應的 extractor 了。並且可以把在當前目錄下,不斷靠 yt-dlp.sh 去實測,也滿方便的。

2021年10月16日 星期六

藝術品

用說書服務大概衝刺了不少知識或資訊的累積,真的滿優的,雖說也會擔心不小心被洗腦了 XD 整體上還是很佩服樊登說書,就是一個 CP 值極佳的知識吸收工具,工具的好壞還是回歸使用者怎樣看待與善用。

大概前幾年開始用 podcast 聽一些國內外的訪談演講,便會覺得國外內容發達,拿來練英聽是不錯,但當作知識吸收就效率慢,剛好沒點太多技能在非母語上,很難 N倍速吸收。並且扣除掉演講類型的 podcast 外,許多都太過碎片化,直到碰到說書服務,且一口氣就是講 30-60 分鐘的說書,跟檯面上只說個 5-15 分鐘的 Youtuber 說書內容有很顯著的程度差距的,最重要的是可以融會貫通的提及幾本經典書共通點。暫時先持續享受這速食知識體驗,接著買了一堆電子書等著清 囧

回過頭來,發現年紀到了一個時間點後,看看周邊的大大們也對等的累積成就,沒有人是停留在之前的狀態的,就算有也長出不一樣的技術樹,如此就會想起跟幾位前輩哈拉一些八卦議題,俗稱的正妹的朋友還是正妹,強者的朋友還是強者。大概就能力越強、責任越大,人越有地位,主動攀談的朋友就肯定越多 XD 對應的八卦是強者們的領域,絕對存在許多雜訊或誘惑的。

回顧著周邊大大們,就像美術館裡的藝術品,只能遠遠欣賞著,沒什麼互動機會。當彼此努力向前者,也各處開花的,大家各自在自己的機緣處深耕,倒也不用說什麼離開舒適圈的事,強者是自成生態系,其舒適圈腹地是不斷擴大的,能力強大到做什麼事都像在舒適圈,世界的美好就是建構在這種最大亂度,不要求每個人都走同樣的路線。

最後 ,筆記一下近期的閒逛,無意間看到了一位要捐出版稅的大大,說真的我是被捐版稅吸引到的,恰好書名的領域跟工作有點相關,就仔細看了一下內容,依照內容原先以為也是三五、四十歲的人生經驗,結果在挖掘下去,才發現是二字尾的大大,這時就很納悶,究竟是怎樣的成長環境造就了這等人才?果真個性影響一生的選擇,其成長過程並不是俗稱的速成路線,在年輕時期便經歷過家庭/求學/人生各種議題的摸索跟闖蕩,造就目前的成就,瞬間想起在研究單位的好友,高中時期半工半讀、大學碰到恩師,接著在最高學府闖蕩時,碰到不認同的教授就選擇放棄不讀 XD 真的佩服。

此外也回憶起自己的一些個性,像是本身是略悲觀主義,但是屬於那種把最差的情境思考後,反而更大膽去嘗試任何事,且任何事的起步並不是追求一步到位的完美,而是追求不斷修正去趨近想要的目標。恰恰好看到有類似個性的人,感到共鳴。

認識一個人,就像翻開一本書,翻開的那一瞬間,就無法再把書闔上了。所以,書要慎選,不要亂翻,以免不小心就被感動了。