Dev Blog

스크립트 & 소스코드 공유

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

26건의 글

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

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>

그누보드 전체 회원 정보를 엑셀로 저장하는 PHP 소스

그누보드에서 전체 회원 정보를 엑셀 파일로 저장하는 PHP 소스다. _common.php 파일이 있는 경로(예: /adm/)에 파일을 만들고 소스를 붙여넣으면 되며, 관리자 모드로 접속해야 다운로드가 가능하다. 2019년 1월 15일 업데이트로 탈퇴한 회원은 목록에서 제외되도록 수정되었다.

  • '_common.php'파일 있는 경로(예. /adm/)에 파일하나 만들고 아래 소스 복붙하시면 됩니다.

(관리자모드에서 진입해야 다운로드 가능)

[update]

190115 : 탈퇴인원 제외

<?php
include_once("./_common.php");
include_once(G5_LIB_PATH.'/PHPExcel.php');

if (!$is_admin =="super")
alert_close("최고 관리자 영역 입니다.");

function column_char($i) { return chr( 65 + $i ); }

$headers = array('번호', 'ID', '이름', '닉네임', '레벨', '포인트', '가입일', 'Email', '홈페이지', '성별', '생일', '전화', '휴대폰', '메일링', '정보공개', '최근로그인', '주소');
$widths  = array(18, 15, 15, 15, 15, 15, 15, 50, 20, 20, 20, 20, 20, 20, 20, 20, 100);
$header_bgcolor = 'FFABCDEF';
$last_char = column_char(count($headers) - 1);

$sql    = " select * from g5_member where mb_leave_date = '' order by mb_datetime desc ";
$result = sql_query($sql);
for($i=1; $row=sql_fetch_array($result); $i++) {

if ($row['mb_sex'] =="M") { $mb_sex ="남자"; } else if ($row['mb_sex'] =="F"){ $mb_sex ="여자"; }
if ($row['mb_mailling'] =="1") { $mb_mailling ="받음"; } else if ($row['mb_mailling'] =="0"){ $mb_mailling ="안받음"; }
if ($row['mb_open'] =="1") { $mb_open  ="공개"; } else if ($row['mb_open'] =="0"){ $mb_open ="비공개"; }
$rows[] =
array(
$i,
$row[mb_id],
$row[mb_name],
$row[mb_nick],
$row[mb_level],
$row[mb_point],
$row[mb_datetime],
$row[mb_email],
$row[mb_homepage],
$mb_sex,
$row[mb_birth],
$row[mb_tel],
$row[mb_hp],
$mb_mailling,
$mb_open,
$row[mb_today_login],
print_address($row['mb_addr1'], $row['mb_addr2'], $row['mb_addr3'], $row['mb_zip1'])
);
}

$data = array_merge(array($headers), $rows);

$excel = new PHPExcel();
$excel->setActiveSheetIndex(0)->getStyle( "A1:${last_char}1" )->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setARGB($header_bgcolor);
$excel->setActiveSheetIndex(0)->getStyle( "A:$last_char" )->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER)->setWrapText(true);
foreach($widths as $i => $w) $excel->setActiveSheetIndex(0)->getColumnDimension( column_char($i) )->setWidth($w);
$excel->getActiveSheet()->fromArray($data,NULL,'A1');

header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"members-".date("ymd", time()).".xls\"");
header("Cache-Control: max-age=0");

$writer = PHPExcel_IOFactory::createWriter($excel, 'Excel5');
$writer->save('php://output');
?>

까페24 호스팅에서 PHP 에러 메시지 출력하기

까페24 호스팅에서 PHP 작업 시 에러 메시지가 화면에 표시되지 않아 디버깅이 어려운 문제의 해결책을 정리했다. .htaccess에 php_value error_reporting 22527과 php_flag display_errors on을 추가하고, 코드 상단에 ini_set("display_errors", 1)와 error_reporting(E_ALL ^ E_NOTICE)를 넣거나 set_error_handler 클래스를 활용하는 방법을 설명한다.

[문제점]

최근 까페24호스팅에서 php작업시

화면에 에러메세지가 나오지 않아 디버깅시에 매우 곤란함

[해결책]

.htaccess 내용에 아래추가.

=====================================

php_value error_reporting 22527

php_flag display_errors on

=====================================

  1. 인클루드 시키는 라이브러리 젤첨에

ini_set("display_errors", 1);

error_reporting(E_ALL ^ E_NOTICE);

추가

  1. 넷상에 공개된 set_error_handler 클래스 이용

주기적으로 PHP 파일 실행하기 (crontab으로 cron.php 돌리기)

리눅스 crontab을 이용해 PHP 파일을 주기적으로 실행하는 방법이다. crontab -e 명령으로 에디터를 연 뒤, 한 시간에 한 번씩 wget으로 http://도메인/cron.php를 호출하는 "0 * * * * wget -O - -q -t 1 URL" 한 줄을 추가하면 정해진 시간마다 PHP 코드가 자동으로 실행된다. cron.php에는 주기적으로 실행할 코드를 넣어두면 된다.

크론탭에 추가

# crontab -e

한시간에 한번씩 원하는 페이지를 실행시키는 코드

0 * * * * wget -O - -q -t 1 [http://domain.com/cron.php](http://domain.com/cron.php)

위와같이 한 줄을 추가하게되면
순서대로 0분 매시간 매일 매월 매요일 이 될 때마다 (다시말해 1시간에 1번) php코드를 실행시키게 된다.
cron.php에는 1시간에 1회 실행될 코드를 넣어두면 된다.

PHP에서 파일 확장자 추출하는 5가지 방법

PHP에서 파일명으로부터 확장자를 얻는 5가지 방법을 예제와 함께 비교 정리했다. strrchr 함수로 마지막 점 이후를 잘라내는 방법, strrpos와 substr 조합, explode와 end 조합, preg_replace 정규식, pathinfo 함수를 각각 사용하는 코드를 소개하고, 상황에 맞는 방법을 선택해 활용할 수 있다.

$filename = "mypage.asp";
//1 使用strrchr函数求得
$ext = substr(strrchr($filename, '.'), 1);
echo$ext;

//2 使用strrpos和substr
$ext = substr($filename, strrpos($filename, '.') + 1);
echo$ext;

//3 使用expload 和 end
$ext = end(explode('.', $filename));
echo$ext;

//4 使用 preg_replace 带正则表达式
$ext = preg_replace('/^.*\.([^.]+)$/D', '$1', $filename);
echo$ext;

//5 使用pathinfo
$fileinfo = pathinfo($filename);
$ext = $fileinfo['extension'];
echo$ext;


Let's create something great together.

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