PythonでTwitter BOTを作る

Clip to Evernote

とあるツイートにインスパイアされて、Flickrから写真を取得してTwitterに投稿するBOTを作ってみました(ネコイヌペンギンウサギハムスター赤ちゃん、とリスト)。

TwitterのBOTくらいなら簡単に作成できる…と思っていたのですが、先日のBASIC認証廃止で、OAuthによる認証が必須となり、簡単なBOTでも結構ややこしい手順をふむ必要が出てきました。
そこで、少しでも楽をするために、今回はPythonを使って構築しています。
適当なライブラリを活用することで、認証の処理がかなり容易になります。

以下、一連の作業と作成したソースコードの記録です。

BOTアカウントの登録

なにはともあれ、BOT用のアカウントを登録します。
こちらのページから、通常通りアカウントを作成します。

後々、このアカウントに紐づいたアクセストークンが必要となります。

登録を終えたら通常通りログオンし、Bio等をセッティングします。

アプリケーションの登録

次に、BOT用アカウントでログインした状態で http://dev.twitter.com/ へアクセスします。

この画面から、新しく作成するBOTをアプリケーションとして登録します。
右上の “Your apps”  をクリックします。

既に登録しているアプリケーションの一覧が表示されます。
何も登録していない場合は、登録画面へのリンクだけが表示されるはずです。

新しく登録する場合は、右の “Register a new app” をクリックします。

基本的に、入力項目はすべて入力する必要があります。

BOT用アプリケーション登録の際のポイントは、 “Application Type” を “Client” に変更することと、 “Default Access type” を “Read & Write” に変更すること。
ちなみに、 “Callback URL” の入力欄は、 “Application Type” を “Client” に変更すると消えます。

登録が完了すると、このような画面に移ります。

この画面で必要な情報は、 “OAuth 1.0a Settings” の “Consumer key” と “Consumer secret” の2つ
これらの情報が、このBOTを更新するためのアプリケーションである、ということを証明するのに使われるものです。
これらの情報を記録します。

次に、画面の上に戻って “My Access Token” をクリックします。

すると、このように “Access Token (oauth_token)” と “Access Token Secret (oauth_token_secret)” の情報が表示されます。
これは、このアプリケーションの作成者(=BOTアカウント)の認証に使われる情報です。

先の “Consumer key” 、 “Consumer secret” とあわせて、初めてBOTを更新するためのアプリケーションで、BOTアカウントのツイートを更新できるようになります。
“Access Token (oauth_token)” と “Access Token Secret (oauth_token_secret)” の情報も記録しておきます。

これで、BOTに必要な “Consumer key”、 “Consumer secret”、”Access Token (oauth_token)”、 ”Access Token Secret (oauth_token_secret)” という4つの鍵が手に入りました。

スクリプトの作成

上述のように、今回BOTを更新するアプリケーションは、Pythonによるスクリプトを作成しました。

PythonでのTwitterの操作は tweepy というライブラリを利用しています。
また、Flickrからの写真の取得は、Flickrのタグをキーに写真を検索してRSSを作成してくれる Flickr RSS Feed Generator というサービスを利用し、この結果取得したRSSを feedparser というライブラリを使ってパースしています。
更に、 今回はFlickrの写真をツイートするということで、 flickrapi.shorturl というライブラリでURLを短縮しています。

各ライブラリのインストールは環境により異なるので、他を参照いただきたいのですが、このBlogを置いているCoreserverやXREAの場合は基本的に次のような手順でインストールできると思います。

  1. 管理画面からホスト情報を登録する。
  2. SSHでサーバへアクセスする。
  3. 次の環境変数を設定しておく。
  4. $ export PYTHONPATH=$HOME/lib/python2.4:$HOME/lib/python2.4/site-packages
  5. 各ソースコードをダウンロードし、以下のコマンドでインストール先を指定してインストールする。
  6. $ python setup.py install --prefix=~/

次に、実際にBOTを更新するスクリプトのソースコードです。ここで、”Consumer key”, “Consumer secret”, “Access Token (oauth_token)”, ”Access Token Secret (oauth_token_secret)”にはそれぞれ植えで入手した情報を入れて下さい。

#!/usr/local/bin/python
# -*- coding: utf-8 -*-

import string
import random

import feedparser
import tweepy
import flickrapi.shorturl

CONSUMER_KEY        = 'Consumer key'
CONSUMER_SECRET     = 'Consumer secret'
ACCESS_TOKEN        = 'Access Token (oauth_token)'
ACCESS_TOKEN_SECRET = 'Access Token Secret (oauth_token_secret)'

num = 100    # 100枚の写真から1枚選ぶ
tag = 'cat+kitty+kitten'    # 検索するタグを + で繋げる
id = random.randint(0, num)
if random.randrange(0, 10, 1) > 5:
  sort = 'interestingness-desc'
else:
  sort = 'date-posted-desc'

url  = 'http://www.degraeve.com/flickr-rss/rss.php?tags=' + tag + '&tagmode=any&sort=' + sort + '&num=' + str(num)
data = feedparser.parse(url)

prefix = u'ミ^・.・^彡'
title  = data['entries'][id]['title']
link = data['entries'][id]['link']
link = flickrapi.shorturl.url(link[link.rfind(u'/')+1:])

if len(title) + len(link) + len(prefix) > 110:
  title = title[0:110 - len(link) - len(prefix)] + '...'

tweet = prefix + ' ' + title + '  ' + link

# ここからTwitter
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
api = tweepy.API(auth)
api.update_status(tweet)

最後に、このスクリプトをcronで動かすためのshスクリプトを作成します。ここで、上のPythonスクリプトは /virtual/user/bin/nyancopot.py に保存されているものとします。

#!/bin/sh

export PYTHONPATH=$HOME/lib/python2.4:$HOME/lib/python2.4/site-packages
export LD_LIBRALY=$HOME/lib

/usr/local/bin/python /virtual/user/bin/nyancopot.py

あとは、このshスクリプトをcronに登録すれば完了です。
指定された時間にBOTがつぶやきます。

Tags: , , ,

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <img localsrc="" alt="">