すこしふしぎ.

VR/HI系院生による技術ブログ.まったりいきましょ.(友人ズとブログリレー中.さぼったら焼肉おごらなきゃいけない)

twitterのAPI叩いて遊ぼう!

こんにちは1000chです. 年始にNike+ FuelbandSEを買いまして,最近帰宅してからランニングを日課にしております. 人間PCに張り付きまくってるとダメになってしまうので,適度な運動は大切ですよね.

さて,今回はmogranosenshiくんに触発されてtwitterAPIを触って遊んでみました.

twitter API

皆さんご存知のように,twitterではAPIを公開しておりまして,様々な情報を取得することができます. 詳しくは公式のtwitter developersを参照してください. twitterのアカウントさえ持っていれば,開発者向けコンソールで各APIをテストすることもできます.

自分のアプリでAPIを利用するためには,アプリのIDを発行したり,それに併せたアクセストークンを生成・取得する必要があります. さすがにtwitter,触っている人がおおいので,このへんに関してはちょろっとググればいろいろな情報が出てきます. とりあえず僕はこちらを参考にさせていただきました.

  • consumer key```
  • consumer key secret
  • access token
  • access token secret

以上の4つを手に入れることができれば,twitterAPIを使って遊び始めることができます.

tweepy

pythonでのデータ分析を勉強しているので,pythontweetデータ取得できたら(もしかしたら)応用できるかなーということで,pythontwitterのデータを取得してみます. pythonからtwitterのつぶやきを取得する所に関しては,わが友もぐ氏がこの前書いていた記事 を参考にさせていただきました.

もぐ氏の記事のコードでtweepyなるライブラリが紹介されていたので,とりあえずこれを使ってみることにしました. tweepyの簡単な使い方はこちらが参考になります.

tweepyのリファレンスは公式ページが詳しいです. ただ「~~というクラスを返す」と言う記述があるのですが,そのクラスのリファレンスについては見当たりません(探し方が悪いのかな?). そこで最初返ってきたオブジェクトをどのように使っていいのかわからなかったのですが,そこはさすがpythondir()関数や__dir__属性を参照することでオブジェクトの持つすべての属性を見ることができます. これを参考にすることで何となくの使い方がわかると思います. こんな感じ.

#coding:utf-8
# オートログインする機能
import tweepy as tp

consumer_key = "xxxxxxxxxxxxxxxxxxxx"
consumer_secret = "xxxxxxxxxxxxxxxxxxxx"
access_token = "xxxxxxxxxxxxxxxxxxxx"
access_token_secret = "xxxxxxxxxxxxxxxxxxxx"

def certificate(ck, cs, at, ats):
    auth = tp.OAuthHandler(ck, cs)
    auth.set_access_token(at, ats)
    return tp.API(auth_handler = auth, api_root ='/1.1', secure=True)

def auto_certificate():
    return certificate(consumer_key,consumer_secret,access_token,access_token_secret)
# ipythonの対話シェルでテスト
In [1]: import tweetUtil as tu

In [2]: tu.auto_certificate()
Out[2]: <tweepy.api.API at 0x109aad610>

In [3]: api = tu.auto_certificate()

In [4]: api
Out[4]: <tweepy.api.API at 0x109aad890>

In [5]: list = api.home_timeline()

In [6]: list
Out[6]:
[<tweepy.models.Status at 0x109ad1650>,
 <tweepy.models.Status at 0x109ad1690>,
 <tweepy.models.Status at 0x109af19d0>,
 <tweepy.models.Status at 0x109af1ad0>,
 <tweepy.models.Status at 0x109af1b50>,
 <tweepy.models.Status at 0x109af1bd0>,
 <tweepy.models.Status at 0x109af1c50>,
 <tweepy.models.Status at 0x109af1cd0>,
 <tweepy.models.Status at 0x109af1d50>,
 <tweepy.models.Status at 0x109af1dd0>,
 <tweepy.models.Status at 0x109af1e50>,
 <tweepy.models.Status at 0x109af1ed0>,
 <tweepy.models.Status at 0x109af1f50>,
 <tweepy.models.Status at 0x109af1fd0>,
 <tweepy.models.Status at 0x109afe090>,
 <tweepy.models.Status at 0x109afe150>,
 <tweepy.models.Status at 0x109afe1d0>,
 <tweepy.models.Status at 0x109afe250>,
 <tweepy.models.Status at 0x109afe310>,
 <tweepy.models.Status at 0x109afe390>]

In [7]: st = list[0]

In [8]: st
Out[8]: <tweepy.models.Status at 0x109ad1650>

In [9]: dir(st)
Out[9]:
['__class__',
 '__delattr__',
 '__dict__',
 '__doc__',
 '__format__',
 '__getattribute__',
 '__getstate__',
 '__hash__',
 '__init__',
 '__module__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 '_api',
 'author',
 'contributors',
 'coordinates',
 'created_at',
 'destroy',
 'entities',
 'favorite',
 'favorite_count',
 'favorited',
 'geo',
 'id',
 'id_str',
 'in_reply_to_screen_name',
 'in_reply_to_status_id',
 'in_reply_to_status_id_str',
 'in_reply_to_user_id',
 'in_reply_to_user_id_str',
 'lang',
 'parse',
 'parse_list',
 'place',
 'retweet',
 'retweet_count',
 'retweeted',
 'retweets',
 'source',
 'source_url',
 'text',
 'truncated',
 'user']

In [10]: st.__dict__
Out[10]:
# 返ってくるデータは個人情報なので割愛

__dict__を呼ぶと,キーと値のdictが返ってきます.オブジェクトをそのままディクショナリにできるんですね.やーこの機能すっかり忘れてましたよ.

statusクラスがいわゆる1つ1つの"ツイート"を管理するクラスのようです.ツイートのidやツイートした人(userクラス),ツイートの内容(text)を取得できます.

順番が前後しますが,途中にしれっと出てくるapiオブジェクトを通じて様々なAPIを叩くことができます.tweepyはご覧の通り認証が異常にラクで便利ですね. ちょっと楽すぎてOAuthの認証方法の勉強にはならないですw

定期ポストさせる

twitterAPIを用いれば,認証しているユーザでのpostなど簡単にできてしまいます.tweepyだとこんな感じ.

api.update_status("apiからついーと")

ワンラインで余裕です.もはやわざわざクライアントアプリを起動するよりターミナルからツイートする方が早いレベルです.

さてこのpostするコードをcronで自動実行させれば,botっぽくなるのではないでしょうか. これまたもぐ氏のpythonで書いたクローラをcronで動かす記事を参考にcronの設定を書きます.

$crontab -e 

からの

0 0 * * * cd /path/to/dir; /path/to/python /path/to/dir/target.py

てな感じで設定を書いてあげました.

これで毎日0:00にtarget.pyが実行されるので.この中に先ほどのようなpostするコードを書いてあげれば定期postの完成です^^ また,

import random as rnd

if (rnd.random(5) < 1.0):
    api.update_status("不定期ポスト")

という感じでpostするかどうかを判断すると,不定期postもできてしまいますね〜.

てきとーなアカウントつくって,毎朝自分に対しリプ飛ばすbotも簡単につくれそうです. なんちゃって占いアカウントとかつくったら面白いんじゃないでしょうか. 今日のあなたのラッキーフォロワーはxxさんです.的なw