用Python的Django框架编写从Google Adsense中获得报表的应用
作者:goldensun 发布时间:2022-10-01 13:20:07
我完成了更新我们在 Neutron的实时收入统计。在我花了一周的时间完成并且更新了我们的PHP脚本之后,我最终认决定开始使用Python进行抓取,这是值得我去花费我的时间和精力的事情。我建立了一个 Django程序,它可以从不同的来源存储收入统计,我可以用这些去简历视图和用于统计工具的API。
所以在过去的几天里,我写了一个脚本,它可以登入到其他的网页并抓取数据,或者,如果这些网页有 API,可以直接访问 API。我发现了一些事情。
1.requests >httplib2(requests多于httplib2);
2.SOAP很糟糕,但它至少是一个API,Suds使SOAP好一点。我了解到SOAP是我说知道的API中,唯一一个完全基于.net开发的。
3.Beautiful Soup是一个很好的求助对象;
4.我确实十分惊讶,这么多企业能在如此蹩脚的技术中生存下来。
我拯救了 Google Adsense,他们将会拥有最好的API,并且因此成为最简单的实现。他有着比我预想的要多的挑战。显然你无法仅仅插入用户名/密码或是APIkey去获取获得进入API的入口,你必须完成整个Oauth2的握手流程。
不幸的是,我发现文档不如我希望过得那样容易查询。我发现了很多死链接。我认为,在这方面Google的人应该做的更好。例如,在他们的up to date developer docs文档中,我发现他们指出了broken link to read more about authentication and authorization。(好的,多么奇怪,我尽快提交了这个问题,这个链接终于开始工作了,我猜你会感谢我。)
所以,这篇博客将尝试记录从Adsense获取报表到我的Django应用的过程。
为了使用Google的API来访问Adsense报表,你需要使用Adsense Management API. 这个API只提供OAuth,所以你需要在浏览器中至少完成一次认证过程,来获取你的证书,然后你可以保存这些证书来进行下一步操作。说实话,我已经听说过OAuth很多次了,但是直到现在,我在实践中仍没有需要来使用它。所以我是边做边学,并欢迎大家留言指出我说的不对的地方。
就我所知,Google对于它的各种产品都拥有一个庞大的API。在研究Adsense之前,你需要在Google API 控制台注册你的应用。我已经成功注册了我的应用。因为我还没有一个可用的URL地址,我现在暂时使用我的开发URL(localhost:8000)。它运作起来似乎正常。并使用提供的这个链接下载JSON文件。
还有,当你管理你的APIs的时候,你需要打开服务选项卡,打开AdSense Management API选项。否则,当你尝试发送请求的时候,你会得到一个错误消息“Access Not Configured”。
Google已经创建了一个Python 客户端库,你可以轻易的通过pip来安装这个库。它还包含一个Django样例项目,这个项目使用这个库实现OAuth2的握手过程。我想,它是使用Django 1.1编写的(因为在写这个项目的时候,Django 1.5才刚刚发布),所以它可能有点过时,但是它可是一个好的开始点。
我的应用很简单。我只需要读取指定日期的收益金额,并保存到我的本地数据库。
我在djaongo项目中创建了一个新的应用,叫做“adsense”。并创建了一个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文件放到我的应用的文件夹下面,并创建了一个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 文件中我包含了一个链接指向我的应用的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'),
)
最后,创建了一个通过给定日期调用API并获取收益的类。它放在adsense/tasks.py,因为我准备把它当作任务,钩在 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帐号。我为我的应用授权来访问Adsense。然后,认证证书就会保存在我的本地数据库,然后我可以调用Scraper get_report() 方法。祝贺我吧!。它能顺利工作了。
猜你喜欢
- 今天给大家推荐一款很好用的Python编辑器,全世界90%Python开发者都会用的开发工具------Pycharm,完全免费哦1. 百度
- 最近一直在用Vs2013调试编译opencv,意外发现一个超级赞的图片查看的插件, 超级方便易用的一个插件,直接以图片形式可视化了openc
- 对于个人网站来说,受到建站条件的制约,Access数据库成了广大个人网站站长的首选。然而,Access数据库本身存在很多安全隐患,攻击者一旦
- IE6这个东东在前端开发者的眼中恐怕都是一个恶梦之地,我说它万恶想来没人反对吧。依据现在卡当网的访问统计数据来看,从IE6来的访问量还是占到
- 推荐阅读:go语言最新版激活教程可以点下这个链接查看。goland永久安装教程,点击此处查看。Go 这几年很火,小哈也蹭业余时间悄 * 学习一
- LoadRunner监控MySQLhttp://www.docin.com/p-92272846.htmlAdvanced MySQL Pe
- QL Server事件探查器(Profiler)可以帮助数据库管理员跟踪SQL Server数据库所执行的特定事件,监视数据库的行为;并将这
- PyQt5布局控件QHBoxLayout简介采用QBOXLayout类可以在水平和垂直方向上排列控件,QHBoxLayout和QVBoxLa
- 要使用多个定界符拆分字符串:使用 re.split() 方法,例如 re.split(r',|-', my_str)。re.
- 一、卷积神经网络卷积神经网络(ConvolutionalNeuralNetwork,CNN)最初是为解决图像识别等问题设计的,CNN现在的应
- Office家族成员中,人们对于Access 2000的了解,往往只局限在它的操作界面中,对于数据库管理的功能仍只是停留在建立表、数据输入、
- 由于本人使用的是windows 10 操作系统,所以介绍在 windows 10 系统中安装 Anaconda3 的过程。下载Anacond
- 许多共享主机的服务提供商不允许运行你自己的服务进程,也不允许修改 httpd.conf 文件。 尽管如此,仍然有可能通过Web服务器产生的子
- 排序,是许多编程语言中经常出现的问题。同样的,在Python中,如何是实现排序呢?(以下排序都是基于列表来实现)一、使用Python内置函数
- 先来看一下效果吧,只要有足够的照片素材,捕获女神的心就指日可待怎么样,看起来还可以吧下面就一起来完成吧数据准备首先是测试图片的获取,毕竟萝卜
- DBA_2PC_PENDING Oracle会自动处理分布事务,保证分布事务的一致性,所有站点全部提交或全部回滚。一般情况下,处理过程在很短
- 1. 引言Python是一种强大的编程语言,有很多内置的功能来处理文本。然而,有时候,我们需要处理的文本非常复杂,而Python内置的功能可
- 要开发一个基于数据库的应用系统,其中最关键的一步就是整个系统所依据的数据库的建模设计,从逻辑的到物理的,一个环节疏于设计,整个的应用系统便似
- 继续flask的学习之旅。今天介绍flask的登陆管理模块,还记得上一篇中的blog小项目么,登录是咱们自己写的验证代码,大概有以下几个步骤
- 本文实例为大家分享了python之pygame模块实现飞机大战的具体代码,供大家参考,具体内容如下Python飞机大战步骤:1.数据区2.主