B-Teck!

お仕事からゲームまで幅広く

【GAM/Python】Google Ad ManagerのAPIをPythonで叩く

サービスアカウント作成と連携

Google Ad Manager APIを利用するためにはOAuth2認証が必要。
いくつか方法があるけど今回はサービスアカウントを作成して認証されるようにします。

サービスアカウント作成

  • Google Cloud Platformのコンソールからサービスアカウントを作成します
  • 作成したサービスアカウントでjsonキーを作成します
    • このjsonは後にプログラムからAPIに疎通する際に利用します

Python用ライブラリを読み込む

googleads/googleads-python-lib

  • pipを推奨されてますがPoetryでも問題なく導入できました。
$ poetry add googleads
  • 先の手順で取得したjsonを credential.json として保存して参照しています。
from googleads import ad_manager
from googleads import oauth2
import os

# 認証ファイルのpathを取得
script_dir = os.path.dirname(__file__)
KEY_FILE = os.path.join(script_dir, 'credential.json')

# 任意のアプリケーション名
APPLICATION_NAME = 'sample'

def main(key_file, application_name):
    oauth2_client = oauth2.GoogleServiceAccountClient(
        key_file, oauth2.GetAPIScope('ad_manager'))

    ad_manager_client = ad_manager.AdManagerClient(
        oauth2_client, application_name)

    networks = ad_manager_client.GetService('NetworkService').getAllNetworks()
    for network in networks:
        print('Network with network code "%s" and display name "%s" was found.'
              % (network['networkCode'], network['displayName']))

if __name__ == '__main__':
    main(KEY_FILE, APPLICATION_NAME)

上記のコードを実行して
Network with network code "対象のネットワークコード" and display name "ネットワークの名称" was found.
が出力されれば疎通は成功です。
お疲れ様でした。

【Python】ResponderのQuickStartをやった

仕事で Responderを使うことになったのでQuick Startをやった。
合間に自分用のメモを書きつつ実装したので、メモがてら残しておく。

Responder導入

前の記事 でPoetryを導入しているので、下記コマンドを実行して導入した。

$ poetry add responder 

実装

# Declare a Web Service
import responder

api = responder.API()


# Hello World!
@api.route("/")
def hello_world(req, resp):
    resp.text = "hello, world!"


# Accept Route Arguments
@api.route("/hello/{who}")
def hello_to(req, resp, *, who):
    resp.text = f"hello, {who}!"


# Returning JSON / YAML
# resp.mediaに値を詰めるとJSONにシリアライズして返却する
# clientがyamlを要求してきた場合(Accept : application/x-yamlなど)はyamlを返す
@api.route("/hello/{who}/json")
def hello_to(req, resp, *, who):
    resp.media = {"hello": who}


# Rendering a Template
# テンプレートのhtmlはtemplates配下に入れる
# テンプレートの文字列は {{ variable }} の形で指定する
@api.route("/hello/{who}/html")
def hello_html(req, resp, *, who):
    resp.html = api.template('hello.html', who=who)


# Setting Response Status Code
@api.route("/416")
def teapot(req, resp):
    resp.status_code = api.status_codes.HTTP_416


# Setting Response Headers
@api.route("/pizza")
def pizza_pizza(req, resp):
    resp.headers['X-Pizza'] = '42'


# Receiving Data & Background Tasks
# process_dataをバックグラウンドで実行しながら即時レスポンスする
@api.route("/incoming")
async def receive_incoming(req, resp):

    @api.background.task
    def process_data(data):
        f = open('./{}'.format(data['file']['filename']), 'w')
        f.write(data['file']['content'].decode('utf-8'))
        f.close()

    data = await req.media(format='files')
    process_data(data)

    resp.media = {'success': True}


# Run the Server
if __name__ == '__main__':
    api.run()
    # address、 portを設定する場合
    # api.run(address='0.0.0.0', port=5042)

最後の Receiving Data & Background Tasks は、サンプルコードを /incoming に向くように変更して動作確認をした。

import requests
data = {'file': ('hello.txt', 'hello, world!', "text/plain")}
r = requests.post('http://127.0.0.1:5042/incoming', files=data)
print(r.text)

f:id:beatdjam:20210413203322p:plain

【Python】pyenv + Poetry + IntelliJでPythonの開発環境を構築する

Mac向けです。
brewはインストール済みの前提で進めます。

pyenvインストール

macOS Catalina zsh環境でpyenvを使ってPython 3.9.0をインストール
コマンド - Poetry documentation (日本語訳)

$ brew install pyenv

.zshrcに追記

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

インストール可能なバージョン一覧を確認、インストール

$ pyenv install --list
$ pyenv install 3.9.4
$ pyenv global 3.9.4

Poetryインストール

M1 Macにpyenv+Poetryをインストールする | mktia's note

$ curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python -

作成済みのリポジトリの場合

$ cd ${path} 
$ poetry init

新しくリポジトリを作る場合

$ poetry new ${path}

IntelliJでPoetryを使う

  1. Poetryのプラグイン をインストールする
  2. File > Project Structureを開く
    1. Project Settings -> Project を開く
    2. Project SDK -> Add SDK -> Python SDKを開く
    3. Poetry Environment -> Existing Environment Interpreterから利用したいvenvを指定
  3. Run > Edit Configrations > +(Add New Configrations)
    1. Pythonを選択
    2. Configration > Script Pathでアプリケーションのエントリポイントを指定