風柳メモ

ソフトウェア・プログラミング関連の覚書が中心

土・日のはまりどころなど

Twitter アプリの API 変更

先日、

\ホノカチャン‼/ on Twitter: "@furyutei 久しぶりに @wedata_update の存在思い出したのですが、6/9で止まっているのは、やっぱりtwitter APIの問題なんでしょうか。"

という指摘を受けたので、諸々の事情によりしばらく Web から遠ざかっていて Twitter API のバージョンが 1 から 1.1 に変更されることもスルーしていた(マテ)自分は、途方にくれたわけですが。
さすがに3年近くほったらかしだと、あちこち問題がでるもんだ<Web アプリ。

だって、この記事読んだら

【1】REST APIの変更点
 多くのAPIはエンドポイントURLが変わるだけですが、一部廃止・変更もあるので、注意が必要です。公式ドキュメントに廃止・変更になるAPIのリストがないので、以下にまとめました。

Twitter APIと開発者規約変更のインパクトまとめ:結局、Twitter API 1.1で何が変わる? 5つのポイント - @IT

ってあるから、あー、エンドポイントの書き換えで大体対応できるのか〜と気軽に構えた後、念のためDocumentation | Twitter Developersで確認したら、中身も結構違うAPIも多いじゃないですか。
とり急ぎ、よく使っている奴だけ書き換えましたが<自作のGoogle App Engine用 Twitter ライブラリ by Python。公開できるようなレベルじゃないしなぁ。
とりあえず、wedata更新情報 (@wedata_update) | Twitterとかほんのつぶやき (@honnotsubuyaki) | Twitterとかが、動くようになる…かも知れません。
なお、ほんのつぶやきは、これまで無差別に返していたのですが、フォローしてくれている方だけに返るように修正しました。

Googleの短縮URLサービスAPI (goo.gl)

かつて参考にさせて頂いた、Google URL Shortener APIを利用する - DiaryExceptionの方法では401が返ってくるようになっていたので、Googleの短縮URLサービスAPI goo.gl をPHPから使用する|プログラムメモの記事を参考に、正規の方法で取得するようにしました。

#! /bin/env python
# -*- coding: utf-8 -*-

#==============================================================================
# Shorten URL by goo.gl
#   Document: https://developers.google.com/url-shortener/v1/getting_started?hl=ja#shorten
#==============================================================================
import urllib
import urllib2

try: # for Python 2.7 on Google App Engine
  import json as simplejson
  if not getattr(simplejson, 'loads') or not getattr(simplejson, 'dumps'):
    throwError(u'module not have nessessary attribute')
except Exception, s: # for Python 2.5 on Google App Engine
  from django.utils import simplejson


URL_API_ENDPOINT = 'https://www.googleapis.com/urlshortener/v1/url'
API_KEY = '##### Your API Key #####'
#  Reference: https://developers.google.com/url-shortener/v1/getting_started?hl=ja#APIKey


def get_short_url(uri): #{
  short_url = uri
  while True:
    url = '%s?key=%s' % (URL_API_ENDPOINT, API_KEY)
    data = simplejson.dumps(dict(longUrl = uri))
    headers = {'Content-Type': 'application/json'}

    req = urllib2.Request(url, data, headers)
    rsp = urllib2.urlopen(req)
    if rsp.code < 200 or 300 <= rsp.code:
      break
    result_dict = simplejson.loads(rsp.read())
    short_url = result_dict.get('id',uri)
    break
  return short_url
#} // end of get_short_url()


if __name__ == "__main__":
  import sys

  argv = sys.argv
  argc = len(argv)
  if argc != 2:
    print u'Shorten URL by goo.gl\nUsage: %s <original-url>' % (argv[0])
    exit(1)
  short_url = get_short_url(argv[1])
  print short_url
  exit(0)

# ■ end of file

…が、よく考えれば、Twitter投稿なら URL は勝手に短縮されるわけで、あまり意味がなく、せっかく修正した機能も使っていない、という。

Twitpic への投稿

なぜか、いつの間にか Twitpic への画像投稿がうまくいかなくなっていました。
しばらくhttp://dev.twitpic.com/docs/2/upload/とにらめっこしていましたが、特に変なことをしていないはずなのに……。

かなり経ってから、ようやく、

X-Auth-Service-Provider (Required)
https://api.twitter.com/1/account/verify_credentials.json

http://dev.twitpic.com/docs/2/upload/

に気づく。これ、

https://api.twitter.com/1.1/account/verify_credentials.json

になおさなきゃだめなんじゃ……。
…はい、なおりました。
でも、考えてみれば、Twitterには画像を直接投稿できるので(POST statuses/update_with_media (deprecated) | Twitter Developers)そちらを使うことで、これもTwitpicのAPIも未使用ということに。

おまけ

随分前から動かなくなっていたのには気が付いていたが、放置してあった「TwitDungeon」を、Twitter API 1.1 対応ライブラリのテスト用に動かしてみた。

で、久しぶりに試してみたら、割と興味深い。


デフォルトの開始地点は自分が中心。
Twitter認証で自分のアカウントを使った場合。


ランダムで(実はランダムにする意図はないが、Twitter の API 結果がランダムで返ってくる)フォローしている人のうちの120名までが左上にタイル状に表示され、これを[j][k][h][l]([↓][↑][←][→])で上下左右に移動。
途中、[v]を押すと最近のツイートが表示される([a]で移動のたびに自動表示)。
……だけど、すぐAPI回数制限(「429: Too Many Requests」)にひっかかるのが難点。


[d]で、カーソルがある人のところに潜ると、その人がフォローしている人がまた120名までランダムでタイル表示。
要は、少し変わった形で、フォローしている人を辿っていけるだけのアプリだけれど、誰がどんな人をフォローしているのかが視覚的にわかるので、割と楽しめる。