AKB48 Google+投稿をゲットするスクリプトを作りました。
PythonからGoogle+へアクセスする方法自体は、各自さがしてください。
4つのスクリプトで構成しています。
1.gactget.py
google+ APIへアクセスするスクリプトです。
ユーザーIDと、MaxResultsを指定します。MaxResultsは1回のコールで何件取ってくるかというもの。
APIのアクセス数が制限されているので、これで様子を見ながら調整します。
2.settings.py
認証情報を別ソースで格納したもの。
安全のためにこうしてあります。一般的にこうやって別ソースにするみたいです。
3.gidlist.py
AKB48のgoogle+メンバー一覧サイトから、メンバーのIDを取得します。
beautifulsoupというモジュールを使ってスクレイピング(必要な文字列を切り出すこと)しています。
4.gactprint.py
上記3つのプログラムを使って、アクティビティ(twitterでいうとツイート、投稿のこと)を取得します。
#!/usr/local/pythonz/ENV/Python-2.7.3/bin/python
# coding: utf-8
import apiclient.discovery
import httplib2
import settings
import logging
import sys
#logging.basicConfig()
logging.getLogger().setLevel(getattr(logging, 'ERROR'))
def build_service(credentials, http, api_key=None):
if ( credentials != None ):
http = credentials.authorize(http)
service = apiclient.discovery.build('plus', 'v1', http=http, developerKey=api_key)
return service
def gact(ggtsid,maxr):
httpUnauth = httplib2.Http()
try:
serviceUnauth = build_service(None, httpUnauth, settings.API_KEY)
except:
print 'build_service err'
raise
try:
request = serviceUnauth.activities().list(userId=ggtsid, collection='public', maxResults = maxr)
except:
print 'serviceUnauth.activities().list err'
raise
activities = []
try:
activity = request.execute(httpUnauth)
except:
raise
activities += activity['items']
return activities
import os
# 1. Go to:
# https://code.google.com/apis/console
# 2. select choose your project.
# 3. Choose 'API Access'
# 4. If you have not generated a client id, do so.
# 5. Make your callback:
# http://localhost:8090
CLIENT_SECRET="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
CLIENT_ID="xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
API_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
#!bin/python
#coding: utf-8
from BeautifulSoup import BeautifulSoup #@UnresolvedImport
import urllib
def gidlist_make():
soup = BeautifulSoup(urllib.urlopen("http://www.google.com/intl/ja/+/project48/").read())
lisoup=[]
gidlist = []
for lisoup in soup.findAll("li"):
try:
gidlist.append(lisoup['data-gplusid'])
except:
continue
return gidlist
#!bin/python
# coding: utf-8
import sys
import logging
import apiclient.discovery
import httplib2
import settings
import re
import ggtsidset
import gactget
import gactmain
import gidlist
logging.getLogger().setLevel(getattr(logging, 'ERROR'))
if __name__=='__main__':
for ggtsid in gidlist.gidlist_make():
try:
activities = gactget.gact(ggtsid,5)
except:
print sys.exc_info()[1]
r = re.compile('Daily Limit Exceeded')
m = r.search(str(sys.exc_info()[1]))
if m is None:
errmsg = ''
else:
errmsg = str(m.group(0))
if errmsg == 'Daily Limit Exceeded':
print 'break,Daily Limit Exceeded'
print ggtsid
break
else:
continue
for activity in activities:
print activity['published']
print activity['updated']
print activity['actor']['displayName']
print activity['actor']['id']
print activity['object']['content']
if activity['object'].has_key('attachments'):
print activity['object']['attachments'][0]['url']
else:
continue
print activity['object']['replies']['totalItems']
print activity['object']['plusoners']['totalItems']
print activity['object']['resharers']['totalItems']
【工夫した点】
1.APIコール制限を越えたら処理を中断
一日のAPIコール制限を越えると、このようなエラーが帰ってきます。この場合はbreakするようにしています。
処理し続けると、制限を越え続けてしまいますので。
2.ログ出力レベルを制限
apiclient.discovery を使うと、Warningが結構でます。
logging.getLogger().setLevel(getattr(logging, 'ERROR'))というコードを追加して、出ないようにしています。今回の処理においては、これでも支障はありません。
3.IDの取得を自動化
これはちょっと頑張ったところです。
メンバー以外の関係者のIDを追加したい場合、gidlist.pyのfor lisoup in soup.findAll("li"):のループの後に、下記のようなコードを追加すればよいと思います。
gidlist.append('113474433041552257864') #やすす
gidlist.append('108897254135232129896') #よすす
gidlist.append('112435502021367429566') #しのぶ
gidlist.append('113091703821013997975') #木島
gidlist.append('103803814106571203433') #北川