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に自前の関数を導入する際のテスト、デバッグに有効との印象。