Twitterへの自動投稿システム不調 -原因はTwitterの仕様変更だった-
November 15, 2015 – 12:22 pmこのブログ上で独自に作成したTwitterへの「要約付き」自動投稿システムが11月になって、突然、動作しなくなっていた。投稿可能文字数を超えTwitter側にはじかれていた。
Twitterへの投稿可能文字数が140文字であることには変化はなかったが、本文に含まれるURLを文字数にカウントする方法に変更があり、これが影響していることが分かった。
phpソースを修正等についてメモしておいた。
Twitterへの自動投稿ツールの修正:
ほぼ3カ月前に、「WordPressの記事を『要約付き』でTwitterに自動的に投稿」を書いた。この記事には、この機能を実現するためのphpソースプログラムaction.phpを示しておいた。冒頭で述べたシステム不調を解決するため、このソースプログラムの一部を変更した。
変更部分は以下
修正前:
$length_content = 140 - $no_str_title - 20 - 6;
修正後:
$no_url = 23; $length_content = 140 - $no_str_title - $no_url - 4;
修正後のaction.php ソースプログラム全部を以下に掲げる:
<?php require_once 'OAuth/twitteroauth.php'; require_once 'config.php'; function action( $post ) { $post_id = $post->ID; $post_title = $post->post_title; $post_content = $post->post_content; $leavename = false; $post_url = get_permalink( $post_id, $leavename ); $no_str_title = mb_strlen($post_title, "UTF-8"); // $length_content = 140 - $no_str_title - 20 - 6; $no_url = 23; $length_content = 140 - $no_str_title - $no_url - 6; $post_excerpt = twcm_get_description( $post ); $trunc_content = mb_truncate($post_excerpt, $length=$length_content, $etc='..'); $message = $post_title . "\r\n" . $post_url . "\r\n" . $trunc_content; // Create Object for TwitterOAuth $consumer_key = CONSUMER_KEY; $consumer_secret = CONSUMER_SECRET; $access_token = ACCESS_TOKEN; $access_token_secret = ACCESS_SECRET; $tw_obj = new TwitterOAuth ( $consumer_key, $consumer_secret, $access_token, $access_token_secret ); //REST_API $tw_rest_api = 'https://api.twitter.com/1.1/statuses/update.json'; // Request Method $message_sent = $message; $request_method = 'POST'; $options = array( 'status' => $message ); $tw_obj_request = $tw_obj->OAuthRequest ( $tw_rest_api, $request_method, $options ); //$result = json_decode( $tw_obj_request ); } function twcm_get_description( $post ) { // global $post; if( has_excerpt() ) $desc = trim(get_the_excerpt()); else { $desc=strip_shortcodes( $post->post_content ); #avoid shortcode content //__insert_start $pos = mb_strpos($desc, '<!--more-->', 0, "UTF-8" ); if( $pos > 0 ) $desc = mb_substr($desc, 0, $pos, "UTF-8"); //__insert_end } $desc=strip_tags( $desc ); $desc=esc_attr($desc); $desc = trim(preg_replace("/\s+/", " ", $desc)); #to maintain a space between words in description. Since version 1.1.2 if( has_excerpt() ) $desc=twcm_sub_string($desc, 140); else $desc = mb_truncate($desc, $length = 140, $etc = '' ); return $desc; } //** // function added 2015/06/19 //** function mb_truncate($string, $length = 80, $etc = '[...]') { if ($length == 0) return ''; if (mb_strlen($string,"UTF-8") > $length) { $string = mb_substr($string, 0, $length, "UTF-8"); return $string.$etc; } else { return $string; } } function twcm_sub_string($text, $charlength=200) { $charlength++; $retext=""; if ( mb_strlen( $text ) > $charlength ) { $subex = mb_substr( $text, 0, $charlength - 5 ); $exwords = explode( ' ', $subex ); $excut = - ( mb_strlen( $exwords[ count( $exwords ) - 1 ] ) ); if ( $excut < 0 ) { $retext .= mb_substr( $subex, 0, $excut ); } else { $retext .= $subex; } $retext .= '[...]'; } else { $retext .= $text; } return $retext; } ?>
Twitterの仕様変更:
今回の障害発生の原因はTwitterの仕様変更のためであるが、仕様変更の内容についてはINTERNET Watchの記事「Twitter、つぶやける文字数が1文字減る仕様変更、t.coリンク全HTTPS化による『s』のため」に詳しく解説されている。
仕様変更に関わる部分を以下採録しておく:
Twitterでは、ツイートに含まれるURLのリンクはすべてt.coに短縮して扱われ、「http://t.co/<10けたのユニークな文字列>」に変換されるため、どんなに長い/短いURLもツイートで消費される文字数は22文字ということになる。ただし、HTTPSサイトのURLをつぶやいた場合は、t.coのリンクもHTTPSの「https://t.co/<10けたのユニークな文字列>」となり、1文字多い23文字だ。
それが今回、Twitterはt.coのリンクをすべてHTTPS化することを発表。すなわち、ツイートに含まれるのが非HTTPSサイトのURLであっても、t.co短縮後は「https://t.co~」となり23文字消費するかたちになる。
ちょっとした備忘録:
今回の障害を調査するうえでソースプログラムのデバッグをしたが、このとき役にたったのが、WordPressが提供しているシステム関数wp_mail()。WordPressに自前の関数を導入する際のテスト、デバッグに有効との印象。