TweetANew/-2014

提供: きまぐれ手記 Kimagurenote
移動先: 案内検索

MediaWiki Extension:TweetANew を使い、MediaWikiの新着/更新情報が自動的にtwitterに流れるようにした。

要約欄の先頭文字が#だと要約が出ない

記事名、URLの後には要約欄に書いたコメントが自動ツイートされるが、要約欄の先頭文字を#にすると要約が出ず、$wgUseAutomaticEditSummaries が有効のときは getAutosummary() が動作して、入力した要約は出ずに、本文の自動要約が出てしまう。

例:

この時、MediaWikiの履歴には元の要約が記録されているので、TweetANew の挙動から見直してみたものの、TweetANew 内部では $wgHooks['ArticleInsertComplete'] から呼ばれた値をそのまま出力しているだけだった。

MediaWiki 本体を軽く追いかけてみたものの、$summary が空以外の時に書き換える処理は見当たらず。

なお、 https://git.wikimedia.org/tree/mediawiki%2Fextensions%2FTweetANew から入手した最新版でも確認したが、挙動は同じだった。

現象は再現しているので何かしらの原因があると思われ、もう少し追いかけてみたいが、今日は時間切れでここまで。--2014年4月7日 (月) 02:13 (JST)

MediaWiki 1.24 の仕様変更に伴う修正

MediaWiki 1.24 から WikiPage::estimateRevisionCount() が削除されたため、TweetANew にも修正が入っていた。つまり、MediaWiki 1.24 に更新したときには、TweetANew も更新が必要

更新しないと、記事の作成・更新時に Fatal error: Call to undefined method WikiPage::estimateRevisionCount() in /path/to/MediaWiki/extensions/TweetANew/TweetANew.body.php on line 120 が出て動作しない(記事の保存まではされる)。

また、次項の修正はまだされていないので(誰か投げてくれないかな^^;)、ダウンロード後に下記パッチ適用のこと。

--- TweetANew.body.php.REL1_24-d226462  2014-12-02 08:25:30.000000000 +0900
+++ TweetANew.body.php  2015-01-04 16:28:10.000000000 +0900
@@ -258,7 +258,7 @@

                        # Check if length of tweet is beyond 140 characters and shorten if necessary
                        if ( mb_strlen( $tweet_text ) > $tweet_text_count ) {
-                               $tweet_text = $wgLang->mb_substr( $tweet_text, 0, $tweet_text_count - 3 )  . '...';
+                               $tweet_text = mb_substr( $tweet_text, 0, $tweet_text_count - 3 )  . '...';
                        }

                        # Make connection to Twitter

MediaWiki 1.23~との組み合わせで新規tweetが出ない不具合修正

不具合は見つかってみればあっけない…お恥ずかしい限り^^;;;。--2014年11月5日 (水) 06:57 (JST)

--- TweetANew.body.php.head      2014-06-02 04:41:56.000000000 +0900
+++ TweetANew.body.php  2014-11-05 06:21:42.000000000 +0900
@@ -278,7 +278,7 @@

                        # Check if length of tweet is beyond 140 characters and shorten if necessary
                        if ( mb_strlen( $tweet_text ) > $tweet_text_count ) {
-                               $tweet_text = $wgLang->mb_substr( $tweet_text, 0, $tweet_text_count - 3 )  . '...';
+                               $tweet_text = mb_substr( $tweet_text, 0, $tweet_text_count - 3 )  . '...';
                        }

                        # Make connection to Twitter

MediaWiki 1.23 への更新後に不具合が顕在化したのは、10月31日付けで書いたように、PHPのmbstringモジュールがインストールされていない場合にMediaWiki内蔵の代替処理が動くようになっている部分があるんで、そのあたりが衝突していたのだと思われる(試していないが、mbstringモジュールを使う気のない英語圏などではこの不具合は出ていないのかもしれない)。

ちなみにエラー内容は Fatal error: Call to undefined method LanguageJa::mb_substr() in /path/to/MediaWiki/extensions/TweetANew/TweetANew.body.php on line 281

おそらく MediaWiki のバージョンと使用言語の両方に依存するので、影響範囲を想定しづらく、修正依頼も出しづらいなぁと。

なお、新規記事に限り要約欄が出ない不具合は相変わらず発生していた。そのうち追いかけてみたいと思うけど、新規記事を書く機会が少ないのよね…

インストール

基本的に mw:Extension:TweetANew#Installation の通りでいいんだけど…

注意: 2014年2月に公開されたstable版にて、下記の不具合は全て解消しているようです。今は普通にインストールすれば使えるはず。

エラーは出ないが、tweetも出ない

エラーログに何も吐いてくれないので困った。 要所要所にデバッグログを仕込んで動かしてみたら、TweetANew.body.php 256行目の $tmhOAuth->request() で 410 が返ってきていた。でも410って何?

When API v1 is finally retired, all authenticated and unauthenticated requests to API v1 will return a HTTP 410 Gone status.

ああ、そういうことかと。

ダメ元で試しに257行目だけを変えてみたら、

--- TweetANew.body.php.head	2013-12-07 10:54:04.000000000 +0900
+++ TweetANew.body.php	2014-01-13 15:53:52.000000000 +0900
@@ -254,7 +254,7 @@

                # Make tweet message
                $tmhOAuth->request( 'POST',
-                       $tmhOAuth->url( '1/statuses/update' ),
+                       $tmhOAuth->url( '1.1/statuses/update' ),
                        array( 'status' => $tweet_text )
                );
                return true;

つまりURLを1.1に変えたらあっさり動いてくれた(OAuthライブラリの方には手をつけず)。

この後、よくよく見てみたら会話ページの中に書いてあったというオチまで付いて(苦笑)。まぁよくある事ですけどね。

でも分かってるなら表に書いてくれればいいのに…1年近く放置してあるなんて、このExtension自体あまりメンテされてないのかなぁ?ちょっと不安になります。

不具合報告

相変わらず英語が壊れてるのはご愛敬ってことで^^;; --2014年1月13日 (月) 22:21 (JST)

Bugzilla に報告したら当日には対応してもらえたようで早いっすね。配布ファイルにはまだ反映されていないようですが、じきに入ることでしょう…それまでは直接書き換えて使いましょう。 --2014年1月15日 (水) 23:38 (JST)

マルチバイト文字に対応

従来はマルチバイト文字(日本語など)を想定せずにtruncateしていたので、日本語などで本来つぶやける字数より少なくなっていた問題に対応してみた。ついでに t.co の仕様変更字数の変更強制適用)にも対応。

--- TweetANew.body.php.head	2013-12-07 10:54:04.000000000 +0900
+++ TweetANew.body.php	2014-01-15 22:57:20.000000000 +0900
@@ -231,17 +231,19 @@
	 */
	public static function makeSendTweet( $tweet_text, $finalurl ) {
		global $wgTweetANewTwitter, $wgLang;
-
-		# Calculate length of tweet factoring in longURL
-		if ( strlen( $finalurl ) > 20 ) {
-			$tweet_text_count = ( strlen( $finalurl ) - 20 ) + 140;
+
+		# Calculate length of tweet factoring in t.co
+		if ( stripos( $finalurl, 'https:' ) !== false ) {
+			$tweet_text_count = 140 - 23 + mb_strlen( $finalurl );
+		} elseif ( stripos( $finalurl, 'http:' ) !== false ) {
+			$tweet_text_count = 140 - 22 + mb_strlen( $finalurl );
		} else {
			$tweet_text_count = 140;
		}

		# Check if length of tweet is beyond 140 characters and shorten if necessary
-		if ( strlen( $tweet_text ) > $tweet_text_count ) {
-			$tweet_text = $wgLang->truncate( $tweet_text, $tweet_text_count );
+		if ( mb_strlen( $tweet_text ) > $tweet_text_count ) {
+			$tweet_text = mb_substr( $tweet_text, 0, $tweet_text_count - 3 ) . '...';
		}

codeを追ってまではいないものの、動作を見る限りでは MediaWiki本体で定義されている $wgLang->truncate がマルチバイト文字列に対応していないっぽいので、mb_substr に書き換えて対応。

ちなみに、要約部分などにURLを書いた場合の短縮(場合によっては伸長)に対応していないのは既知の不具合です:-) --2014年1月13日 (月) 21:11 (JST)

PHPの論理比較演算子を間違えていた(^^;ので修正。こっちで試してみてくださいー --2014年1月15日 (水) 23:38 (JST)

不具合報告

とりあえず Bugzilla に投げておいたけど、動作確認してもらえるかな?日本語(または中韓その他でもいいが)で使ってる人はきっと少ないんだろうし…動作確認した方、bugzilla(またはノートページ)へ報告くださいませ(__)。 --2014年1月19日 (日) 23:14 (JST)