Develop/PHP, HTML

[php] URL 링크를 입력하고 사이트 썸네일 가져오기 ( og image )

레다솔 2023. 7. 11. 13:30
728x90
반응형

https://hajoung56.tistory.com/38

 

[HTML&JSP] SNS에서 URL 공유시 미리보기meta 태그

링크를 SNS를 통하여 URL을 공유할 때 링크 상단에 썸네일, 타이틀, 설명 등 다양한 정보가 노출됩니다. 어떠한 정보들이 노출되며, 어떻게 설정을 할 수 있는지 확인해보고자 합니다. ​ 아래와

hajoung56.tistory.com

https://stackoverflow.com/questions/44595876/cant-get-ogimage-php

 

can't get og:image php

I'm using this script to get the og:image tag from a website: function getFrontImage($url){ $page_content = file_get_contents($url); $dom_obj = new DOMDocument(); $dom_obj->loadHTML($

stackoverflow.com

이 포스트들을 참조했습니다.

 

 

보통 웹사이트 head의 meta 태그 안에 og라고 오픈그래프가 있다.

사이트의 각 종 정보를 저장해두는 태그인데 어떠한 HTML 문서의 메타 정보를 쉽게 표시하기 위해서 메타정보에 해당하는 제목, 설명, 타입, 대표 URL 등 다양한 요소들에 대하여 사람들이 통일하여 사용할 수 있도록 정의한 프로토콜이라고 한다.

 

 

메타 태그에서 og 정보를 긁어오는 php 코드는 스택오버플로우에서 가져와 조금 수정했다. 이미지를 대체하는 대체 텍스트로는 사이트 이름을 가져오기 위해 og:title를 추가하고 이 함수를 부를 때 string 변수로 타입을 지정해서 원하는 메타 데이터만 가져오도록 했다.

 

function getMetaOG($url, $get_type){
            libxml_use_internal_errors(true);

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL,$url);
            curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0');
            curl_setopt($ch, CURLOPT_ENCODING , "gzip");
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_HEADER, 0);


            $page_content = curl_exec($ch); 

            $dom_obj = new DOMDocument();
            $dom_obj->loadHTML($page_content);
            $meta_val = null;

            foreach($dom_obj->getElementsByTagName('meta') as $meta) {

                if(($meta->getAttribute('property')=='og:image') && $get_type == 'image'){ 

                    $meta_val = $meta->getAttribute('content');

                }
                else if(($meta->getAttribute('property')=='og:title') && $get_type == 'title'){ 

                    $meta_val = $meta->getAttribute('content');

                }
            }

            return $meta_val;
        }

 

필자는 HTML의 script 태그를 사용하여 php 코드를 감쌌다.

<script>
        <?
        	// php code...
        ?>
</script>

 

그리고 DB에 저장된 값이든 스크립트 내에서 주소를 저장한 값을 찾는다.

<?
if ($view != '')
{  
	$getview = null; 
	if(strpos($view, 'https') == false)
	{
            
           // 작성자가 만약 관련링크에 https를 넣지 않았다면 앞에 붙임
            $getview = 'https://'.$view;
            
	}
	else
	{
    	    $getview = $view;
	}
}
?>

테스트를 해보니 https 가 아닌 http 로는 작동하지 않아서 https를 붙였다.

* 입력된 주소에 http가 있다면 https로 변경하는 방식을 나중에 추가하겠다.

여기서 $view는 사용자가 입력한 URL 주소다.

 

이제 사이트의 og:image와 대체 텍스르로 쓸 og:title 을 받아오자

<? $getview = getMetaOG($getview, 'image');?>
<img src="<?=$getview?>" alt="<?=$getview = getMetaOG($getview, 'title');?>">

이렇게 하면 사이트의 이미지를 받아올 수 있다.

 

메타데이터가 어떻게 생겼는지 확인하려면 확인하려는 사이트에서 f12를 눌러 사이트의 html 코드를 보면된다.

<head> 구문 안에 메타 데이터가 있으며

다음의 경우에는 image 값이 사진의 확장자를 가지지 않지만 실제로 사용하면 잘 표현된다.

네이버의 image 값은 사진 확장자를 가지고 있다.

 

728x90
반응형