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


Post a Comment