LoginSignup
3
3

More than 5 years have passed since last update.

AKB48 Google+投稿をゲットする

Posted at

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でいうとツイート、投稿のこと)を取得します。

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']

【工夫した点】
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') #北川

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3