httpli" />

欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

用Python的Django框架編寫從Google Adsense中獲得報表

系統(tǒng) 1817 0

?我完成了更新我們在 Neutron的實時收入統(tǒng)計。在我花了一周的時間完成并且更新了我們的PHP腳本之后,我最終認決定開始使用Python進行抓取,這是值得我去花費我的時間和精力的事情。我建立了一個 Django程序,它可以從不同的來源存儲收入統(tǒng)計,我可以用這些去簡歷視圖和用于統(tǒng)計工具的API。

所以在過去的幾天里,我寫了一個腳本,它可以登入到其他的網(wǎng)頁并抓取數(shù)據(jù),或者,如果這些網(wǎng)頁有 API,可以直接訪問 API。我發(fā)現(xiàn)了一些事情。

1.requests >httplib2(requests多于httplib2);

2.SOAP很糟糕,但它至少是一個API,Suds使SOAP好一點。我了解到SOAP是我說知道的API中,唯一一個完全基于.net開發(fā)的。

3.Beautiful Soup是一個很好的求助對象;

4.我確實十分驚訝,這么多企業(yè)能在如此蹩腳的技術(shù)中生存下來。
?

我拯救了 Google Adsense,他們將會擁有最好的API,并且因此成為最簡單的實現(xiàn)。他有著比我預(yù)想的要多的挑戰(zhàn)。顯然你無法僅僅插入用戶名/密碼或是APIkey去獲取獲得進入API的入口,你必須完成整個Oauth2的握手流程。

不幸的是,我發(fā)現(xiàn)文檔不如我希望過得那樣容易查詢。我發(fā)現(xiàn)了很多死鏈接。我認為,在這方面Google的人應(yīng)該做的更好。例如,在他們的up to date developer docs文檔中,我發(fā)現(xiàn)他們指出了broken link to read more about authentication and authorization。(好的,多么奇怪,我盡快提交了這個問題,這個鏈接終于開始工作了,我猜你會感謝我。)


所以,這篇博客將嘗試記錄從Adsense獲取報表到我的Django應(yīng)用的過程。

為了使用Google的API來訪問Adsense報表,你需要使用Adsense Management API. 這個API只提供OAuth,所以你需要在瀏覽器中至少完成一次認證過程,來獲取你的證書,然后你可以保存這些證書來進行下一步操作。說實話,我已經(jīng)聽說過OAuth很多次了,但是直到現(xiàn)在,我在實踐中仍沒有需要來使用它。所以我是邊做邊學,并歡迎大家留言指出我說的不對的地方。

就我所知,Google對于它的各種產(chǎn)品都擁有一個龐大的API。在研究Adsense之前,你需要在Google API 控制臺注冊你的應(yīng)用。我已經(jīng)成功注冊了我的應(yīng)用。因為我還沒有一個可用的URL地址,我現(xiàn)在暫時使用我的開發(fā)URL(localhost:8000)。它運作起來似乎正常。并使用提供的這個鏈接下載JSON文件。

還有,當你管理你的APIs的時候,你需要打開服務(wù)選項卡,打開AdSense Management API選項。否則,當你嘗試發(fā)送請求的時候,你會得到一個錯誤消息“Access Not Configured”。


Google已經(jīng)創(chuàng)建了一個Python 客戶端庫,你可以輕易的通過pip來安裝這個庫。它還包含一個Django樣例項目,這個項目使用這個庫實現(xiàn)OAuth2的握手過程。我想,它是使用Django 1.1編寫的(因為在寫這個項目的時候,Django 1.5才剛剛發(fā)布),所以它可能有點過時,但是它可是一個好的開始點。

我的應(yīng)用很簡單。我只需要讀取指定日期的收益金額,并保存到我的本地數(shù)據(jù)庫。

我在djaongo項目中創(chuàng)建了一個新的應(yīng)用,叫做“adsense”。并創(chuàng)建了一個models.py文件來存儲認證證書。
?

            
from django.contrib.auth.models import User
from django.db import models
from oauth2client.django_orm import CredentialsField
 
class Credential(models.Model):
  id = models.ForeignKey(User, primary_key=True)
  credential = CredentialsField()
 
class Revenue(models.Model):
  date = models.DateField(unique=True)
  revenue = models.DecimalField(max_digits=7, decimal_places=2)
 
  def __unicode__(self):
    return '{0} ${1}'.format(self.date, self.revenue)

          


我把從API控制臺下載的JSON文件放到我的應(yīng)用的文件夾下面,并創(chuàng)建了一個views.py文件

?

            
import os
 
from django.conf import settings
from django.contrib.auth.decorators import login_required
from django.contrib.sites.models import Site
from django.http import HttpResponseBadRequest, HttpResponse
from django.http import HttpResponseRedirect
from oauth2client import xsrfutil
from oauth2client.client import flow_from_clientsecrets
from oauth2client.django_orm import Storage
 
from .models import Credential
 
CLIENT_SECRETS = os.path.join(os.path.dirname(__file__), 'client_secrets.json')
 
FLOW = flow_from_clientsecrets(
  CLIENT_SECRETS,
  scope='https://www.googleapis.com/auth/adsense.readonly',
  redirect_uri='http://{0}/adsense/oauth2callback/'.format(
    Site.objects.get_current().domain))
 
@login_required
def index(request):
  storage = Storage(Credential, 'id', request.user, 'credential')
  credential = storage.get()
  if credential is None or credential.invalid is True:
    FLOW.params['state'] = xsrfutil.generate_token(settings.SECRET_KEY,
                            request.user)
    authorize_url = FLOW.step1_get_authorize_url()
    return HttpResponseRedirect(authorize_url)
  else:
    return HttpResponse('Already validated.')
 
@login_required
def auth_return(request):
  if not xsrfutil.validate_token(settings.SECRET_KEY,
                  request.REQUEST['state'], request.user):
    return HttpResponseBadRequest()
  credential = FLOW.step2_exchange(request.REQUEST)
  storage = Storage(Credential, 'id', request.user, 'credential')
  storage.put(credential)
  return HttpResponseRedirect("/")

          

在 urls.py 文件中我包含了一個鏈接指向我的應(yīng)用的url文件

            
main urls.py:
 
from django.conf.urls import patterns, include, url
from django.contrib import admin
 
admin.autodiscover()
 
urlpatterns = patterns(
  '',
  url(r'^adsense/', include('adsense.urls', namespace='adsense')),
 
  url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
  url(r'^admin/', include(admin.site.urls)),
)

adsense/urls.py:
 
from django.conf.urls import patterns, url
 
urlpatterns = patterns(
  'adsense.views',
  url(r'^$', 'index', name='index'),
  url(r'^oauth2callback/$', 'auth_return', name='auth_return'),
)


          

最后,創(chuàng)建了一個通過給定日期調(diào)用API并獲取收益的類。它放在adsense/tasks.py,因為我準備把它當作任務(wù),鉤在 Celery/ RabbitMQ之上。
?

            
import datetime
import httplib2
 
from apiclient.discovery import build
from django.contrib.auth.models import User
from oauth2client.django_orm import Storage
 
from .models import Credential, Revenue
 
TODAY = datetime.date.today()
YESTERDAY = TODAY - datetime.timedelta(days=1)
 
class Scraper(object):
  def get_report(self, start_date=YESTERDAY, end_date=TODAY):
    user = User.objects.get(pk=1)
    storage = Storage(Credential, 'id', user, 'credential')
    credential = storage.get()
    if not credential is None or credential.invalid is False:
      http = httplib2.Http()
      http = credential.authorize(http)
      service = build('adsense', 'v1.2', http=http)
      reports = service.reports()
      report = reports.generate(
        startDate=start_date.strftime('%Y-%m-%d'),
        endDate=end_date.strftime('%Y-%m-%d'),
        dimension='DATE',
        metric='EARNINGS',
      )
      data = report.execute()
      for row in data['rows']:
        date = row[0]
        revenue = row[1]
 
        record = Revenue()
        try:
          r = Revenue.objects.get(date=date)
          pk = r.id
        except Revenue.DoesNotExist:
          pk = None
        record.id = pk
        record.date = date
        record.revenue = revenue
        record.save()

          

為了讓它能工作起來,我在瀏覽器打開http://localhost:8000/adsense/。這時候會要求我登錄Google帳號。我為我的應(yīng)用授權(quán)來訪問Adsense。然后,認證證書就會保存在我的本地數(shù)據(jù)庫,然后我可以調(diào)用Scraper get_report() 方法。祝賀我吧!。它能順利工作了。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产精品久久久久9999高清 | 色综合久久综合欧美综合 | 久久一| 草莓视频69 | 国产精品福利短视在线播放频 | 色综合亚洲色综合久久网张柏芝 | a毛片在线看免费观看 | 久在线| 91精品国产91久久久久久最新 | 五月婷婷狠狠干 | 天天色影 | 久草免费在线观看 | 日韩欧美亚洲综合 | 欧美日韩国产手机在线观看视频 | 美女羞羞视频网站 | 这里只有精品在线视频观看 | 久久久九九精品国产毛片A片 | 嫩草影院在线入口 | 综合电影网 | 欧美一级www | 欧美色欧美亚洲高清在线视频 | 国产成人自拍一区 | 久久久久成人精品免费播放动漫 | 欧美国产一区二区 | 午夜视频在线观看www中文 | 国产日韩精品一区 | 国产精品国产精品国产专区不卡 | 国产一区二区三区在线电影 | 久久久www成人免费精品 | 国产成人综合一区二区三区 | 婷婷综合 | 日韩福利视频导航 | 国产精品影视 | 亚洲一区二区三区91 | 91污网站| 成人精品视频一区二区三区 | 全黄性性激高免费视频 | 国产91网| 浮力影院草草影院 | 日本在线播放一区二区 | 欧美日韩国产成人在线 |