cksgrapes
11/13/2019 - 6:33 AM

Facebook Graph APIでInstagramのフィードを取得して出力

<?php

/**
 * curlでapiを取得
 * @param $url
 * @return bool|string
 */
function file_get_contents_curl($url)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    $html = curl_exec($ch);
    curl_close($ch);
    return $html;
}

/**
 * 階層をもつfile_put_contents
 * @param $dir
 * @param $contents
 */
function file_force_contents($dir, $contents){
    $parts = explode('/', $dir);
    $file = array_pop($parts);
    $dir = '';
    foreach($parts as $part)
        if(!is_dir($dir .= "/$part")) mkdir($dir);
    file_put_contents("$dir/$file", $contents, LOCK_EX);
}

/**
 * apiのキャッシュ
 * @param        $url
 * @param string $cache_dir
 * @param int    $life_time
 * @return bool|false|string|null
 */
function get_cache_contents($url, $cache_dir = './cache', $life_time = 86400)
{
    $api = null;

    if (file_exists($cache_dir) && filemtime($cache_dir) + $life_time > time()) {
        $api = file_get_contents($cache_dir);
    } else {
        $api = file_get_contents_curl($url);
        file_force_contents($cache_dir, $api);
    }

    return $api;
}

/**
 * Facebook Graph APIの取得
 * @param $opt
 * @return mixed
 */
function get_facebook_graph_api($opt) {
    $url = "https://graph.facebook.com/v5.0/{$opt['business_id']}?fields=name%2Cmedia.limit({$opt['limit']})%7Bcaption%2Clike_count%2Cmedia_url%2Cpermalink%2Ctimestamp%2Cusername%7D&access_token={$opt['access_token']}";
    $src = get_cache_contents($url);
    $api_array = json_decode($src, true);
    return $api_array['media']['data'];
}

/*
======↑ここまで汎用↑======
======↓ここからサイトごとに変更必要↓======
*/

/**
 * Instagram Feedの取得
 * @param $opt
 * @return string|null
 */
function get_instagram_feed_src($id) {
    $opt = [
        "business_id"  => $id,
        "limit"        => 9,
        "access_token" => "access_token_wo_iretene"
    ];
    $items = get_facebook_graph_api($opt);
    $src = null;

    foreach ($items as $item) {
        $format = '<div><a href="%s" target="_blank"><img src="%s" alt=""></a></div>';
        $src .= sprintf($format, $item['permalink'], $item['media_url']);
    }

    return $src;
}