TweetANew

提供: きまぐれ手記 Kimagurenote
移動先: 案内検索
English information available at mw:Extension:TweetANew

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

文字数が多い時の仕様変更に伴う修正

twitterでつぶやける文字数が280字(日本語文字などを除く)に拡張されたが、TweetANewのコードは古いままだったので、拡張した。

他にも URLが字数カウントから除外された等の情報もあるようだが、詳しい仕様が分からないので、ひとまず280字への拡大と、日本語等のいわゆる全角文字を2字と数える関数への変更のみを実施した。

また、MediaWiki の $wgLang->mb_substr() は動作しなくなっていた(つまりツイートする文字数が長いと例外エラーが発生する状態)。MediaWiki 1.27 よりmbstringが必須化されたことに伴い削除されたものと思われる。併せて修正した。

ちなみにバッチ適用前のコードは公式ダウンロードで提供される 1.32 (latest stable MediaWiki) 向けのものだが、ツイート対象文字列が長いと例外エラーが発生するバグ持ちということになる。 (これ、stableになっているけれど、メンテナンスされていないよね…)

--- TweetANew.body.php.20181017	2018-10-17 11:39:10.000000000 +0900
+++ TweetANew.body.php	2019-07-15 16:29:45.000000000 +0900
@@ -261,16 +261,16 @@
 		if ( !in_array( $wikiPage->getTitle()->getText(), $wgTweetANewBlacklist ) ) {
 			# Calculate length of tweet factoring in t.co
 			if ( stripos( $finalurl, 'https:' ) !== false ) {
-				$tweet_text_count = 140 - 23 + mb_strlen( $finalurl );
+				$tweet_text_count = 280 - 23 + mb_strwidth( $finalurl );
 			} elseif ( stripos( $finalurl, 'http:' ) !== false ) {
-				$tweet_text_count = 140 - 22 + mb_strlen( $finalurl );
+				$tweet_text_count = 280 - 22 + mb_strwidth( $finalurl );
 			} else {
-				$tweet_text_count = 140;
+				$tweet_text_count = 280;
 			}
 
-			# 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 ) . '...';
+			# Check if length of tweet is beyond 280 characters and shorten if necessary
+			if ( mb_strwidth( $tweet_text ) > $tweet_text_count ) {
+				$tweet_text = mb_strimwidth($tweet_text, 0, $tweet_text_count, '…');
 			}
 
 			# Make connection to Twitter

このパッチは https://phabricator.wikimedia.org/T228020 に投げておいた(Gerrit Patch Uploader は Internal Server Error になってしまい使えなかった)ので、じきに直るかもしれない。

さくらインターネットのアップデート後の不具合対策

2019年4月11日未明にプロバイダ(さくらインターネット)がバージョンアップを実施して以降、MediaWiki#CurlHttpRequest の不具合修正と同様の不具合が発生していた。

下記のパッチを当てることで回避できる。

--- lib/tmhOAuth.php.062        2018-06-09 15:22:34.000000000 +0900
+++ lib/tmhOAuth.php    2019-07-15 14:50:56.000000000 +0900
@@ -574,7 +574,6 @@
       CURLOPT_SSL_VERIFYHOST => $this->config['curl_ssl_verifyhost'],

       CURLOPT_FOLLOWLOCATION => $this->config['curl_followlocation'],
-      CURLOPT_PROXY          => $this->config['curl_proxy'],
       CURLOPT_ENCODING       => $this->config['curl_encoding'],
       CURLOPT_URL            => $this->url,
       // process the headers
@@ -583,6 +582,9 @@
       CURLINFO_HEADER_OUT    => true,
     ));

+    if (!empty($this->config['curl_proxy']))
+      curl_setopt($c, CURLOPT_PROXY, $this->config['curl_proxy']);
+
     if ($this->config['curl_cainfo'] !== false)
       curl_setopt($c, CURLOPT_CAINFO, $this->config['curl_cainfo']);

なお、TweetANew に同梱のtmhOAuthライブラリは相変わらず古い物 (0.6.2) が使われているが、最新版 (0.8.4) に更新しても動作する。最新版に対するパッチは下記(行番号が変わったくらいで中身は同じ)。

--- lib/tmhOAuth.php.084        2019-07-15 14:34:15.320754000 +0900
+++ lib/tmhOAuth.php        2019-07-15 14:32:02.000000000 +0900
@@ -799,7 +799,6 @@
       CURLOPT_SSL_VERIFYHOST => $this->config['curl_ssl_verifyhost'],

       CURLOPT_FOLLOWLOCATION => $this->config['curl_followlocation'],
-      CURLOPT_PROXY          => $this->config['curl_proxy'],
       CURLOPT_ENCODING       => $this->config['curl_encoding'],
       CURLOPT_URL            => $this->request_settings['url'],
       // process the headers
@@ -808,6 +807,9 @@
       CURLINFO_HEADER_OUT    => true,
     ));

+       if (!empty($this->config['curl_proxy']))
+               curl_setopt($c, CURLOPT_PROXY, $this->config['curl_proxy']);
+
     if ($this->config['curl_cainfo'] !== false)
       curl_setopt($c, CURLOPT_CAINFO, $this->config['curl_cainfo']);

MediaWiki 1.29 からの仕様変更に伴う修正

注意: Extension:TweetANew からダウンロードできる最新の REL-1.29 では下記の修正が反映されているようなので(修正したならphabricatorに一言くれればいいのにと思うが)、最新版に更新すればpatchを当てなくても動きそう。--2017年8月30日 (水) 21:48 (JST)

Hooks

TweetANew では下記3つのHookが使われているが、これらは全て旧処理で非推奨となっており、上2つは 1.28.x までは使えるものの、次の 1.29 では打ち切られてしまうようだ。

  1. ArticleInsertComplete
  2. ArticleSaveComplete
  3. EditPageBeforeEditChecks

とはいえ、上2つは代替処理が用意されているので、そちらを使うよう書き換える。

困ったのは3つめの EditPageBeforeEditChecks で、これは(すぐに打ち切られることはないとは思うが)まだ代替処理に関する解説が無い。

探すと、似たようなことが出来そうな物 EditPageGetCheckboxesDefinition が見つかったが、これはまだ実装されておらず、1.29.0 から実装予定のようだ。

そこで、まず上2つは新しい処理に書き換える。3つめのはひとまず残し、新処理を加えて、$wgVersion を見て分岐させることにする。

MediaWiki 1.29 での動作確認はしていないが、RELEASE版が出た後で改めて試してみたいと思う。

MediaWiki 1.29 の Hooks/EditPageGetCheckboxesDefinition 対応

MediaWiki 1.29.1 を入れたので、ようやくパッチの動作を試せるようになった…

マニュアルも更新されていた。Hookで編集するarrayの書き方は EditPage::getCheckboxesDefinition() を見ろとある(includes/EditPage.php のコードを見るのが早い)。

更新された仕様に合わせてパッチを書き換え。これで、1.29以降で実装された新処理でチェックボックスが出るようになり、ツイートもできるようになった。

なお、しばらくは旧処理のままでも動くと思われるが(1.29.1では旧処理も動いていた)、チェックボックスのデザインも変わっていた(旧処理ではチェックボックスの見た目も古いままになり違和感がある)ので、新処理への更新がお勧め。 --2017年8月30日 (水) 20:20 (JST)

Article→WikiPage

1.28.xTweetANew 1.28 の組み合わせで使うと下記のエラーが発生してMediaWikiが止まってしまう。

Fatal error: Call to undefined method WikiPage::estimateRevisionCount()
	in /path/to/MediaWiki/extensions/TweetANew/TweetANew.body.php on line 120

Fatal error: Call to undefined method WikiPage::getContext() in /path/to/MediaWiki/extensions/TweetANew/TweetANew.body.php on line 202

※修正しながら動かしていたので、行番号はずれているかもしれない。

コードを眺めていると、Article を直接呼んでいる箇所が複数あるが、今はこうした操作は保証外で、替わりにWikiPageを使うことが推奨されているようなので、該当する処理を全て書き換える。

なお、このうち (Article)->getContext()->msg は wfMessage() に換えればよい

patch

TweetANew.1.28.patch を更新しました。以前のパッチは1.29以降でうまく動かないので、新しいパッチで書き換えてください。(TweetANew.body.1.28.patch の方は変更無し) --2017年8月30日 (水) 20:20 (JST)

install

  1. 以前のバージョンがインストール済みの場合は事前に移動しておく
  2. ここ から 1.28 をダウンロードして、MediaWiki の extensions ディレクトリ下に展開
  3. 上記2つのパッチをダウンロードして同じ場所に置く
  4. patch適用
% cd /path/to/MediaWiki/extensions
% mv TweetANew TweetANew.old
% wget https://extdist.wmflabs.org/dist/extensions/TweetANew-REL1_28-541a296.tar.gz
% tar xzf TweetANew-REL1_28-541a296.tar.gz
% cd TweetANew
% wget http://kimagurenote.net/file/TweetANew.1.28.patch
% wget http://kimagurenote.net/file/TweetANew.body.1.28.patch
% patch -p < TweetANew.1.28.patch 
% patch -p < TweetANew.body.1.28.patch 

report

https://phabricator.wikimedia.org/T168842 にて報告しておいた。以前Bugzillaを使っていた頃から今回Phabricatorに変わっていてアカウント作成が面倒だった…--2017年6月26日 (月) 19:42 (JST)

MediaWiki 1.28 までの仕様変更に伴う修正

1.27.x を飛ばして 1.28.x に更新したところ、TweetANewが原因で動作しなくなってしまった。

一旦無効にして更新を進め、後にエラーログを確認した所、下記のエラーが出ていた。

Fatal error: Call to undefined function wfMsg()
	in /path/to/MediaWiki/extensions/TweetANew/TweetANew.php on line 227

調べると、 wfMsg() が MediaWiki 1.27 LTS までで削除されたとある。

最新の TweetANew 1.28 では対策済みになっていたので、これをインストールして動かすと、次に異なるエラーが発生。

Fatal error: Call to undefined method WikiPage::estimateRevisionCount()
	in /path/to/MediaWiki/extensions/TweetANew/TweetANew.body.php on line 120

…なんだか根が深そうだx_x

#MediaWiki 1.29 からの仕様変更に伴う修正 につづく

過去の不具合

ここで2014年までに報告した不具合(マルチバイト文字への対応を含む)は、全て修正済みになっていた。

インストール

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

2014年までに報告した不具合修正は反映済みになっていたので、少なくとも MediaWiki 1.26.x までは、ここから最新版を入手して普通にインストールすれば使えるはずです。