wiki:TwitterBotExample

Twitterのボットのサンプル

 http://twitter.com/oclk を動かしてるボットのソース。

2010年6月からTwitter APIのBasic認証が使えなくなるとのことで、OAuth対応しました。

初期化、ベリファイ、API実行の各段階で、tweepy.OAuthHandlerオブジェクトが保持しているいくつかの値を保持しなきゃいけない。 本当だったら、値を保存しておいてset_request_token()とかやるんだけど、めんどくさいので全部をピックルしちゃう。 こんなんでも動くかららくちん。

#!/usr/bin/python
#vim:fileencoding=utf-8

import os
import os.path
import time
import pickle
import optparse
import tweepy

# Constant
PICKLE_FILE = 'auth.pickle'
TIMEZONE = 'JST-9'

# App config
consumer_key = 'こんしゅーまーきー'
consumer_secret = 'こんしゅーまーしーくれっと'

def pickle_path():
  d = os.path.dirname(__file__)
  return os.path.join(d, PICKLE_FILE)

def initialize():
  auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
  url = auth.get_authorization_url()
  pickle.dump(auth, open(pickle_path(), 'w'))
  return url

def verify(verifier):
  auth = pickle.load(open(pickle_path()))
  auth.get_access_token(verifier)
  pickle.dump(auth, open(pickle_path(), 'w'))

def tweet():
  os.environ['TZ'] = TIMEZONE
  time.tzset()
  tm = time.localtime()
  d = {'mon':tm.tm_mon, 'mday':tm.tm_mday, 'hour':tm.tm_hour, 'min':tm.tm_min}
  if tm.tm_min < 5:
    status = u'----- %(mon)d%(mday)d日 だいたい%(hour)d時 -----' % d
  else:
    status = u'----- %(mon)d%(mday)d%(hour)d%(min)d分-----' % d
  icon = '%d.jpg' % (tm.tm_hour % 6 + 1)
  icon = os.path.join(os.path.dirname(__file__), icon)

  auth = pickle.load(open(pickle_path()))
  api = tweepy.API(auth)
  api.update_status(status)
  api.update_profile_image(icon)

def main():
  parser = optparse.OptionParser('Usage: %prog [options]')
  parser.add_option('-i', '--initialize',
      action='store_true', dest='initialize',
      help='Start the OAuth session')
  parser.add_option('-v', '--verify',
      dest='verifier',
      help='Verify with the verifier')

  (options, args) = parser.parse_args()
  if len(args) != 0:
    parser.error('too many arguments')

  if options.initialize:
    print initialize()
  elif options.verifier:
    verify(options.verifier)
  else:
    tweet()

if __name__ == '__main__':
  main()

(2010/6/1 - sgk)