====== Facebook API 포스팅 가져오기 #4 PHP로 최신현황 받아오기 ====== {{tag>blogs 페이스북API Facebook API 자동화 PHP}} {{section>blog:facebook_api_get_posting_1_api#intro &noindent&nolink&nouser&noeditbtn&nocomments¬ags&nodate}} 매일 페이스북에 포스팅을 하고 있기 때문에, wiki 페이지 내에 Archiving 된 내용은 최신 현황이 아닐 가능성이 높다. [[blog:facebook_api_get_posting_3_image_ftp_write#다음|이전편#다음]] 에서 밝혔듯, 윈도의 '작업스케쥴러' 등을 이용해 Near Time으로 받아올 수 있지만, 그래도 Archiving 페이지 내에서 최신 글이 몇개가 더 있다는 정보는 보여줄 필요가 있었다. 현재 이용하는 웹호스팅에서 PHP를 지원하기 때문에, PHP를 통해서 페이스북 페이지 정보를 얻어와 항상 최신 현황을 볼 수 있는 스크립트를 만들어 보았다. PHP는 아주 예전에만 써봤기 때문에 문법 등이 익숙하지 않아 많은 검색을 통해서 작성했다. 아래 그림 부분이 결과물이다. {{blog:pasted:20200220-194409.png?400|}} ===== API 호출 ===== * 본래 PHP에서 API를 호출할 때는 ''file_get_contents ( 'http://example.com');'' 를 사용하면 간편하다. 하지만 저가 웹호스팅의 경우 서버 설정 상에서 ''allow_url_fopen''을 ''off''로 설정해 놓는 경우가 많기 때문에 file_get_contents 함수를 사용하면 에러가 발생한다. * 해결법을 구글링을 통해 위와 같이 cURL 라이브러리를 사용하여 API 응답 값을 받아오는 함수를 사용하였다. (출처 : https://cnpnote.tistory.com/entry/PHP-ini-filegetcontents-%EC%99%B8%EB%B6%80-URL) * 참고 cURL : https://hiseon.me/php/php-curl-example/ ===== 최신Archiving 날짜를 받아서 날짜 객체로 만들기 ===== $base_date = $_GET['date']; date_default_timezone_set('UTC'); $base_date = strtotime($base_date); * date라는 변수를 GET형식으로 받아서 strtotime 함수를 사용해서 날짜 객체로 변환하였다. * 2편에서 밝혔듯이 Facebook API에서 응답하는 날짜들은 모두 UTC 기준이다. * 이 날짜와 비교해서 이 날짜보다 이후에 작성된 포스팅들의 개수를 셀 것이다. ===== json 처리 ===== $obj = json_decode(get_content($url)); $count_list = count($obj->data); for ($i=0;$i<$count_list;$i++) { $time = $obj->data[$i]->created_time; $time = strtotime($time); if ($i==0 ) $newest_time = $time; if ( $time > $base_date ){ //echo '
newer : '. $i . ' : '. date("Y-m-d h:i:s A",$time); } else { break; } }
* 앞서 만든 get_content를 통해 얻어온 응답값은 ''json_decode'' 함수를 통해서 json 형식을 사용할 수 있다. * 사용법은 ''$obj->'key값''', ''$obj->'key값'[리스트index]'' 로 사용할 수 있다. * data 키 내에 있는 리스트 element(포스팅 하나)들을 하나씩 훑으면서 base_date(최신 Archiving) 보다 나중에 작성된 글들을 하나씩 세었다. * $count_list 가 Archivng된 이후에 작성된 글들의 개수이다. ===== 결과 출력하기 ===== if ($i >= $count_list) { $str = "+"; } else { $str = ""; } $style = $_GET['style']; $front = $_GET['front']; $mid = $_GET['mid']; $end = $_GET['end']; $format = $_GET['format']; //Y-m-d h:i:s A date_default_timezone_set('Asia/Seoul'); echo "". $front . date($format,$newest_time) . $mid . $i . $str . $end .""; * Line 1-5: 속도 문제 때문에 한번에 50개만 호출하고, 그 이상 새글이 있으면 '+'를 붙여주어서 50개 이상이 있다는 것을 표시하도록 했다. * 아래와 같은 변수들을 GET형식으로 받아서 출력 형식을 지정하도록 했다. * style : 출력할 결과물의 CSS 스타일 * front, mid, end : ''$front [최신글날짜] $mid [최신글 개수] $end'' 형식으로 출력시 설명할 수 있는 문장을 받도록 했다. * $format : 최신글 날짜를 어떻게 표시할 것인지 format을 설정 ===== 사용 ===== 간단한 몇 줄의 코드로 최신 현황을 받아오는 기능을 만들었다. 이를 wiki 페이지에서 보이도록 하기 위해서
===== 추후 작업해야 할 것 ===== 첫번째 목적인 Archiving을 위한 작업은 끝났다. 추후에는 - 권한 문제를 해결하여 포스팅별 도달수, 공유수, 좋아요 수, 페이지 좋아요 수 등을 추출할 수 있도록 개선 - 해당 내용을 정리하여, 페이지 운영에 필요한 데이터 분석 및 insight 얻기 를 해보도록 해야 겠다. ==== 참고 ==== * PHP에서 날짜 처리 : https://nowonbun.tistory.com/633 * cURL 라이브러리 : https://cnpnote.tistory.com/entry/PHP-ini-filegetcontents-%EC%99%B8%EB%B6%80-URL * JSON 사용법 : https://niceman.tistory.com/149 ~~DISCUSSION~~