データベースの特定のタグからすべての画像を instagram に保存しようとしています。私のコードは API を呼び出し、画像の最初のラウンドを読み込みます
$json = file_get_contents('https://api.instagram.com/v1/tags/hahanotfunny/media/recent?client_id='. $client_id .'&max_tag_id='. $max_tag_id) ;
応答の最初のページを通過すると、応答のページネーション部分のリンクを取得して、別のページがあるかどうかを確認します。また、「max_tag_id」の値があるかどうかを確認し、データベースの「最大」値を更新します。私が最大値を持っている理由は、新しい画像があるという「リアルタイム」からの応答を受け取ったときに、最後の最大時間からそれらのダウンロードを開始するためです。ただし、私のコードには問題があります。応答の最後のページ (ページネーション リンクがない) にいる場合、「max_tag_id」変数がないため、データベースへの更新はありません。そのため、次にスクレイパーを実行すると、最後に認識された「max_tag_id」から開始され、データベースに記録されている最後のページの画像が重複します。
それで、私の質問は、特定のタグで新しい画像が利用可能であるという別の「リアルタイム」アラートを受け取った場合、データベースに保存されている最後のレコードからそれらを見つけるにはどうすればよいですか?
$dbConnection = new PDO('mysql:dbname=XXXXXXX;host=127.0.0.1;charset=utf8', 'XXXXXXXXX', 'XXXXX');
$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
function getMax() {
global $dbConnection;
$tag = 'hahanotfunny';
$selectTotals = $dbConnection->prepare("SELECT * FROM instagram_time WHERE tag = :tag LIMIT 1");
$selectTotals->execute(array(':tag' => $tag));
foreach ($selectTotals as $time) {
$max = $time['max'];
}
return $max;
}
function updateMax($data) {
global $dbConnection;
$tag = 'hahanotfunny';
$selectTotals = $dbConnection->prepare("UPDATE instagram_time SET max = :maxid WHERE tag = :tag LIMIT 1");
$selectTotals->execute(array(':maxid' => $data, ':tag' => $tag));
}
function fetchData() {
global $dbConnection, $client_id;
$max_tag_id = getMax();
$json = file_get_contents('https://api.instagram.com/v1/tags/hahanotfunny/media/recent?client_id='. $client_id .'&max_tag_id='. $max_tag_id) ;
$data = json_decode($json);
$next_max = $data->pagination->next_max_tag_id;
foreach ($data->data as $insta) {
echo '<br/><img src="'.$insta->images->low_resolution->url.'"/>';
}
foreach ($data as $object) {
if ( is_array( $object ) ) {
foreach ( $object as $media ) {
$url = $media->images->standard_resolution->url;
$m_id = $media->id;
$c_time = $media->created_time;
$user = $media->user->username;
$filter = $media->filter;
$comments = $media->comments->count;
$caption = $media->caption->text;
$link = $media->link;
$low_res=$media->images->low_resolution->url;
$thumb=$media->images->thumbnail->url;
$lat = $media->location->latitude;
$long = $media->location->longitude;
$loc_id = $media->location->id;
$data = array(
'media_id' => $m_id,
'min_id' => $next_min_id,
'url' => $url,
'c_time' => $c_time,
'user' => $user,
'filter' => $filter,
'comment_count' => $comments,
'caption' => $caption,
'link' => $link,
'low_res' => $low_res,
'thumb' => $thumb,
'lat' => $lat,
'long' => $long,
'loc_id' => $loc_id,
);
$selectTotals = $dbConnection->prepare("INSERT INTO instagram_mg (media_id, min_id, url, c_time, user, filter, comment_count, caption, link, low_res_link, thumb, latitude, longitude, loc_id) VALUES (:mediaid, :minid, :url, :ctime, :user, :filter, :commentcount, :caption, :link, :lowreslink, :thumb, :latitude, :longitude, :locid)");
$selectTotals->execute(array(':mediaid' => $data['media_id'], ':minid' => $data['min_id'], ':url' => $data['url'], ':ctime' => $data['c_time'], ':user' => $data['user'], ':filter' => $data['filter'], ':commentcount' => $data['comment_count'], ':caption' => $data['caption'], ':link' => $data['link'], ':lowreslink' => $data['low_res'], ':thumb' => $data['thumb'], ':latitude' => $data['lat'], ':longitude' => $data['long'], ':locid' => $data['loc_id']));
}
}
}
if (isset($next_max)) {
echo $next_max . "</br>";
updateMax($next_max);
fetchData();
} else {
//$current_time = time();
//updateMax($current_time); // i tried making the current time the "max_tag_id" but it wouldnt work.
}
} //fetchData()
fetchData();