twitteroauth

twitter apiを使ったphpのソースを公開したが重要な欠陥に気づいて非公開にした。
そして修正しているうちに認証できなくなってしまった。
調べているとoauthで使用しているtwitteroauthが更新されていたので、
アップデートがてら作り直すことにした。

最新リリースを持ってくる。
https://github.com/abraham/twitteroauth/releases

0.7.4が去年の7/1にリリースされていた。

今のバージョンはなんだろうと見てみるとバージョンが書かれている場所がわからないが
ファイルのタイムスタンプが 2015 8/19なので0.5.4だ。クソ古い。

解凍の仕方も忘れている。

tar -zxvf 0.7.4.tar.gz

参考
https://qiita.com/sofpyon/items/982fe3a9ccebd8702867


自分のkeyを定義したphpファイルを作る。
common.php

これは前に作ったものをそのまま使える。

login.php

上記サイトのソースがコメントまで同じだ。
前回もこの人のを参考にしたのか?
requireのパスだけ今回のものに変える。

mypage.php
を作って動かす。

http error 500になる。

下記2行をソースの最初に書いてエラーメッセージを表示させる。

ini_set("display_errors", On);
error_reporting(E_ALL);


Notice: Undefined index: access_token in /var/www/html/ssl/bl/mypage.php on line 14 Parse error: syntax error, unexpected '[' in /var/www/html/ssl/bl/twitteroauth-0.7.4/src/TwitterOAuth.php on line 128

これはphpのバージョンが古いために出るらしい。
今のphpのバージョンは5.3.3

自動アップデート(名前は忘れた)しているがphpは上がっていない。
レポジトリを変えないとダメなようだ。

こちらを参考にphpをアップデート

https://qiita.com/ozawan/items/caf6e7ddec7c6b31f01e

バージョンを確認...... 変わってない!

apacheを再起動しないとダメだそうだ。

service httpd restart

変わった。

今度は以下のエラー。

Notice: Undefined index: access_token in /xxxx/mypage.php on line 14
object(stdClass)#3 (1) { ["errors"]=> array(1) { [0]=> object(stdClass)#7 (2) { ["message"]=> string(53) "Your credentials do not allow access to this resource" ["code"]=> int(220) } } }

twitteroauth, phpのバージョンをあげる前と同じだ。

許可されていないAPIを呼び出した時などに出るエラーのようだが、
アクセストークンを取り出しているだけだ。

APIの利用制限に引っかかったのか?












twitterでブロックしているユーザの表示、ブロック解除

修正した。

ブラックリストに加えて、NG wordリストを作成し、
NG wordを含むアカウントがブロックされている場合はブロック解除しないようにした。

それから、ブラックリストへの登録は今までは手作業であったが、
ブロックしているユーザを選択して登録できるようにした。

※ドメイン名は example.comに置き換えてある。

<?php
session_start();
require_once 'common.php';
require_once 'vendor/abraham/twitteroauth/autoload.php';
use Abraham\TwitterOAuth\TwitterOAuth;
$access_token = $_SESSION['access_token'];
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $access_token['oauth_token'], $access_token['oauth_token_secret']);
$user = $connection->get("account/verify_credentials");
$blocking_users = array();
echo '<img src="' . $user->profile_image_url . '">' . ' ' . $user->name . ' is blocking following users.<br><br>';

$showdetail = 0;
$black_list = @file('blacklist.txt');
$black_list = array_map('trim', $black_list);
$ngwords = @file('ngwords.txt');
$ngwords = array_map('trim', $ngwords);
echo '<a href="https://example.com/bl/mypage.php?mode=unblock">unblock all</a><br><hr>';
echo '<a href="https://example.com/bl/mypage.php">refresh</a><hr>';
echo '<a href="https://example.com/bl/addbl.php">add blacklist</a><br><br><hr>';
echo '<a href="https://example.com/bl/mypage.php?mode=reblock">reblock users in bl</a><br><hr>';
echo '<a href="https://example.com/bl/edbl.php">edit blacklist</a><hr>';
echo '<a href="https://example.com/bl/mypage.php?mode=logout">logout</a><br>';
$blu_file = 'blocking.txt';
$req2 = $connection->OAuthRequest('https://api.twitter.com/1.1/blocks/list.json','GET',array('count'=>'100'));
$blocks = json_decode($req2,true);
if (isset($blocks) && empty($blocks->errors)) {
        echo '<hr>';
        foreach ($blocks as $val) {
                for($i = 0; $i<count($val)-1;$i++)
                {
                        $blocking_user = $val[$i]['screen_name'];
                        $is_ng = False;
                        foreach($ngwords as $ng) {
                                if(stripos($blocking_user, $ng) !== false) {
                                        $is_ng = True;
                                }
                        }
                        if ($is_ng) {
                                echo '<font size="1">* NG * </font>';
                                $showdetail = 0;
                        } elseif (in_array($blocking_user,$black_list)) {
                                echo '<font size="1">* BL * </font>';
                                $showdetail = 0;
                        } else {
                                $showdetail = 1;
                        }
                        echo
                                '<font size="1">' . $blocking_user . '  ' .$val[$i]['name'] . '   '
                                . '<font color=blue>' . $blocking_user . '</font><br>' ;
                                if ($showdetail > 0) {
                                        echo '<blockquote>' . '<img src="' . $val[$i]['profile_image_url'] . '"><br>'
                                        . $val[$i]['description'] . '<br></blockquote>';
                                        $blu_current .= $blocking_user . "\n";
                                }
                        $blocking_users_list[] = $blocking_user;
                }
        }
} else {
        echo 'you are blocking nobody.';
}
file_put_contents($blu_file, $blu_current);
if(isset($_GET['mode']))        {
        if ($_GET['mode'] == 'unblock') {
                foreach($blocking_users_list as $a)     {
                        $is_ng = False;
                        foreach($ngwords as $ng) {
                                if(stripos($a, $ng) !== false) {
                                        $is_ng = True;
                                }
                        }
                        if (in_array($a,$black_list)) {
                                echo $a . " is in blacklist.<br>";
                        } elseif($is_ng) {
                                echo $a . " contains ngwords.<br>";
                        }  else {
                                $result = $connection->OAuthRequest('https://api.twitter.com/1.1/blocks/destroy.json','POST'
                                        ,array('screen_name'=>$a));
                                $j = json_decode($result,true);
                                if (isset($j)) {
                                        echo $j['screen_name']." is unblocked.<br>";
                                }
                        }
                }
        } elseif ($_GET['mode'] == 'reblock') {
                        foreach($black_list as $a)     {
                                $result = $connection->OAuthRequest('https://api.twitter.com/1.1/blocks/create.json','POST'
                                        ,array('screen_name'=>$a));
                                $j = json_decode($result,true);
                                if (isset($j)) {
                                        echo $j['screen_name']." is blocked.<br>";
                                }
                        }
                }
        header("location:https://example.com/bl/mypage.php");
        exit();
}
if(isset($_GET['mode']))        {
        if ($_GET['mode'] == 'logout')  {
                session_destroy();
                header("location:https://example.com/bl/login.php");
        }
}
?>


ブラックリスト登録

--------------------------
<form name='form1' action = 'addbl_result.php' method='get' >
<?php
$array = file("blocking.txt");
for($i = 0 ; $i < count($array); $i++){
        echo '<input name="blocking[]" type="checkbox" value=' . $array[$i] .'>' . $array[$i] . '<br>' ;
}
?>
<input type="submit" vlaue="submit">
</form>

------------------------------

<?php
$bl_file = 'blacklist.txt';
$current = file_get_contents($bl_file);

if(empty($_GET["blocking"])){
     echo "何も選んでません";
}else{
     $blocking = $_GET["blocking"];
     foreach($blocking as $value){
#       echo $value . '<br>';
        $current .= $value. "\n";
     }
}
file_put_contents($bl_file, $current);
header("location:http://example.com/bl/mypage.php");
exit();
?>