クリスマスに向けて2 or 3次元の嫁 or 婿を収集する話(副題:PHPでTwitter上の画像を収集する話)

# 初めに
この記事の対象は

- TwitterのAPIをPHPを使って触ってみたい方
- Twitter上の画像を収集したい方
- 1週間後に来たるクリスマスに向けて次元を問わず美少女(美男子)の画像を集め寂しさを紛らわせたい方

です。

なお、筆者も初心者なので間違いやひどい書き方をしている部分も
多々あると思いますので気づいたらご指摘ください。
ご不明な点があればわかる範囲で対応します。

#注意事項

残念ながらTwitterのAPIの都合上遡れるのは1週間分のツイートだけです。
(もしそれ以上遡る方法を御存知の方はお教えください)

#ファイル構成
─ tweetpictures.php ←画像収集をする部分
─ [twitteroauth] フォルダ ←[twitteroauth](https://github.com/abraham/twitteroauth) 認証に使うライブラリ
─index.html ←クエリや保存先を指定する画面

全部を同じフォルダに配置する。

#作るプログラムの簡単な流れ
## 自分のTwitterのアカウントで接続する
これによりツイートの検索や自分のTLの取得などができるようになります。
ライブラリとしては[twitteroauth](https://github.com/abraham/twitteroauth)を使います。
細かいことは[この記事](http://qiita.com/tsunet111/items/9309801cd3e3bcf6e32a)を参考にしました。
## 好きなクエリで検索する
index.htmlからクエリをtweetpictures.phpに送る。
## 保存先のフォルダを指定する
index.htmlから保存先のパスをtweetpictures.phpに送る。
## 画像をダウンロードする
1. あるクエリを含むツイートで、かつ、画像を含むツイートを取得する
2. その画像のURLを用いて保存する

# コード

```php:twitter.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<meta http-equiv="Refresh" content="100">
<!-- ↑ 1度に100件しかツイートを取得できないので100秒ごとにツイートを自動取得させる -->

<title>bot test</title>
</head>
<body>

<?php
session_start();

set_time_limit(315000); //タイムアウトを防ぐ
require "twitteroauth/autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;





if (isset($_POST['isFirst'])) {
  //index.htmlから来ていたら諸値を初期化する。
  $_SESSION['count'] ='999999999999999999';
  $_SESSION['directory'] =$_POST['directory'];
  $_SESSION['query'] =$_POST['query'];
}

//index.htmlから取得される保存先のパス
$directory=$_SESSION['directory'];
//index.htmlから取得されるクエリ
$word=$_SESSION['query'];


$max_id=$_SESSION['count'];//検索を開始するツイートのID。これを利用して取得できるツイート数への制限に対応
if(!file_exists('./'.$directory)){ //指定した名前のディレクトリが無かったら作る
    mkdir('./'.$directory);
  }

//認証情報
$consumerKey = "ここは各自のconsumerKeyを入力";
$consumerSecret = "ここは各自のconsumerSecretを入力";
$accessToken = "ここは各自のaccessTokenを入力";
$accessTokenSecret = "ここは各自のaccessTokenSecretを入力";

$query=$word.' -RT filter:twimg -#RTした人全員フォローする';
//クエリを少し編集(ここは各自の好きに編集して下さい)
// -RT → RTを含まない
// filter:twimg →画像を含むツイートのみを取得
// -#RTした人全員フォローする → タグ #RTした人全員フォローする を含むツイートを除外する
//これらは空白区切りで組み合わせる事ができる



$repeat=11;
$connection = new TwitterOAuth($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret);
//接続




$tweets_params = ['q' =>$query,'count' => '100','max_id' =>$max_id]; //クエリ
// q → 検索クエリ
// count → 検索件数。上限は100
// max_id → 検索を開始するツイートのid
$search_result=$connection->get('search/tweets', $tweets_params);
// $tweets_paramsの条件でツイートを検索する
$tweets =$search_result-> statuses;
// $search_result-> statuses → 検索結果のうちツイートの情報
//$tweetsの各要素 →ツイートの本文、画像情報、ファボ数などのツイートの情報を持つ  $tweetsはたくさんのツイートの情報の配列

if(count($tweets)==1){//ツイートが遡れなくなったら
header( "Location:index.html" ) ;//index画面に戻る
}


echo '初期値'.$max_id.'<br>';
//var_dump($tweets);
for($count=0;$count<$repeat;$count++){
  foreach ($tweets as $tweet) {
    echo 'ファボ数:'.$tweet->favorite_count.'  <br>';
    echo $tweet->text.'<br>';

        if($tweet->favorite_count>50){ //ファボ数で保存するかを選択。50はお好みで変更してください。
        foreach ($tweet->extended_entities->media as $pic){
//$tweet->extended_entities->media → 画像の情報が詰まった配列
            echo '<strong>保存した<br></strong>';
            $url =$pic->media_url ;  // $pic->media_url → 画像のURL
            $data = file_get_contents($url); //画像データを取得して
            file_put_contents('./'.$directory.'/'.$pic->id.'-'.$no.'.jpg',$data); //指定したフォルダに保存する。
            $no+=1; //画像の上書きを防ぐために noを付けて保存する
        }
        $no=1;
      }
      echo '<br>';
      echo $tweet->id;
      echo '<br>';
      echo '<br>';

     $_SESSION['count']=$tweet->id; //一度に取得できるツイート数が限られているため続きのツイートから始めるためにIDを保存
  }
  $max_id=$_SESSION['count'];
  var_dump($max_id);
  echo '<br>before↑<br>after↓<br>';
//  $max_id=$search_result->search_metadata;
  //	var_dump($search_result->search_metadata);
  //新しいパラメーターでツイートを取得
  $tweets_params = ['q' =>$query ,'count' => '100','max_id' =>$max_id];
  $tweets = $connection->get('search/tweets', $tweets_params)->statuses;
 // echo '<br><strong>'.$max_id=$tweet->id_str.'</strong>';
   echo '<br><br><br><br>--------------------------一区切り-----------------------------------<br><br><br><br>';


}


?>


</body>
</html>

```

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>フォーム</title>
</head>

<body>
<h1>Twitter画像保存サービス</h1>
<p></p>

<form method="POST" action="tweetpictures.php">
<input type="hidden" name="isFirst" value=1>
<table border="1">
<tr>
  <td>クエリ</td>
  <td><input type="text" name="query" size="30"></td>
</tr>

<tr>
  <td>ディレクトリ</td>
  <td><input type="text" name="directory" size="30"></td>
</tr>



<tr>
  <td colspan="2"><input type="submit" name="sub1" value="保存"></td>
</tr>
</table>
</form>

</body>

```

#実行例
![画面1.png](https://qiita-image-store.s3.amazonaws.com/0/100303/3a96ec43-2755-c253-5332-b4c6e45fd2d9.png)
図1.何の飾り気も無い検索画面
これで保存を押してしばらく放置しておくと

![画面2.png](https://qiita-image-store.s3.amazonaws.com/0/100303/740eccc5-90f2-83a2-53b9-3fb011789761.png)
図2. ラーメンの画像(?)
ディレクトリramenにラーメンの画像が集まる。一部あまり関係の無い画像も混じるがそれはご愛嬌ということで。

#備考 クエリの詳細
[ここ](http://cucmberium.hatenablog.com/entry/2015/02/25/120221)に日本語で
[ここ](https://dev.twitter.com/rest/public/search)に英語(公式)で
便利なクエリをまとめてくださっていますのでここを参考にすると良いと思います。
個人的に使えそうだと思ったものは

- -(除外したい言葉やタグ) ... 検索に邪魔なハッシュタグを含むツイートを除外する際に等に有用
例: -#RTした人全員フォローする

-  filter:safe ... 有害な画像を除外するフィルター。
余談だがこれには - (notの意味)が有効である。
( ~~ただし残念なことにTwitterの有害判定は結構ガバガバである。~~ )


#おわり
それでは良い画像収集ライフを。
あなたのクリスマスが少しでも有意義になる事を祈っています。