Kenny Chang
ヒガシの日常
Published in
10 min readMay 31, 2019

--

Python | 發布第一個Python套件 — GAQL Tool

GAQL 可以吃嗎?

數位廣告小記事

2018年中 ,Google AdWords 被改名為 Google Ads,為嶄新的一個產品。
2019年初,新版的 Google Ads API v1 已經釋出可供生產環境使用。

2000年10月23日,Google AdWords 問世,相信不管是 Google 或是Facebook 等主流網路科技公司,廣告收入一定是不可或缺的主要收入來源之一,依據科技的蓬勃發展,從搜尋、廣告聯播網、到影片廣告….等,廣告的形式變得很多元,也越來越多公司相繼投入數位廣告圈,所以Google Ads 的推出,也是為了因應不同的廣告形式,還有不斷更新本身廣告系統的架構,讓更多的想要自行發展廣告業務的公司可以花較少學習成本建立本身公司的廣告技術。

GAQL是什麼?

相信開始接觸 Google Ads 文件的開發者大神們,第一步就是建立 OAuth2 credentials,從建立 Google API Console 憑證、申請廣告帳戶API中心、使用Client Library…等,(詳細步驟我就不太贅述,文件寫得很清楚),然後當我使用 Python 的 Client Library,開始需要取得廣告帳戶的資訊,發現比起Google AdWords利用 selector 新版的Ads API 是大量依靠著 GAQL (Google Ads Query Language)去下參數取得資料,這部分跟AWQL(AdWords Query Language)很像,但又不一樣。

哪裡很像?

很像的地方在於超像SQL語法(但只是超像不完全一樣)

AWQL | 完整文件

SELECT CampaignId, AdGroupId, Impressions, Clicks, Cost
FROM ADGROUP_PERFORMANCE_REPORT
WHERE AdGroupStatus IN [ENABLED, PAUSED]
DURING LAST_7_DAYS

GAQL | 完整文件

SELECT campaign.id, campaign.name, campaign.status, metrics.impressions
FROM campaign
WHERE campaign.status = 'PAUSED' AND metrics.impressions > 1000
ORDER BY campaign.id

哪裡不一樣?

  1. AWQL 完全是為了報表所設計的 Query Language,但GAQL是不管報表或是廣告資源的內容都可以一次拿到,超佛心 der。
  2. AWQL 只能針對單一的報表型態進行Query的執行,但GAQL則可以混用且跨越不同報表跟關聯到所需的廣告資源。

開始套件開發的第一步

git 什麼的就不說了,我知道你會找到相關的文章!

專案檔案結構
  • setup.py: 最重要的一個檔案,主要紀錄此package 的參數與基本資訊。
  • setup.cfg: setup.py 的配置文件。
  • README.md: 基本說明文檔。
  • MANIFEST.in: 紀錄某些需要被打包但未被 setup.py 包含的文件, The MANIFEST.in template

主要會依賴 setuptool 包,請先設定好相關的檔案與測試。

這裡大概簡易說明一下我的套件架構

  1. 首先主要的套件程式碼會放在 /gaql_buidler/main.py 裡面屏且同層帶有__init__.py檔,可以讓外層引用內層檔案,且裡面會將main中的class export出去。
  2. 我這裡適用pytest當作測試工具,並且將test case放在 /tests 目錄底下。
  3. 最外層請依照你的配置需求配置檔案,我這裏結合travis ci 與其他細項設定檔案。
  4. requirement.txt 是記錄你這套件使用到哪些相依的套件。
from setuptools import setup, find_packages
from codecs import open
tests_require = [
'pytest >= 4.4'
]
setup(
name="gaql-builder",
version="1.0.1",
author="Shao-Tung Change",
author_email="yo8568@gmail.com",
description="Generating GAQL tool",
long_description=open("README.md", "r").read(),
long_description_content_type="text/markdown",
url="https://github.com/yo8568/gaql-builder",
packages=find_packages(exclude=['tests', 'test_*']),
tests_require=tests_require,
entry_points={
'console_scripts': [
'gaql_builder=gaql_builder:main'
],
},
classifiers=(
'Programming Language :: Python',
'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6',
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
),
)
  • name: 此套件名稱。
  • version: 版本號。
  • keywords: 套件關鍵字。
  • description: 套件簡介。
  • long_description: 套件詳細說明。
  • author: 作者名稱。
  • author_email: 作者信箱。
  • url: 套件的 homepage。
  • packages: 套件中包括的 python package。
  • license: 如 MIT, APACHE, GNU 等。
  • classifier: 紀錄有關此套件的其他metadata。

欄位說明可參見官方文檔

Travis CI

結合Travis CI 可以在每次上commit後,幫你跑測試且通知是否成功。

官方文件

language: pythonpython:
- 3.5.3
install:
- pip3 install -r requirements.txt
notifications:
email:
recipients:
- yo8568@gmail.com
on_success: always
on_failure: always
script: python3 -m pytest --cov=.

重要的步驟來了 --> 下指令時間

當然,你必須先完成你的套件主程式,與設定完其他相關設定檔。

  1. 確認您已安裝最新版本的 setuptools wheel
python3 -m pip install --user --upgrade setuptools wheel

2. 在setup.py那一層去執行以下指令

$ python3 setup.py sdist bdist_wheel

就會看到生成出 dist/ 目錄且下面有 whl檔 與 tar.gz 壓縮檔

The tar.gz file is a source archive whereas the .whl file is a built distribution. (官方說的)

3. 要上傳你的whl檔到 https://pypi.org

請先註冊一下帳號,有測試版網站與正式版網站,可以先試著用測試版網站去做上傳測試的練習。

測試版

正式版

註冊登入後,請安裝Twine 會利用此工具上傳你的套件。

$ python3 -m pip install --user --upgrade twine

上傳wheel

# 第一次上傳
$ python3 -m twine register dist/gaql_builder-1.0.1-py3-none-any.whl
# 第二次以後上傳
$ python3 -m twine upload dist/gaql_builder-1.0.2-py3-none-any.whl

然後依序鍵入相關資料

完成!Congratulations!

可以快到你的套件所在地去看看,快看我的XD

你應該可以順利的安裝到你的應用裡了,可以試試下列語法(騙下載數

$ pip3 install gaql-builder

此套件程式碼

References

_____________________ 覺得實用給個Clap吧!_________________________

follow my GitHub Linkedin

--

--