AKB48 Google+投稿をゲットする

AKB48 Google+投稿をゲットするスクリプトを作りました。
PythonからGoogle+へアクセスする方法自体は、各自さがしてください。

４つのスクリプトで構成しています。
１．gactget.py
google+ APIへアクセスするスクリプトです。
ユーザーIDと、MaxResultsを指定します。MaxResultsは１回のコールで何件取ってくるかというもの。
APIのアクセス数が制限されているので、これで様子を見ながら調整します。

２．settings.py
認証情報を別ソースで格納したもの。
安全のためにこうしてあります。一般的にこうやって別ソースにするみたいです。

３．gidlist.py
AKB48のgoogle+メンバー一覧サイトから、メンバーのIDを取得します。
beautifulsoupというモジュールを使ってスクレイピング（必要な文字列を切り出すこと）しています。

４．gactprint.py
上記３つのプログラムを使って、アクティビティ（twitterでいうとツイート、投稿のこと）を取得します。

```gactget.py

#!/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
```

```settings.py

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"

```
```gidlist.py
#!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

```

```gactprint.py
#!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']

```

【工夫した点】
１．APIコール制限を越えたら処理を中断
一日のAPIコール制限を越えると、このようなエラーが帰ってきます。この場合はbreakするようにしています。
処理し続けると、制限を越え続けてしまいますので。
<HttpError 403 when requesting https://www.googleapis.com/plus/v1/people/117147321771860727748/activities/public?alt=json&key=AIzaSyDgX5DQ0s8jnuMWKyWI0IfvO-YA8pNpNb4&maxResults=5 returned "Daily Limit Exceeded">

２．ログ出力レベルを制限
apiclient.discovery　を使うと、Warningが結構でます。
logging.getLogger().setLevel(getattr(logging, 'ERROR'))というコードを追加して、出ないようにしています。今回の処理においては、これでも支障はありません。

３．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') #北川