Twitterのミラーアカウント

はじめに

Twitterを使っていて一番思うことはアカウントの住み分けをしたいということである。特に自分の場合は学校の友達用とネットの友達用で分けている。
学校の友達用はフォロー数フォロワー数が共に40くらいで、プライベートな内容も割と喋っている。しかし、プライベートな内容はどちらかといえばリプばかりで、自分自身のつぶやき自体は別に学校の友達でなくても、仲のいいネット友人になら見せてもいいのではないかと思っている。
しかし、会話の内容は相手が鍵垢であったとしてもこちらが送ったリプから内容がおおよそ推定できてしまうので、ネットリテラシーが異常に高い自分としては相手に若干申し訳ないという思いがある。
また、自分の友人のフォロワーには鍵垢でない人も多いのでそっちの発言から学校や職場や立ち位置がバレる可能性も多いにある。
そういう意味で自分の学校用アカウントが誰をフォローしているのかということについても極力知られたくない。

つまりどういうことなのん?

  1. フォロワー、フォロー共に見られたくない。
  2. リプは見られたくない。
  3. 通常のつぶやきは仲の良いネット友人には見せてもいい。
  4. 学校用アカウントは通常のつぶやきも割りとしている。

これらを解決するためのシステムが未だにTwitterには実装されていない(例えば、鍵垢に対するリプは見れないようにする)ので、自分で上手いこと解決策を探さなければいけない。
そこで思い当たった結論が以下の通り。
自分のコピーアカウント作ればよくね????
ここでいうコピーアカウントというのはIDを複製したりだとか、そんな高度なテクニックは使わない。
要するに鍵垢である自分のアカウントのツイートを取得し、そのうちリプライでないものを別のアカウントで自動ツイートするという仕組みだと思ってもらえれば差し支えない。
別のアカウントというのは自動ツイート以外にもつぶやいていてもいいものとする。

どういう仕組みにするか?

これを実現するためには以下のステップが必要になる。

  1. 鍵垢のツイート取得。
  2. ツイート内容を解析、リプライ以外を抽出。
  3. 別のアカウントで呟く。

このうち、最もめんどくさそうなのが1の鍵垢のツイート取得である。
が、これは既存のフレームワークを使うことで簡単に実現できる。
twitteroauthというPHP用のライブラリがあり、これを使うことでTLの取得、TLにツイートといった動作が実現できる。

  1. 5分起きに最新のツイートを50件ほど取得。
  2. 取得したツイートのうち、@を含まないものを列挙。
  3. それらを別のアカウントでツイート。

という3つのステップを踏むことで実現できそうだ。

1 鍵アカウントのつぶやき取得

まずはtwitteroauthを導入する。githubで公開されているので単にそれをcloneしてくるだけ。

twitteroauthの導入

me@TKG:~/Tools/twitter $ git clone https://github.com/abraham/twitteroauth.git
Cloning into 'twitteroauth'...
remote: Counting objects: 1448, done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 1448 (delta 2), reused 4 (delta 0), pack-reused 1441
Receiving objects: 100% (1448/1448), 1.18 MiB | 922.00 KiB/s, done.
Resolving deltas: 100% (808/808), done.
Checking connectivity... done.

Twitter APIの登録

https://apps.twitter.com/で登録。

  • CONSUMER KEY
  • CONSUMER SECRET
  • ACCESS TOKEN
  • ACCESS TOKEN SECRET

の4つが必要になります。これに関しては簡単に取得できるので割愛します。

タイムラインを取得する

PHPに以下のコードを貼り付ければ自分のツイートの上位50件がリプライ以外全て取得できます。
リプライ以外を50件取得するのではなく、50件取得してリプライ以外を抽出するコードなので注意。$resはJSON形式で、中身はstdClass Objectになっているのでアロー(->)でデータにアクセスします。
textというのが実際のツイートの中身。他にもめちゃくちゃパラメータがあるのでいろいろ見ると楽しかったりする。

require "twitteroauth/autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;
$consumerKey = "XXXXXXXXXX";
$consumerSecret = "XXXXXXXXXX";
$accessToken = "XXXXXXXXXX";
$accessTokenSecret = "XXXXXXXXXX";
$connection = new TwitterOAuth($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret);
$res = $connection->get("statuses/user_timeline", ["count" => 50, "exclude_replies" => true]);
foreach($res as $value){
    echo($value->text."\n");
}

ミラーアカウントのキーを取得する

現段階ではツイートを取得したいアカウントの鍵は入手することができた。しかし、このままでは他のアカウントで呟くことができない。
そこで、取得したツイートをつぶやくためのアカウントのキーが必要となる。
で、ここで大いに躓いた。

どのくらい躓いたかというと約二日かかった。この記事を公開するよりも先にMysqlの記事の方が書き終わってしまったくらいである。

結論から言うと、PHP7ではtwitteroauthを使って別アカウントのキーを取得することができない、ということである。PHP5を使えば何の問題もなくキーが入手できた。

Twitter Appに飛ばすリンクを作成する

ここでは何をするかというとTwitter Appの認証のためのページへと飛ばすためのURLの作成である。
診断メーカーとかでよく見るアレである。
実はあれはアクセスする度に異なったトークンが発行されており、同一ユーザで合っても二回同じページにアクセスすることはできない。一回きりのワンタイムトークンなのだ。

実際にこのページをPHPが動くサーバ上に配置してアクセスしてみると毎回トークンの内容が変わるのがご覧いただけると思う。

ここではTwitterのサーバと通信することでトークンを作成し、それらをパラメータに入れたURLを作成している。
ユーザはそのリンクを踏むことで間違いなくTwitter社に認定されたページに飛ぶことが保証されるのだ。

login.phpの作成

login.phpはアクセスしてきたユーザに認証用のページを表示するためのページである。

session_start();
require 'vendor/autoload.php';
use Abraham\TwitterOAuth\TwitterOAuth;
define('CONSUMER_KEY', 'XXXXXXXXXX');
define('CONSUMER_SECRET', 'XXXXXXXXXX');
define('OAUTH_CALLBACK', 'XXXXXXXX');
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET);
$request_token = $connection->oauth('oauth/request_token', array('oauth_callback' => OAUTH_CALLBACK));
var_dump($request_token);
$_SESSION['oauth_token'] = $request_token['oauth_token'];
$_SESSION['oauth_token_secret'] = $request_token['oauth_token_secret'];
$url = $connection->url('oauth/authorize', ['oauth_token' => $request_token['oauth_token']]);
echo("<a href="\&quot;${url}\&quot;">authorize</a>");
callback.phpの作成

callback.phpはアクセスしてきたユーザの情報を確認するためのページである。
ここでユーザのトークンを確認することで、ツイート分析アプリはユーザのツイートをチェックして解析している。このcallback先のURLはApp設定から行えるので忘れずにやっておくこと。
一応、login.php内でも記述しているがどちらが優先されるのだろう?

session_start();
define('CONSUMER_KEY', 'XXXXXXXXXX');
define('CONSUMER_SECRET', 'XXXXXXXXXX');
require "vendor/autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;
$request_token = [];
$request_token['oauth_token'] = $_SESSION['oauth_token'];
$request_token['oauth_token_secret'] = $_SESSION['oauth_token_secret'];
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $request_token['oauth_token'], $request_token['oauth_token_secret']);
$access_token = $connection-&gt;oauth("oauth/access_token", ["oauth_verifier" =&gt; $_REQUEST['oauth_verifier']]);
var_dump($access_token);

できたもの

結局どんなコード書いたのかってことを読者(がいれば)さんは知りたいだろうし、自分もそこだけ書くのが楽そうなので、結論から書いてしまいたいと思う。
ただ、コード自体は長くはないものの割とめんどくさいのでGithubにコードを上げておいた。もちろん秘密鍵は載っていないが(笑)

謝辞

アイキャッチアイコンはuiconstock.comさんのを使わせていただいた。