ゼロと無限の間に

フリーでオープンソースなJavaScriptとかPHPとか。

ユーザ用ツール

サイト用ツール


python-box:appengine-twitter

差分

このページの2つのバージョン間の差分を表示します。

この比較画面にリンクする

両方とも前のリビジョン 前のリビジョン
最新のリビジョン 両方とも次のリビジョン
python-box:appengine-twitter [2011/06/28 22:34]
dgbadmin @norikae_map 歩きのサンプル変更
python-box:appengine-twitter [2013/03/07 23:18]
dgbadmin 0.3.0
行 7: 行 7:
 Google App EngineでTwitter APIを操作するライブラリを作ってみた。\\ Google App EngineでTwitter APIを操作するライブラリを作ってみた。\\
 車輪の再発明ではなく、趣味の車輪作り。 車輪の再発明ではなく、趣味の車輪作り。
 +
 +バージョン0.3.0からはTwitter Search APIの廃止に対応して、検索もOAuthを使ってTwitter REST API 1.1を使うように変更した。
  
  
行 15: 行 17:
  
 ===== デモ(動作サンプル) ===== ===== デモ(動作サンプル) =====
- 
-※OAuthを使っているデモについては[[python-box/appengine-oauth|AppEngine OAuth]]を参照 
- 
- 
-ちなみに、下記のTwitter BotはTwitter Search APIの制限を回避するために、Google App Engine以外のサーバも組み合わせて使っている。 
- 
  
 ==== その1. RT(ReTweet)の多いつぶやきを報告するBot ==== ==== その1. RT(ReTweet)の多いつぶやきを報告するBot ====
行 28: 行 24:
 ==== その2. 地名を告げるとその近くにいるTwitterユーザーの名前を教えてくれるBot ==== ==== その2. 地名を告げるとその近くにいるTwitterユーザーの名前を教えてくれるBot ====
 [[http://twitter.com/who_is_near|@who_is_near]] [[http://twitter.com/who_is_near|@who_is_near]]
 +
 +※検索がまだTwitter REST API 1.1に対応させてないので今は動かない(はず)
  
 === 使用例 === === 使用例 ===
行 51: 行 49:
  
 ==== その4. Twitter APIでOAuth認証してつぶやいたりフォローしたりするデモ ==== ==== その4. Twitter APIでOAuth認証してつぶやいたりフォローしたりするデモ ====
-OAuth認証が必要なAPI操作のデモについては、[[python-box/appengine-oauth|AppEngine Oauth]]のデモその4を参照。 
- 
- 
-==== その5. Twitter APIでOAuth認証が不要な操作(検索、フォローしてるかどうかの確認)をするデモ ==== 
-[[http://0-oo.appspot.com/twitter/|Twitter APIでOAuth認証が不要な操作をするデモ]] 
- 
-ソースコード\\ 
-(※ページ表示で[[python-box/appengine-basehandler|AppEngine Basehandler]]を使っている。それとOAuth使っていない場合でも、[[python-box/appengine-oauth|AppEngine Oauth]]も無いとAppEngine-Twitterは動かないかも。) 
-<code python> 
-#!/usr/bin/env python 
-# -*- coding: UTF-8 -*- 
-''' 
-Sample for AppEngine-Twitter on Google App Engine 
- 
-See: http://0-oo.net/sbox/python-box/appengine-twitter 
-''' 
- 
-import logging 
-import wsgiref.handlers 
-from appengine_twitter import AppEngineTwitter 
-from basehandler import BaseHandler, h 
-from google.appengine.ext import webapp 
- 
- 
-class MainHandler(BaseHandler): 
- 
-  def get(self): 
-    self.show() 
- 
- 
-  def post(self): 
-    self.show(self.request.get('name')) 
- 
- 
-  def show(self, name=''): 
-    self.simple_header(u'AppEngine-Twitterのデモ') 
- 
-    self.p(u'<h1>AppEngine-Twitterのデモ</h1>') 
-    self.p(u'<h2>TwitterのログインIDを入力してください</h2>') 
-    self.p('<form method="post" action="./">') 
-    self.p(u'ユーザー名 ') 
-    self.p('<input type="text" name="name" value="' + h(name) + '">') 
-    self.p(' <input type="submit">') 
-    self.p('</form>', True) 
-    self.p('<br>') 
- 
-    if name: 
-      self.test(name) 
- 
-    self.p('<hr>', True) 
-    self.p(u'このページは') 
-    self.p('<a href="http://0-oo.net/sbox/python-box/appengine-twitter">') 
-    self.p('AppEngine-Twitter') 
-    self.p(u'</a>のデモです') 
-     
-    self.simple_footer() 
- 
- 
-  def test(self, name): 
-    twitter = AppEngineTwitter() 
- 
-    self.p(u'<h2>実行結果</h2>', True) 
- 
-    self.p(u'<b>search()</b> "腹減った"を検索(3件まで)', True) 
-    results = twitter.search(u'腹減った'.encode('utf8'), {'rpp': 3}) 
-    for result in results: 
-      self.p(result['text'], True) 
-    self.p('<br>') 
- 
-    self.p(u'<b>is_following()</b> @uresuji_booksをフォローしてる?', True) 
-    twitter._tw_name = name 
-    if twitter.is_following('uresuji_books'): 
-      self.p('True') 
-    else: 
-      self.p('False') 
-    self.p('<br>', True) 
- 
- 
- 
-logging.getLogger() 
-routing = [('/twitter/.*', MainHandler)] 
-application = webapp.WSGIApplication(routing, debug=False) 
-wsgiref.handlers.CGIHandler().run(application) 
-</code> 
  
 +[[python-box/appengine-oauth|AppEngine Oauth]]のデモその4を参照。
  
  
行 151: 行 66:
  
 See also: See also:
-  http://apiwiki.twitter.com/Twitter-API-Documentation +  https://dev.twitter.com/docs/api 
-  http://code.google.com/intl/ja/appengine/docs/python/urlfetch/+  https://developers.google.com/appengine/docs/python/urlfetch/?hl=ja
 ''' '''
  
 __author__ = 'dgbadmin@gmail.com' __author__ = 'dgbadmin@gmail.com'
-__version__ = '0.2.1'+__version__ = '0.3.0'
  
  
行 168: 行 83:
  
   def __init__(self):   def __init__(self):
-    self._api_url = 'https://api.twitter.com/1/'+    self._api_url = 'https://api.twitter.com/1.1/'
     self._oauth_url = 'https://api.twitter.com/oauth/'     self._oauth_url = 'https://api.twitter.com/oauth/'
-    self._search_url = 'http://search.twitter.com/search.json' 
     self._oauth = None     self._oauth = None
     self._tw_name = ''     self._tw_name = ''
行 227: 行 141:
   def search(self, keyword, params={}):   def search(self, keyword, params={}):
     '''     '''
-    Sucess => Return Array of dict / Fialed => Return HTTP status except 200 +    Sucess => Return Array of dict / Fialed => raise an Exception
-    FYI http://dev.twitter.com/pages/rate-limiting+
     '''     '''
     params['q'] = keyword     params['q'] = keyword
-    url = url=self._search_url + '?+ urllib.urlencode(params) +    status = self._get('search/tweets.json'params)
-    res = urlfetch.fetch(url=url, method='GET'+
-    self.last_response = res+
  
-    if res.status_code == 200: +    if status == 200: 
-      return simplejson.loads(res.content)['results'] +      return simplejson.loads(self.last_response.content)['statuses']
-    elif res.status_code == 420: +
-      err_msg = 'Rate Limiting: Retry After ' + res.headers['Retry-After'] + ' seconds'+
     else:     else:
-      err_msg = 'Error: HTTP Status is ' + str(res.status_code) +      raise Exception('Error: HTTP Status is ' + str(status))
- +
-    raise Exception('Twitter Search API ' + err_msg)+
  
  
python-box/appengine-twitter.txt · 最終更新: 2017/05/13 05:36 by dgbadmin