長文を140字に自動分割してツイートする

探しても任意のツイートへのリプライ指定ができるツールがなく、
自分用にローカルで動かすために書いたので、色々と適当です。

参考：Twitter APIでつぶやきを取得する
https://qiita.com/yokoh9/items/760e432ebd39040d5a0f

Twitter Apps
https://apps.twitter.com/

twitteroauth
https://github.com/abraham/twitteroauth/releases

```php:index.php
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<meta name="robots" content="noindex,nofollow">
	<meta id="_robots" content="noindex,nofollow">
	<title>連続ツイート</title>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js"></script>
</head>
<body>
<?php
ini_set( 'display_errors', 1 );

// タイムゾーン
date_default_timezone_set('Asia/Tokyo');

require "twitteroauth/autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;

// APIキー
require "./key.php";
$consumerKey = YOUR_CONSUMER_KEY;
$consumerSecret = YOUR_CONSUMER_SECRET;
$accessToken = YOUR_ACCESSTOKEN;
$accessTokenSecret = YOUR_ACCESSTOKEN_SECRET;

mb_internal_encoding("UTF-8");

if (empty($_REQUEST['text'])) : #=====================================================
?>
<script>
$(document).ready(function(){
	$("#twid").val(window.localStorage.getItem('twId'));
	$("#twtext").val(window.localStorage.getItem('twText'));
	$("#twid").focus();
});
jQuery(function($){
	function changeText () {
		window.localStorage.setItem('twId', $("#twid").val());
		window.localStorage.setItem('twText', $("#twtext").val());
	}
	$("#twid").bind("change keyup click", (changeText));
	$("#twtext").bind("change keyup click", (changeText));
});
</script>
<pre><form action="index.php" method="post">ツイート内容　<input type="submit" value="　分割　">

<input type="text" id="twid" name="twid" style="width:400px;max-width:80%;padding:10px;" placeholder="リプライ先のツイート" autocomplete="off"><input type="reset" value="消去" style="margin-left:10px;padding:7px;">

<textarea id="twtext" name="text" style="border:1px solid #999;width:500px;max-width:90%;height:500px;max-height:80%;padding:10px;"></textarea>
</form></pre>
<?php
elseif (empty($_REQUEST['textlist'])) : #=====================================================
?>

<script>
jQuery(function($){
	if (window.localStorage.getItem('twText') == '') {
		location.href = 'index.php';
	}
});
</script>

<pre>
<?php

	if (!empty($_REQUEST['twid'])) {
		$twid = substr($_REQUEST['twid'], strrpos($_REQUEST['twid'], '/')+1);
	} else {
		$twid = '';
	}
	echo '<form action="index.php" method="post">ツイート分割内容　<input type="submit" value="ツイート"><input type="hidden" name="text" value="ok">
<input type="text" name="twid" value="'.$twid.'" readonly style="width:400px;">';

	// リプライするツイートの内容を表示
	if (!empty($twid)) {
	$connection = new TwitterOAuth($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret);
		$statuses = $connection->get("statuses/show/$twid");
		echo '
<textarea style="width:400px;max-width:90%;height:100px;" disabled>'.$statuses->text.'</textarea>';
	}

	$textlist = array();
	$tweetcount = 0;
	$textlist[$tweetcount] = '';
	$count = 0;
	$start = 0;

	$text = trim($_REQUEST['text']);
	$text = preg_replace("/\r\n|\r|\n/", "\n", $text);
	// パターン
	$pattern = '/｜(\w*)《(\w*)》/u';
	$noruby = '\1';
	$text = preg_replace($pattern,$noruby,$text);

	$text = str_replace("　", "", $text);
	$lastchar = '';
	for ($i = 0; $i < mb_strlen($text); $i++) {
		$char = mb_substr($text, $i, 1);

		// 0字の時きたら飛ばす文字
		if (($count == 0) and ($char == '、')) continue;
		if (($count == 0) and ($char == '。')) continue;
		if (($count == 0) and ($char == '」')) continue;

		if (($char == '…') and ($lastchar == '…')) {
			$lastchar = '';
			continue;
		}

		// 空行二回で次のツイート
		if (($char == "\n") and ($lastchar == "\n")) {
			$nextchar = mb_substr($text, $i+1, 1);
			if ($nextchar == "\n") {
				$i++;
				$tweetcount++;
				$textlist[$tweetcount] = '';
				$count = 0;
				$lastchar = '';
				continue;
			}
		}

		// 130字以上の時に来たら分割する文字
		if ($count > 130) {
			if (($char == "\n")) {
				$tweetcount++;
				$textlist[$tweetcount] = '';
				$count = 0;
				$lastchar = '';
				continue;
			}
			if (($char == "「")) {
				$tweetcount++;
				$textlist[$tweetcount] = '「';
				$count = 1;
				$lastchar = '';
				continue;
			}
			if (($char == "―")) {
				$tweetcount++;
				$textlist[$tweetcount] = '―';
				$count = 1;
				$lastchar = '';
				continue;
			}
		}

		$textlist[$tweetcount] .= $char;

		// 130字以上の時に来たら分割する文字
		if ($count > 130) {
			if (($char == "」")) $count = 140;
			if (($char == "、")) $count = 140;
			if (($char == "。")) $count = 140;
		}
		$count++;
		if ($count > 139) {
			$tweetcount++;
			$textlist[$tweetcount] = '';
			$count = 0;
			$lastchar = '';
		} else {
			$lastchar = $char;
		}
	}
	foreach ($textlist as $value) {
		echo "\n".'<textarea class="splittext" name="textlist[]" style="width:400px;max-width:90%;height:100px;margin-top:10px;">'.trim($value).'</textarea>'.mb_strlen($value);
	}
?>

<?php
	echo '</form></pre>';
else : #=====================================================
?>

<script>
if (window.localStorage.getItem('twText') == '') {
	location.href = 'index.php';
}
</script>
<a href="./">新規ツイート</a>

<pre>
<?php
	sleep(1);

	$twitter = new TwitterOAuth($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret);

	$id = $_REQUEST['twid'];
	// ツイート作成
	foreach ($_REQUEST['textlist'] as $value) {
		$tweettime = date("Y/m/d H:i:s");
		$text = $value;
		$result = $twitter->post(
		        "statuses/update",
		        array("status" => $text, "in_reply_to_status_id" => $id)
		);

		if($twitter->getLastHttpCode() == 200) {
		    // ツイート成功
		    echo "<b>成功　</b>$tweettime\n$text\n\n";
		    $body = $twitter->getLastBody();
		    $id = $body->id_str;
		} else {
		    // ツイート失敗
		    echo "<b style=\"color:red\">失敗　</b>$tweettime\n$text\n\n";
		}

	    // 出力バッファの内容を送信する
	    @ob_flush();
	    @flush();

		sleep(1);
	}
?>
</pre>
<script>
$(document).ready(function(){
	window.localStorage.setItem('twId', '/<?php echo $id ?>');
	window.localStorage.setItem('twText', '');
});
</script>

<?php
endif;
?>
<hr>
</body>
</html>
```

```php:key.php
<?php

define("YOUR_CONSUMER_KEY", "");
define("YOUR_CONSUMER_SECRET", "");
define("YOUR_ACCESSTOKEN", "");
define("YOUR_ACCESSTOKEN_SECRET", "");

?>
```