링크 파싱 애드온을 더 이상 개발하지 않겠다고 했지만, (속닥속닥)

에디터 컴포넌트 만들다가 스트레스 받아서 기능을 하나 더 얹어 봤어요 흙흙

 

http://bit.ly/2wwjrGF

해시태그를 기준으로 이미지를 수집해서 뿌려줄 수도 있더라구요.

근데 얘는 실시간으로 이미지들이 계속 업데이트 되니까 참 다이나믹합니다 :)

 

관련 json data 도움은 @v!님의 팁에서 얻었구요. 감사합니다~

https://xetown.com/devtip/638385

 

덧. 애드온 0.4 기준 바뀐 부분

function getInstagram(i) {
    var url_match = urls[i].replace('//', '/').split('/');
    if(url_match[2] == 'p') {
        // Instagram Post
        var ig_cnt = $('#'+prefix+cnt+i),
            ig_load = $('#'+prefix+load+i);
        $.ajax({
            url: 'https://api.instagram.com/oembed',
            data: {url : urls[i].replace(url_match[4], '')},
            dataType: 'jsonp',
            success: function(data) {
                ig_cnt.css({'border':'none'}).html(data.html).fadeIn('slow');
                ig_load.hide();
                if(ap_parser_link_text) {
                    var p = ig_cnt.parent('.'+container).prev('p');
                    if(p.text().indexOf(urls[i]) != -1) {
                        if(p.text() == urls[i]) p.remove();
                        else p.html(p.text().replace(urls[i], ''));
                    }
                }
            },
            error: function() {
                getPreview(i);
            }
        });
    } else if (url_match[2] == 'explore' && url_match[3] == 'tags') {
        // Instagram Tags
        getPreview(i);
        $.post('./addons/ap_parser/ap_parser.php', {tag : url_match[4]}, function(data) {
            var src = '';
            $.each(data, function(index, value) {
                if (index === 0) {
                    $('#'+prefix+cnt+i).find('.ap_parser_info').before('<div class="ap_parser_image_wrap">'+
                        '<a href="https://www.instagram.com/p/'+value.code+'" target="'+ap_parser_external_link+'">'+
                        '<div class="ap_parser_images">'+
                        '<img src="'+value.thumbnail_src+'">'+
                    '</div></a></div>');
                } else {
                    src += '<a class="ap_parser_insta_link" href="https://www.instagram.com/p/'+value.code+'" target="'+ap_parser_external_link+'">'
                    src += '<img class="ap_parser_insta_thumb" src="'+value.thumbnail_src+'" style="width: 24%; margin: 0 .5%;" />';
                    src += '</a>';
                    if (index == 16) {
                        return false;
                    }
                }
            });
            $('#'+prefix+cnt+i+' .ap_parser_image_wrap, #'+prefix+cnt+i+' .ap_parser_info').wrapAll('<div />');
            $('#'+prefix+cnt+i).append('<div class="ap_parser_insta" style="padding: 10px 20px 20px" />').css('border-radius', 4);
            $('#'+prefix+cnt+i).children('.ap_parser_insta').html(src);
        });
    } else {
        // Instagram Profile
        getPreview(i);
        var regExp = /http(?:s)?:\/\/(?:www\.)?instagram\.com\/([a-zA-Z0-9_]+)/;
        var matches = urls[i].match(regExp);
        if(matches && $.inArray(matches[1], ['', 'about', 'developer', 'legal', 'explore']) == -1) {
            $.post('./addons/ap_parser/ap_parser.php', {user_id : url_match[2]}, function(data) {
                var src = '';
                $.each(data, function(index, value) {
                    src += '<a class="ap_parser_insta_link" href="https://www.instagram.com/p/'+value.code+'" target="'+ap_parser_external_link+'">'
                    src += '<img class="ap_parser_insta_thumb" src="'+value.thumbnail_src+'" style="width: 24%; margin: 0 .5%;" />';
                    src += '</a>';
                });
                $('#'+prefix+cnt+i+' .ap_parser_image_wrap, #'+prefix+cnt+i+' .ap_parser_info').wrapAll('<div />');
                $('#'+prefix+cnt+i).append('<div class="ap_parser_insta" style="padding: 10px 20px 20px" />').css('border-radius', 4);
                $('#'+prefix+cnt+i).children('.ap_parser_insta').html(src);
            });
        }
    }
}

 

$url = urldecode($_REQUEST['url']);
$img_len = (int)($_REQUEST['img_len']);
$user_id = urldecode($_REQUEST['user_id']);
$tag = urldecode($_REQUEST['tag']);

// Get and Return Instagram User Profile
if ($user_id)
{
    $profile_url = "https://www.instagram.com/$user_id/?__a=1";
    $response = getInstaProfile($profile_url);

    if ($response === false)
    {
        return;
    }
    $data = json_decode($response, true);
    if ($data === null)
    {
        return;
    }
    $media = $data['user']['media'];

    header('Content-type: application/json');
    echo json_encode($media['nodes']);
    exit;
}
else if ($tag)
{
    $profile_url = "https://www.instagram.com/explore/tags/$tag/?__a=1";
    $response = getInstaProfile($profile_url);

    if ($response === false)
    {
        return;
    }
    $data = json_decode($response, true);
    if ($data === null)
    {
        return;
    }
    $media = $data['tag']['media'];

    header('Content-type: application/json');
    echo json_encode($media['nodes']);
    exit;
}

 

TAG •

윤삼

profile
아무래도 중급 초반 수준의 코딩 오타쿠인 것 같습니다.
  • profile

    스트레스를 개발로 푸는거~ 아주 칭찬해~~

    스트레스가 함께 하기를 2.png

    스트레스의 가호가 윤삼님과 함께 하기를~ ㅋㅋㅋ

     

    해시태그(나 프로필)은 업데이트되는대로 반영이 되는건가영? +ㅁ+

  • profile profile
    네, 출력할 때마다 매번 새롭게 가져오게 됩니다.

    소셜미디어들은 나중에 위젯페이지를 만든다든가 하면 재밌을 거 같은데... api 제공이나 데이터 제공 정책이 수시로 바뀌니까 수명이 짧은 게 함정..
  • profile
    우왓!! 첫댓글에 공감하는 바입니다. ㅋㅋㅋ 업데이트 파일 언제 올라오나요!!! ㅋㅋㅋㅋㅋ
  • profile profile
    글쎄요. 뭔가 획기적인 변화가 있으면 모를까, 업데이트 제공은 아직;;;
  • profile profile
    일단 해당 부분 소스 올렸으니 애드온 사용 중이시라면 확인해보세요
  • profile profile
    댓글 이제 봤습니다 감사합니당!!!!!!!
  • profile
    인스타에서 관련 이미지나 내용 실시간으로 불러오기 아주 좋겠는데요..
    어디선가 인스타그램 파싱해서 보여주는 애드온 본 거 같기도 하고..

    뭐 할 말이 없네요..
    스트레스를 코딩으로 푸신다니 ^^;;

    평안한 주말 되시길 ~
  • profile profile
    기존에 있던 소스 복붙 수준이어서 코딩이라 할 만한 게 없었거든요. 대신 단번에 성취감을 느끼니까 스트레스 해소..

    주말이니까 스트레스 해소ㅋㅋ
  • profile profile
    인스타 해시태그를 이미지 게시판형식으로 뿌려주는거 있으면 대박날거같네요
  • profile profile
    그런 거라면 이미 있어요. 람보님이 만드신 인스타그램 모듈.
    https://xetown.com/rxe_market/323416
  • profile
    계획하셨던 것이나 혹은 계획에 없던 기능이라도 추가가 된 것이 포팅된 모듈에 포함되어 오픈소스로 공개되면 많은 분들이 더 좋은 기능 많이 사용할 수 있을 것 같습니다.

    https://github.com/bjrambo/parserlink/issues/6
  • profile profile
    수정 부분 첨가했습니다.
    나중에 람보님이 보시겠죠? ㅎㅎ
  • profile profile

    람보님의 모듈의 파일을 이렇게 수정해 보았습니다.

    ap_parser.js

    function getInstagram(i) {
    var url_match = urls[i].replace('//', '/').split('/');
    if (url_match[2] == 'p') {
    // Instagram Post
    var ig_cnt = $('#' + prefix + cnt + i),
    ig_load = $('#' + prefix + load + i);
    $.ajax({
    url: 'https://api.instagram.com/oembed',
    data: {url: urls[i].replace(url_match[4], '')},
    dataType: 'jsonp',
    success: function (data) {
    ig_cnt.css({'border': 'none'}).html(data.html).fadeIn('slow');
    ig_load.hide();
    if (ap_parser_link_text == 'delete') {
    var p = ig_cnt.parent('.' + container).prev('p');
    if (p.text().indexOf(urls[i]) != -1) {
    if (p.text() == urls[i]) p.remove();
    else p.html(p.text().replace(urls[i], ''));
    }
    }
    },
    error: function () {
    getPreview(i);
    }
    });
    } else if (url_match[2] == 'explore' && url_match[3] == 'tags') {
    // Instagram Tags
    getPreview(i);
    $.exec_json('parserlink.getInstagram', {'tag' : url_match[4]}, function(obj) {
    var src = '';
    $.each(obj.data, function(index, value) {
    if (index === 0) {
    $('#'+prefix+cnt+i).find('.ap_parser_info').before('<div class="ap_parser_image_wrap">'+
    '<a href="https://www.instagram.com/p/'+value.code+'">'+
    '<div class="ap_parser_images">'+
    '<img src="'+value.thumbnail_src+'">'+
    '</div></a></div>');
    } else {
    src += '<a class="ap_parser_insta_link" href="https://www.instagram.com/p/'+value.code+'">'
    src += '<img class="ap_parser_insta_thumb" src="'+value.thumbnail_src+'" style="width: 24%; margin: 0 .5%;" />';
    src += '</a>';
    if (index == 16) {
    return false;
    }
    }
    });
    $('#'+prefix+cnt+i+' .ap_parser_image_wrap, #'+prefix+cnt+i+' .ap_parser_info').wrapAll('<div />');
    $('#'+prefix+cnt+i).append('<div class="ap_parser_insta" style="padding: 10px 20px 20px" />').css('border-radius', 4);
    $('#'+prefix+cnt+i).children('.ap_parser_insta').html(src);
    });
    } else {
    // Instagram Profile
    getPreview(i);
    var regExp = /http(?:s)?:\/\/(?:www\.)?instagram\.com\/([a-zA-Z0-9_]+)/;
    var matches = urls[i].match(regExp);
    if (matches && $.inArray(matches[1], ['', 'about', 'developer', 'legal', 'explore']) == -1) {
    $.exec_json('parserlink.getInstagram', {'username': url_match[2]}, function (obj) {
    var src = '';
    $.each(obj.data, function (index, value) {
    src += '<a class="ap_parser_insta_link" href="https://www.instagram.com/p/' + value.code + '">'
    src += '<img class="ap_parser_insta_thumb" src="' + value.thumbnail_src + '" style="width: 24%; margin: 0 .5%;" />';
    src += '</a>';
    });
    $('#' + prefix + cnt + i + ' .ap_parser_image_wrap, #' + prefix + cnt + i + ' .ap_parser_info').wrapAll('<div />');
    $('#' + prefix + cnt + i).append('<div class="ap_parser_insta" style="padding: 10px 20px 20px" />').css('border-radius', 4);
    $('#' + prefix + cnt + i).children('.ap_parser_insta').html(src);
    });
    }
    }
    }







    parserlink.model.php



    function getInstagram()
    {
    $username = Context::get('username');
    $tag = Context::get('tag');
    if ($username)
    {
    if(!$username)
    {
    return false;
    }

    $url = "https://www.instagram.com/$username/?__a=1";
    $response = FileHandler::getRemoteResource($url);

    $data = json_decode($response, true);
    $media = $data['user']['media']['nodes'];
    $this->add('data', $media);
    }
    else if ($tag)
    {
    if(!$tag)
    {
    return false;
    }
    $url = "https://www.instagram.com/explore/tags/$tag/?__a=1";
    $response = FileHandler::getRemoteResource($url);

    $data = json_decode($response, true);
    $media = $data['tag']['media']['nodes'];
    $this->add('data', $media);
    }

    }

  • profile
    인스타그램 태그를 적용해보면서 발견된 문제가 한가지 있네요.

    https://www.instagram.com/explore/tags/태연/

    이렇게 한글로 들어간 경우 작동이 안되는 약간의 애로점이 발견되었어요.
  • profile profile
    아, 한글...
  • profile profile

    아이고, 제가 테스트하는 환경에선 작동이 전부 돼버려서 문제 상황을 재연해볼 수가 없네요ㅠ

    혹시 모르니 ap_parser.js 38행을

    urls.push(decodeURIComponent(matches[n]));

    으로 바꿔보시겠어요?

  • profile profile
    제가 애드온을 사용하지 않아 생긴 문제 일 수 있겠네요. 모듈쪽으로 문의해 볼께요.
  • profile profile
    $tag = urlencode(Context::get('tag'));

    이렇게 처리하면 /태연/ 한글로 입력된 링크는 이제 제대로 되는데
    반대로 /%ED%83%9C%EC%97%B0/ 이렇게된 링크는 동작이 안되네요 ㅋ

    람보님이 여행 마치고 돌아오시면 해결해 주시겠죠 ㅋ
  • profile profile

    9박10일이라던데요ㅋㅋㅋㅋ

     

    암튼 $tag만 이스케이프 한다고 될 건 아닌 거 같고 post 방식으로 주소 전송을 하든, js에서 주소 모을 때 한꺼번에 이스케이프를 한다든지 해야 하지 않나 싶어요;;

  • profile profile
    일단 인스타그램 태그에서 한글이 들어갈 곳이 저곳이라 저기에 한글이 들어가면 동작을 안하고 해서 위 댓글의 내용 처럼 했더니 한글이 들어가야만 이제 동작하는 반대 상황이 되었네요

    한글일때만 urlencode를 하게 하는게 맞는건지..

    일단 태그만 저렇게 하면 되긴 합니다 ㅋ 반대 상황이 다시 안되서 문제죠 ㅋ
  • profile profile
    ?_filter=search&act=&vid=&mid=diary&category=&search_keyword=한글&search_target=nick_name

    이런 주소로 테스트해 보면 파싱은 잘 되는 것으로 보아..


    jason ??? 관련해서.... 한글 관련 처리가 필요한 것 아닌가 추측이 됩니다.
    프로그램을 모르는 사람이다보니 해결하지는 못하겠네요.
    인스타그램 embed 와 같은 것에서 한글이 들어간 것으로 파싱할때 처리가 필요해 보여요~
  • profile profile
    혹시
    $tag = urldecode(urlencode(Context::get('tag')));
    도 해보셨나요?
    직접 작업하면서 확인을 할 수가 없으니 답답하네요;;
    (람보님은 지금쯤 야시장에 계실까...)
  • profile profile
    그렇게 하면 다시 /태연/ 요것만 안됩니다 ㅋ
    뭐 급한건 아니니 적용할 만한 것 알게 될때 하나씩 해보면 되죠 머....
  • profile profile
    방금 해결했습니다!
    $tag = urldecode(Context::get('tag'));
    $tag = urlencode($tag);

    디코드를 먼저해서 처리 된 것을 문제 없게 만든 후 엔코드 하니 두개 유형의 url 모두 잘 되네요!
  • profile profile
    반대였군요ㅠㅠ
    $tag = urldecode(urlencode(Context::get('tag'))); ㅋㅋㅋㅋ
  • profile
    어... 그런데 왜 저희 사이트는 인스타그램 목록의 글을 클릭하면 해당 페이지로 새창이 열리지 않을까요??
    마우스오버하면 각 게시글별 링크주소가 나타나는거 같은데요..

    https://pomelove.com/xe/request/1653348
  • profile

    photoswipe 애드온과 함께 사용하면 나타나는 문제이고
    그리고 추가적인 이상한점은 저희 사이트는 새창으로 열리지 않고 현재창에서 인스타그램 게시물이 열려버리네요..

    2가지 문제를 또 해결해 봐야겠습니다. .끙....

     

    새창문제 -> js에 target="_blank" 를 추가하니 해결되네요.

    photoswipe 애드온 문제 --> 라이믹스 최신버전으로 다시 업데이트 하니 이상없네요.

  • profile profile

    인스타그램에는 스킨에 없는 a 태그를 따로 부여하다보니 클릭 이벤트가 대상을 감지하지 못하는 것 같네요.

    target="_blank" 보다는

    target="'+ap_parser_external_link+'" 라고 해주시면 외부링크 연결 방식 옵션에 따라 좀 더 탄력적으로 적용이 될 겁니다. (모두 세 군데일 거예요)

    강아지들 한 데 모아놓고 보니 치명적으로 귀엽네요ㅎㅎ 

  • profile profile
    포메라니안 아이들이 좀 많이 귀엽죠 ㅋㅋ 뭐 일단 저희는 외부링크는 무조건 새창으로 열기 원해서 이렇게 해도 되는데요. @람보님께서 업데이트 하실때는 아마 말씀하신 대로 하실 듯 합니다. 이슈는 등록해 놓았어요~
  • profile profile
    네, 저도 여기 본문에 있는 js 수정본 소스코드에 적어넣었습니다!
  • profile profile
    ㅎㅎ감시합니다.
  • profile profile
    해외에서까지 감시하시면 안됩니다. 여행과 관광을 하세요 ㅋ
  • profile profile
    왜호출을 하눈겁니깤ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 퓨퓨퓨ㅠㅠㅠㅠㅠ
  • profile
    윤삼님 혹시 위에 서버에 요청중입니다와 관련한 코드는 어떤것인가용?
  • profile profile

    아, 위 수정문에는 없구요;;

    getPreview 함수에서 ajax success 쪽에 있어요.

    $('.wfsr').hide();

  • profile profile
    해당 코드가 인스타 불러올때에 거치게 되나요?
  • profile profile
    네, 인스타 '유저 페이지'랑 '해시태그 페이지'는 그렇게 돼 있어요.
    무슨 문제라도..?
  • profile profile
    아 원인이 아에 내부 함수 거치면서 생긴 문제 같아요
    방금 패치했어요 ! ㅎ
  • profile profile
    헐, 대만에서;;; 감사합니다~!
  • profile profile
    패치를 해주시니까 이제 이슈는 10일 후에 등록하는거로요 ㅋㅋㅋ
  • profile profile
    제가 괜히 문제를 만들어서 그래요ㅋ
    잠자코 있어야겠어요ㅎㅎㅎ