본문 바로가기
웹 개발 이야기/php

[PHP] 인스타그램 피드 가져오기 (Rapid API 이용)

by Gommin 2023. 3. 9.

// 기본적으로 무료이지만 데이터 조회 수가 많다면 유료 이용을 추천한다.

// 유료이용을 위해서는 developer dashboard 에서 카드등록이 먼저 되어있어야 가능하다.

// API를 이용하여 추출한 이미지 URL을 이용하여 이미지 노출 시 "NOT SAME ORIGIN" 에러 노출

// 이미지를 다운받은 후 불러와야 이미지 노출이 가능하다.

// https://rapidapi.com/restyler/api/instagram40

// 아래 zip 파일을 받은 후 압축을 풀면 sql 파일도 확인 가능합니다.

// 그누보드 기반으로 제작했다.

인스타그램 피드 가져오기.zip
0.00MB

// URL을 이용한 이미지 파일 다운 받기

<?php
function save_api_photo($init_name, $url, $dir) {
    $filename = '';

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_NOBODY, true);
    curl_exec ($ch);
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    //echo $http_code."<br><br>";

    if($http_code == 200) {
        $tmpname = $init_name;
        $filepath = "./data/file/instafeed/";

        // 파일 다운로드
        $path = $filepath.'/'.$tmpname;
        //echo $path."<br><br>";
        $fp = fopen ($path, 'w');

        $ch = curl_init();
        curl_setopt( $ch, CURLOPT_URL, $url );
        curl_setopt( $ch, CURLOPT_RETURNTRANSFER, false );
        curl_setopt( $ch, CURLOPT_BINARYTRANSFER, true );
        curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
        curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, 10 );
        curl_setopt( $ch, CURLOPT_FILE, $fp );
        curl_exec( $ch );
        curl_close( $ch );

        fclose( $fp );

        // 다운로드 파일이 이미지인지 체크
        // if(is_file($path)) {
        //     $size = @getimagesize($path);
        //     if($size[2] < 1 || $size[2] > 3) {
        //          @unlink($path);
        //          $filename = '';
        //     } else {
        //          $ext = array(1=>'gif', 2=>'jpg', 3=>'png');
        //          $filename = $tmpname.'.'.$ext[$size[2]];
        //          rename($path, $filepath.'/'.$filename);
        //     }
        // }
    }

    //return $filename;
}

$sql = "select f_datetime from g5_insta_feed order by idx limit 1 ";
$rowf = sql_fetch($sql);
//echo date("Ymd")-$rowf['f_datetime'];
if(date("Ymd")-$rowf['f_datetime']>14){
    // 2주마다 1번씩 업데이트 (매번 가져오는 것을 방지)
    $curl = curl_init();
    curl_setopt_array($curl, [
        CURLOPT_URL => "https://instagram40.p.rapidapi.com/account-feed?username=chir2005_",
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "GET",
        CURLOPT_HTTPHEADER => [
            "x-rapidapi-host: instagram40.p.rapidapi.com",
            "x-rapidapi-key: d2c5ef378amsh6648c6f70ef1c52p1a4975jsne9ec82a215aa",
        ],
    ]);
    $response = curl_exec($curl);
    $err = curl_error($curl);
    $result_feed = json_decode($response,true);
    curl_close($curl);
    if ($err) {
        //echo "cURL Error #:" . $err;
    }else{
        if(count($result_feed)>0) {
            $sql = sql_query("delete from g5_insta_feed ");
            for ($a2 = 0; $a2 < count($result_feed); $a2++) {
                //print_r($result_feed[$a2]['node']);
                //echo '<br><br>';
                $shortcode = $result_feed[$a2]['node']['shortcode'];
                $thumbnail_src = $result_feed[$a2]['node']['thumbnail_src'];
                $init_name = "instafeed".$a2.".jpg";
                $dirname = "../../data/file/instafeed/";
                $f_datetime = date("Ymd");

                // file_name 변수 실제 사용 안함
                $file_name = save_api_photo($init_name, $thumbnail_src, $dirname);

                $sql = sql_query("insert into g5_insta_feed set init_name='{$init_name}', dirname='{$dirname}', thumbnail_src='{$thumbnail_src}', shortcode='{$shortcode}', f_datetime='{$f_datetime}' ");
                //echo $init_name."<br><br>";
                //echo $thumbnail_src."<br><br>";
            }
        }
    }

}
?>

// DB에서 feed data 조회

$sql2 = "select * from g5_insta_feed order by idx desc";
$result2 = sql_query($sql2);
$cnt2 = sql_num_rows($result2);

댓글