読者です 読者をやめる 読者になる 読者になる

風柳メモ

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

『はてなコピィ普及委員会』発足

役員なし・平会員1名のみの委員会ですが

とくに絵心が無くても簡単にバナー付きリンクが作れてしまう『はてなコピィ』。
私的に大好きなサービスなんですが、初期はともかく、現状は閑古鳥が鳴いているのが否めません…。
なので、非公式に

はてなコピィ普及委員会  hatena_copieをフォローしましょう

なるものを、でっち上げてしまいました。
id:cho45さん、勝手にすみません。これもひとえに愛ゆえと、お目こぼしいただければ幸いです。

といっても、単なるTwitter上のbotでして、今のところ15分毎に、既存コピィをランダムにつぶやくだけ、なんですけれどもね。

ただ、バナーをTwitPicに貼り付けているので、NewTwitterやTwilog、画像が見えるクライアントなどでプレビュー可能です。
画像の一部だけが拡大表示されるクライアントなんて使っていると、気になること請け合いです(をい)。

紆余曲折の末、当面TwitPicへのバナー貼り付けは中止しました【2010.10.30現在】。

やっていること

ここからは作者向けの覚え書きなので、特に読む必要はないです。

手順
  1. はてなコピィの『無作為に一覧』のRSSを定期的(現状、30分毎)に取得し、重複分を除くコピィの情報をGAEのdatastoreに保存しておく。
  2. 定期的(現状、15分毎)に、datastoreに保存したコピィのうち、まだつぶやいていないものを優先的に選択し、リンクの短縮URL(by goo.gl)、および、バナーイメージを取得後、TwitPicに投稿。このときに得られたURLをくっつけて、Twitter(http://twitter.com/hatena_copie)に投稿。
はまった点など

最初は単純に、バナー(画像)へのリンクを貼付ようとしたのだけれど、NewTwitterの場合は画像直リンクだとプレビューできないっぽかったので、TwitPicへの投稿という手順を入れたのである……が、これがはまった。

というか、API v2のuploadを使ったんだけれども、このページの説明だけを見て、即座にAPI経由での投稿方法がわかる人は、凄すぎる……。
少なくとも、

  1. oauth_consumer_keyは、Twitter側アプリケーション設定で取得したConsumerKeyをそのまま使う。
  2. oauth_signatureも、Twitter側アプリケーション設定で取得したConsumerSecretを種にして計算した値を使う。
  3. oauth_tokenも、Twitter側アプリケーションのOAuth手順で取得したものを使用する。
  4. OAuth関係の各種パラメータ計算方法は、Twitter側と同様のものを使用する。このとき、種となるmethodは"GET"*1、urlはhttps://api.twitter.com/1/account/verify_credentials.json*2として計算する。
  5. パラメータはContent-Typをmultipart/form-dataとしてkey、message、mediaの各パラメータを指定する。このとき、keyは、TwitPic側で取得(http://dev.twitpic.com/apps/new)したものを使う。また、messageはTwitPic側に投稿されるメッセージで、Twitter側には反映されない*3。mediaにはアップロードする画像ファイル名と画像データを指定する。

くらいは解らないと、使いようが無い気がするのだけれども……。

それと、multipart/form-dataのbodyを直接作ったのは初めてだったので、これにもはまってしまった…というか、実は未だに正しい方法が理解出来ていない。
単純に、行毎にlistに追加し、'\r\n'区切りでjoin()しようとすると、画像ファイルがバイナリであるため、Unicodeエラーが発生してしまう……。
結局、テキスト部分はencode('utf-8')したのちバイト数を数えてstruct.pack('(バイト数)s')でバイナリ列に変換し、画像ファイル(urlfetch.fetch()でとってきたcontentそのもの)のバイナリとくっつける、という強引な方法を使ってしのいだのだが*4、正しいやり方、どなたか教えて下さいませ。

*1:"POST"では無いことに注意。

*2:X-Auth-Service-Providerで指定したもの。

*3:多分。API v1との違いになるのかな?

*4:一応、TwitPicには投稿出来てはいるみたい。