Google Analytics の
個人的な
この記事の 注意点(残念な ポイント)
下記の
しかしながら、
おそらく、
ただ、
前提
以下の
OS
CentOS release 6.9 (Final)Python Version
Python 2.7.8Package (必要そうな
ものだけ 抜粋)
Django (1.10.7)
Mezzanine (4.2.3)
Goolge Analytics の 参考記事
コンテンツ データ - アナリティクス ヘルプ
コンテンツ データ インポートの公式ガイド Google Analyticsで
コンテンツの 属性情報を 使った 分析を 行う | GMOメディア エンジニアブログ
コンテンツ データをインポートする 際の 手順を 一通り 解説してくれています。 はじめての
アナリティクス API: サービス アカウント向け Python クイック スタート | アナリティクス Management API | Google Developers
Management API のガイド アップロード: uploadData | アナリティクス Management API | Google Developers
Management API のuploadData の 解説 Using OAuth 2.0 for Server to Server Applications | API Client Library for Python | Google Developers
キーファイルとしてjson を 使用する 際の 参考に した 文書 [Python] Google各種サービスの
APIの 認証方法(v.2) - YoheiM .NET
キーファイルとしてjson を 使用する 際の 参考に した 記事
Django/Mezzanine の 参考記事
Django ORM の
select_related, prefetch_related の 挙動を 詳しく 調べてみた - akiyoko blog
個人的に、初めてDjango で Table Join 的な ことを するので、 知らなかったですが、 select_related, prefetch_related メソッドが あり、 それで Join っぽい ことを するようです。 せんかくらみ(Pythonの
覚え 書き): 日付を ファイル名に したい
日付を含む ファイル名を 作り出す。
手順
以下の
メタデータと
して インポートする 項目の 決定 Google Analytics に
カスタムディメンションを 作成する インポート用 CSV作成スクリプトの
実装 Google Analytics に
データの インポート Google Analytics API 経由で、
データを インポートする
1. メタデータと して インポートする 項目の 決定
BlogPostの 項目の 確認
Mezzanine の
Django shellの
起動 python2.7 manage.py shell
Modelの
フィールド一覧を 出力 以前も>>> from __future__ import print_function >>> from mezzanine.blog.models import BlogPost >>> for field in BlogPost._meta.get_fields(): ... print(field) ... blog.BlogPost.id blog.BlogPost.comments_count blog.BlogPost.keywords_string blog.BlogPost.rating_count blog.BlogPost.rating_sum blog.BlogPost.rating_average blog.BlogPost.site blog.BlogPost.title blog.BlogPost.slug blog.BlogPost._meta_title blog.BlogPost.description blog.BlogPost.gen_description blog.BlogPost.created blog.BlogPost.updated blog.BlogPost.status blog.BlogPost.publish_date blog.BlogPost.expiry_date blog.BlogPost.short_url blog.BlogPost.in_sitemap blog.BlogPost.content blog.BlogPost.user blog.BlogPost.allow_comments blog.BlogPost.featured_image blog.BlogPost.categories blog.BlogPost.related_posts blog.BlogPost.rating blog.BlogPost.comments blog.BlogPost.keywords >>>
同じことを やった 覚えが あります。
メタデータに 出力する 項目の 抜粋
以下の
blog記事の
URL
これは、BlogPost#get_absolute_url() で 取得します。
Google Analytics 上でのキー値に します。 BlogPost.id
一応キー値なので出力して おきます。 BlogPost.user
Blogの投稿者です。
私一人ですが、出力して おきます。 BlogPost.description
記事のDescriptionです。
表示数に対して クリック数が 少ない 時に 意図しない 説明文に なっていないかを 確認できるかと 思います。
出力します。BlogPost.created
作成日時、更新日時と セットで 出力する ことで、 その 後の メンテナンス状況を 確認できるかと BlogPost.updated
更新日時、作成日時と セットで 出力します。 BlogPost.categories
ブログ記事のカテゴリを 取得します。
ブログ記事とカテゴリの 関係は N対Nに なります。
Google Analytics 上でどう 扱えばいいのか 現状わかってないのですので 一旦、 名称の 昇順で ;
区切りで出力するようにします。
2. Google Analytics に カスタムディメンションを 作成する
手順に
ここでは、
カスタムディメンション
以下の
範囲はヒット
で
スキーマ定義
スキーマの
ディメンションの
ディメンションキー値 | ディメンション名 |
---|---|
ga:pagePath | キー値 |
ga:dimension1 | blogPostId |
ga:dimension4 | blogPostUser |
ga:dimension2 | blogPostDescription |
ga:dimension3 | blogPostCreated |
ga:dimension5 | blogPostUpdated |
ga:dimension6 | blogPostCategories |
3. インポート用 CSV作成スクリプトの 実装
インポート用の
Django コマンドと
- export_blog_metadata.py
# coding: utf-8 from __future__ import print_function from django.core.management.base import BaseCommand from mezzanine.blog.models import BlogPost import datetime import csv header = ("ga:pagePath","ga:dimension1","ga:dimension4","ga:dimension2","ga:dimension3","ga:dimension5","ga:dimension6") class Command(BaseCommand): help = "Export Blog MetaData as CSV" def handle(self, *args, **options): # ファイル名を生成する now = datetime.datetime.now() file_name = (now.strftime("blog_meta_%Y%m%d%H%M%S.csv")) with open(file_name, "w") as file: writer = csv.writer(file,quoting=csv.QUOTE_ALL) writer.writerow(header) # カテゴリとBlogPostの関係が多対多なので、prefetch_relatedで取得 blog_posts = BlogPost.objects.select_related('user').prefetch_related('categories') for blog_post in blog_posts: row = [] row.append(blog_post.get_absolute_url()) row.append(blog_post.id) row.append(blog_post.user.username.encode('utf8')) row.append(blog_post.description.replace("\n","|||").replace("\r","").encode('utf8')) row.append(blog_post.created) row.append(blog_post.updated) categories = blog_post.categories.all() sorted(categories) elems = [] for category in categories: elems.append(category.title.encode('utf8')) row.append(";".join(elems)) writer.writerow(row)
4. Google Analytics に データの インポート
Google Analyticsで
CSVの
descriptionに|||
に
row.append(blog_post.description.replace("\n","|||").replace("\r","").encode('utf8'))
5. Google Analytics API 経由で、 データを インポートする
3. インポート用 CSV作成スクリプトの<wbr>実装
のManagement API
経由で
前提とgoogle-api-python-client
を
pip インストール
% sudo pip install --upgrade google-api-python-client Installing collected packages: httplib2, uritemplate, pyasn1, rsa, pyasn1-modules, oauth2client, google-api-python-client Successfully installed google-api-python-client-1.6.3 httplib2-0.10.3 oauth2client-4.1.2 pyasn1-0.3.4 pyasn1-modules-0.1.4 rsa-3.4.2 uritemplate-3.0.0
変更後の スクリプト
Management API を
{your_...}
の
export_blog_metadata.py
# coding: utf-8 from __future__ import print_function from django.core.management.base import BaseCommand from mezzanine.blog.models import BlogPost import datetime import csv header = ("ga:pagePath","ga:dimension1","ga:dimension4","ga:dimension2","ga:dimension3","ga:dimension5","ga:dimension6") class Command(BaseCommand): help = "Export Blog MetaData as CSV" def handle(self, *args, **options): # ファイル名を生成する now = datetime.datetime.now() file_name = (now.strftime("blog_meta_%Y%m%d%H%M%S.csv")) with open(file_name, "w") as file: writer = csv.writer(file,quoting=csv.QUOTE_ALL) writer.writerow(header) # カテゴリとBlogPostの関係が多対多なので、prefetch_relatedで取得 blog_posts = BlogPost.objects.select_related('user').prefetch_related('categories') for blog_post in blog_posts: row = [] url = blog_post.get_absolute_url() # エンコードされたデータを取り込んだが、反映されないので、デコードをしてみたがやはり反映されない。 import urllib2 url = urllib2.unquote(url).encode('raw_unicode_escape') row.append(url) row.append(blog_post.id) row.append(blog_post.user.username.encode('utf8')) row.append(blog_post.description.replace("\n","|||").replace("\r","").encode('utf8')) row.append(blog_post.created) row.append(blog_post.updated) categories = blog_post.categories.all() sorted(categories) elems = [] for category in categories: elems.append(category.title.encode('utf8')) row.append(";".join(elems)) writer.writerow(row) try: from apiclient.discovery import build from oauth2client.service_account import ServiceAccountCredentials from httplib2 import Http key_file_location = "{your_json_key}" scopes = ['https://www.googleapis.com/auth/analytics.edit'] credentials = ServiceAccountCredentials.from_json_keyfile_name(key_file_location, scopes=scopes) http_auth = credentials.authorize(Http()) service = build('analytics', 'v3', http=http_auth) # Note: This code assumes you have an authorized Analytics service object. # See the Data Import Developer Guide for details. # This request uploads a file custom_data.csv to a particular customDataSource. # Note that this example makes use of the MediaFileUpload Object from the # apiclient.http module. from apiclient.http import MediaFileUpload import urllib2 try: media = MediaFileUpload(file_name, mimetype='application/octet-stream', resumable=False) daily_upload = service.management().uploads().uploadData( accountId="{your_account_id}", webPropertyId='{your_property_id}', customDataSourceId='{your_datasource_id}', media_body=media).execute() except TypeError, error: # Handle errors in constructing a query. print('There was an error in constructing your query : %s' , error) except urllib2.HTTPError, error: # Handle API errors. print('There was an API error : %s : %s', error.resp.status, error.resp.reason) finally: import os os.remove(file_name)
Management API の
version に ついて
Analytics API のversion は v4 リリースされていますが、 Management API は v3 に 含まれています。
このため、 とservice = build('analytics', 'v3', http=http_auth)
いう 記述に なります。 アップロードファイル名に
ついて
以下の実装で Management API 経由で アップロードすると、 ファイル名が 不明な<wbr>ファイル名
になります。 ドキュメントをdaily_upload = service.management().uploads().uploadData( accountId="{your_account_id}", webPropertyId='{your_property_id}', customDataSourceId='{your_datasource_id}', media_body=media).execute()
見る 限り 設定する パラメータは なさそうで 少し 調べてみたのですが、 以下 StackOverFlow の 記事を 見つけました。
php - File name in uploadData Google Analytics - Stack Overflow
上記はphp ですが、 設定する APIが なく Issue と して 登録されているようで、 WEB API を 直接叩く 例が 記載されています。
私はそこまで ファイル名を 設定したい 思いは なかったので、 不明な<wbr>ファイル名
のままで いく ことにしました。 取り
込みが うまくいかないので、 URLを デコードしてみた インポート後、# エンコードされたデータを取り込んだが、反映されないので、デコードをしてみたがやはり反映されない。 import urllib2 url = urllib2.unquote(url).encode('raw_unicode_escape') row.append(url)
紐付けが うまくいかなかったので、 試しに エンコードされたURLを デコードしてみましたが、 やはりうまく いきませんでした。。
発生した エラー
- 403エラー JSONキーを
googleapiclient.errors.HttpError: <HttpError 403 when requesting https://www.googleapis.com/upload/analytics/v3/management/accounts/uploads?uploadType=media&alt=json returned "Access Not Configured. Google Analytics API has not been used in project xxxxxxxxxxxxx before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/analytics.googleapis.com/overview?project=xxxxxxxxxxxxxx then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.">
発行した アカウントに、 Google Analytics の 権限を 付与して おらず、 上記エラーが 発生しました。
アカウントを追加し、 権限と して 編集, 共有設定, 表示と<wbr>分析
を付与しました。
まとめ
Google Analytics の
CSVの
と
どなたか
カスタムディメンション自体の
以上です。
コメント