松尾です。

ご報告ありがとうございます。
確認なのですが、投稿された文字列は
"Oct. 23, 18:00-24:00 JST, we have NTT (Denden memorial day)  Contest. 
UserDefinedContest setup for N1MM is available at 
http://www.ki.nu/~makoto/n1mm/ja-ntt-20111017.zip.";
で正しいでしょうか。添付されていたエラーメッセージから
復元したものです。

この文字列の投稿をこちらで試してみたところ、
HTTP/1.1 403 Forbidden (Status is over 140 characters.)
とはならず、普通に投稿成功してしまいました。

twittering-modeとTwitterサーバとで文字列長の解釈に違いが
あるとすれば、
a.短縮後のURL長の違い
b.URL部分の判定の違い
が考えられます。

前者についてtwittering-modeでは、短縮後URL長の最大値をTwitterの
APIで取得していますのでAPIで取得した後はTwitterサーバと違いは
ないはずです。
ただこのAPIでの取得が完了するまでは事前に設定したデフォルト値を
使いますので、その間に投稿が行われると解釈に差が出ることもあり
得ます。現在のデフォルト値はこの機能を追加した2011/08/27時点での
値で、HTTPでは19文字、HTTPSでは20文字です。
現在は短縮後URL長の最大値が拡張されてHTTPで20文字、HTTPSで21文字と
なっています。

今回の投稿内容について試してみましたところ、
(let* ((encoded-text 
"Oct.%2023%2C%2018%3A00-24%3A00%20JST%2C%20we%20have%20NTT%20%28Denden%20memorial%20day%29%20%20Contest.%20UserDefinedContest%20setup%20for%20N1MM%20is%20available%20at%20http%3A%2F%2Fwww.ki.nu%2F~makoto%2Fn1mm%2Fja-ntt-20111017.zip.")
       (text
        (twittering-oauth-url-decode encoded-text))
       (http-default
        (cdr (assq 'short_url_length
                   twittering-service-configuration-default)))
       (https-default
        (cdr (assq 'short_url_length_https
                   twittering-service-configuration-default)))
       )
  `((text . ,text)
    (raw . ,(length text))
    (effective . ,(twittering-effective-length text))
    (effective-default . ,(twittering-effective-length text http-default 
https-default))
    ))
の結果は
((text . "Oct. 23, 18:00-24:00 JST, we have NTT (Denden memorial day)  Contest. 
UserDefinedContest setup for N1MM is available at 
http://www.ki.nu/~makoto/n1mm/ja-ntt-20111017.zip.";)
 (raw . 170)
 (effective . 140)
 (effective-default . 139))
となりました。
現在の短縮後URL長を使うと140文字、デフォルト値使用でも139文字と
なっています。なので、投稿内容が上記の文字列だとするとa.の原因で
エラーが起きたとは考えにくいです。
a.の原因なら、「3回試して最後のものだけ成功」というのが「APIでの
情報取得完了前は失敗して、完了後は成功」というのに符合するな、と
思っていたのですが…。

b.の方としても、
https://github.com/twitter/twitter-text-rb/tree/master/lib
のライブラリ的にも末尾の.もURLに含まれそう…と思ったのですが
こちらで試した投稿の結果を見ると

"Oct. 23, 18:00-24:00 JST, we have NTT (Denden memorial day)  Contest. 
UserDefinedContest setup for N1MM is available at http://t.co/S38GbTQ.";

となってました。Twitter的には(上記ライブラリの仕様とは違って)
末尾の.はURLに含まないようですね…。
さらに短縮URLが http://t.co/S38GbTQ でたまたま19文字になって
います。上記の投稿結果は140文字なので、もし最大長である20文字の
短縮URLが生成されていたら、文字数制限を越えてしまいますね…。
成功、失敗の両方が起こったのはURL短縮時にサーバ側に複数候補が
あり得るためかもしれません。

うーん…。正直なところ、
https://github.com/twitter/twitter-text-rb/blob/master/lib/regex.rb
に書かれているような厳密な定義はしたくないですね…。
今回はこの定義に従ってもおかしいようですし。

投稿失敗時に何かサポートする、くらいでしょうか。
何かうまいアイデアがあれば良いのですが…。

---
松尾 直志 <t...@mymail.twin.jp>

------------------------------------------------------------------------------
The demand for IT networking professionals continues to grow, and the
demand for specialized networking skills is growing even more rapidly.
Take a complimentary Learning@Cisco Self-Assessment and learn 
about Cisco certifications, training, and career opportunities. 
http://p.sf.net/sfu/cisco-dev2dev
_______________________________________________
twmode-users mailing list
twmode-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/twmode-users

メールによる返信