Dev Blog

스크립트 & 소스코드 공유

실무에서 유용하게 쓰는 스크립트와 코드 조각을 블로그 게시판으로 저장하고 공유합니다.

PHP 해시태그로 인스타그램 데이터 불러오기 (PHP 파싱)

페이지 정보

조회 209회 작성일 20-04-29 09:42
PHP의 cURL과 인스타그램 태그 URL을 이용해 해시태그별 게시물 데이터(본문, 썸네일, 좋아요 수 등)를 가져와 JSON 파일로 저장하고, 그누보드 게시판에서 이를 호출해 화면에 출력하는 전체 소스를 정리했다. 크론 작업으로 1시간마다 데이터를 갱신하는 구조와 여러 게시글의 태그를 관리하는 함수를 포함한다.
function _curl($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$contents = curl_exec($ch);
curl_close($ch);
return $contents;

}
function scrape_insta_hash($tags = array(),$debug = false) {
$insta_array = array();
$output = array();
$output["update_date"] = date("Y-m-d H:i:s");
$index = 0;
foreach($tags as $tag){
$url = 'https://www.instagram.com/explore/tags/'.$tag.'/?__a=1';
$insta_source = _curl($url); // instagrame tag url
$limit = 60; // 가져 올 개수
$results_array = json_decode($insta_source, TRUE);

if($debug == true){
return $results_array;
}
for ($i=0; $i < $limit; $i++) {
$latest_array = $results_array['graphql']['hashtag']['edge_hashtag_to_media']['edges'][$i]['node'];
$text=$latest_array["edge_media_to_caption"]["edges"][0]["node"]["text"];
$shortcode=$latest_array['shortcode'];
$thumbnail_src=$latest_array['thumbnail_src'];
$taken_at_timestamp = $latest_array["taken_at_timestamp"];
$edge_media_preview_like = $latest_array["edge_media_preview_like"];
if($thumbnail_src){
$output[$index]["text"] = $text;
$output[$index]["shortcode"] = $shortcode;
$output[$index]["thumbnail_src"] = $thumbnail_src;
$output[$index]["taken_at_timestamp"] = $taken_at_timestamp;
$output[$index]["edge_media_preview_like"] = $edge_media_preview_like;
$index++;
}
}
}
if($index == 0){
return false;
}
return $output;
}

function get_insta_data($wr_id){
if($wr_id){
$output = array();
$insta_json_data = (array)json_decode(_curl("http://".$_SERVER["HTTP_HOST"].'/data/insta/insta_list.'.$wr_id.'.json'));
unset($insta_json_data["update_date"]);
foreach($insta_json_data as $k => $v){
$output[$v->taken_at_timestamp] = (array)$v;
}
krsort($output,SORT_ASC);
return $output;
}
}

function set_insta_data($tags = array(),$file_name,$mode = ""){
global $g5;
$insta_json_data = json_decode(_curl("http://".$_SERVER["HTTP_HOST"].'/data/insta/'.$file_name));
if($mode == "write"){
$insta_json_data = "";
}
$check_date = date("Y-m-d H:i:s",strtotime($insta_json_data->update_date." +1 hours"));
if($check_date < date("Y-m-d H:i:s") || $insta_json_data == ""){
//update
$output = scrape_insta_hash($tags);
if($output != false){
$outputJson = json_encode($output);
file_put_contents($_SERVER["DOCUMENT_ROOT"].'/data/insta/'.$file_name, $outputJson);
}
}
}
function get_sql_set($arr = array()){
$sql_set = "";
foreach($arr as $k => $v){
$sql_set .= " `".$k."` = '".$v."'";
if($index != count($arr)-1){
$sql_set .= ",";
}
$index++;
}
return $sql_set;
}

if(!function_exists('exe_query'))
{
function exe_query($query,$fetchType = 'default'){
if(function_exists('mysqli_query') && G5_MYSQLI_USE) {
$query = preg_replace('/\/\*.*?\*\/(\r\n|\n|\r)?/s', '', $query);
$query = trim($query);
$result = sql_query($query);
$output = array();
$i = 0;
while($row = $fetchType == 'default' || $fetchType == '' ? @mysqli_fetch_assoc($result) : $fetchType($result)){
foreach($row as $key=>$value){
$output[$i][$key] = $value;
}
$i++;
}
}
return $output;
}
}
function update_insta_data($wr_id){
global $g5;
if($wr_id > 0){
$result = exe_query("select * from ".$g5['write_prefix']."m11 where wr_id = '".$wr_id."'");
$tag_list = array();
foreach($result as $row){
$tags=$row["wr_3"];
if($tags){
$tag_arr = explode("#",$tags);
foreach($tag_arr as $tag){
$tag_list[$row["wr_id"]][] = $tag;
}
}
}
foreach($tag_list as $tag_wr_id => $tag_val){
set_insta_data($tag_val,"insta_list.".$tag_wr_id.".json","write");
}
}
}
function crontab_update_insta_data(){
global $g5;
$result = exe_query("select * from ".$g5['write_prefix']."m11");
$tag_list = array();
foreach($result as $row){
$tags=$row["wr_3"];
if($tags){
$tag_arr = explode("#",$tags);
foreach($tag_arr as $tag){
$tag_list[$row["wr_id"]][] = $tag;
}
}
}
foreach($tag_list as $tag_wr_id => $tag_val){
set_insta_data($tag_val,"insta_list.".$tag_wr_id.".json");
}
}

인스타그램 데이타를 호출하는 부분

<div class="mright">
<img src="/img/t_insta.jpg"> <span style="float: right;"><?=$write[wr_3] ?></span>
<?php $insta_data= get_insta_data($wr_id); ?>
<div class="insta_data" >
<? $index = 1; ?>
<ul>
<? foreach($insta_data as $row){ if($index > 15) break; ?>
<? if($row["thumbnail_src"]){ ?>
<li class="hoverEffect">
<a href="https://www.instagram.com/p/<?=$row["shortcode"] ?>" target="_blank">
<img class="card-img-top" src="<?=$row["thumbnail_src"] ?>" class="">
<p class="txt"><i class="fa fa-heart-o" aria-hidden="true"></i> <?=$row["edge_media_preview_like"]->count ?></p>
</a>
</li>
<? $index++;} ?>
<? } ?>
</ul>
</div>
</div>


Let's create something great together.

프로젝트 문의 및 견적 요청은 언제든 환영합니다.