2023. 11. 16. 09:41

사이트 스크린샷 잡기

외부에 관리하는 사이트들이 여러개 있다보니 사이트의 모양을 비주얼 상 저장해야 할 일들이 생겨서 외부 사이트에 접속하여 스크린샷을 저장하는 기능을 찾아보았습니다.

 

php에서 브라우저를 열어서 표시되는 화면을 잡는 기능은 있는거 같던데,

그런게 아니라 백그라운드에서 코드만으로 그런 작업을 하는 기능은 없더군요 ㅠㅠ

다행히 인터넷에 재미있는 아이디어로 스크린샷을 잡는 기능을 구현해 놓은 분이 계셔서 해당 소스코드를 참조하여 구현하였습니다.

원소스의 링크는 https://lrl.kr/bbs/board.php?bo_table=free&wr_id=44&sfl=mb_id%2C1&stx=admin 여기 입니다.

 

원리는 구글의 스피드 테스트 API 중 웹사이트의 스크린샷을 잡아주는 기능을 이용하는 것인데,

아무래도 대상 사이트의 스피드 테스트를 진행한 이후 응답이 오는 것이라 응답이 좀 느린것은 감수해야 할 것 같습니다.

 

원 글에서는 https://developers.google.com/speed/docs/insights/v5/get-started?hl=ko 이 사이트에 접속하여 API Key를 받고 해당Key를 이용하는 방식으로 구현하던데, 문서를 읽어보니 초당 3회 미만의 요청의 경우 별도의 API Key를 이용하지 않아도 된다고 하여 Key 없이 표시하니 잘 나왔습니다

 

어차피 API 호출이라 충분히 다른 언어에서도 적용 가능하기 때문에 아래 소스코드를 참고하여서 적절한 곳에 이용하면 될 듯 합니다. 참고로 이미지는 data:image/jpeg;base64 형식으로 문자열로 오기 때문에 이미지 파일로 저장하려면 별도의 작업을 거쳐야 합니다. HTML의 경우 img tag에 src로 지정하면 이미지가 정상적으로 표시됩니다.

 

/**
 * 구글의 page speed api를 이용하여 $url의 스크린샷을 base64로 인코딩 된 문자열 형태로 가져온다
 */
function getSiteScreen($url): string
{
    $screen = "";
    $encodedUrl = urlencode($url);
    $adress = "https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=$encodedUrl&category=CATEGORY_UNSPECIFIED&strategy=DESKTOP"; //&key=" . API_KEY;
    $ch = curl_init($adress);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 180); // set timeout to 180 seconds

    $response = curl_exec($ch);

    if ($response === false) {
        $error = curl_error($ch);
        curl_close($ch); // close curl resource to free up system resources
        throw new Exception("Curl Screen Get error: $error\n");
    }
    curl_close($ch);

    $googledata = json_decode($response, true);
    if ($googledata === null) {
        throw new Exception("JSON Screen parsing error: " . json_last_error_msg() . "\n");
    }

    // undefined index 방지
    if (isset($googledata["lighthouseResult"]["audits"]["final-screenshot"]["details"]["data"])) {
        $screen = $googledata["lighthouseResult"]["audits"]["final-screenshot"]["details"]["data"];
    } else {
        echo "스크린샷 데이터를 찾을 수 없음\n";
    }
    return $screen;
}

 

첨언 : 좀더 큰 사이즈의 스크린샷 이미지는

$googledata["lighthouseResult"]["fullPageScreenshot"]["screenshot"]["data"]

여기서 찾을 수 있습니다.

2023. 7. 10. 09:13

PHP에서 PDF 파일의 첫 페이지를 읽어 이미지로 저장하기

php의 imagick 라이브러리가 설치 되어 있어야 함

php의 imagick 라이브러리 설치 방법(windows xampp 기준)

(참고 URL : https://www.php.net/manual/en/imagick.installation.php )

1. https://windows.php.net/downloads/pecl/releases/imagick/ 사이트에서 버전에 맞는 dll 파일을 다운 받음

2. 다운 받은 압축파일의 php_imagick.dll 파일을 xampp\php\ext 폴더 안에 복사해 넣음

3. php.ini 파일에  extension=imagick 라인 추가

4. 1번에서 다운 받은 압축파일에 있는 IM_MOD_XXX.dll 파일과 CORE_RL_XXX.dll 파일을 xampp\apache\bin 경로에 넣어놓음

5. 아파치 재시작

6. phpinfo() 로 봤을 때 아래와 같은 내용이 나와야 함(특히 supported formats 중요!!)
7. 참고로 ghostscript windows버전이 설치가 되어 있고 path에 등록되어 있어야 함(내부적으로 사용하는 듯), path에 등록된 실행파일명을 gs.exe로 하여야 함!!! (이렇게 안하면 아래 함수가 동작하지 않음)

 

PHP로 PDF 파일을 읽어 첫 페이지를 jpeg로 만드는 함수

function saveFirstPDFPageAsImage($file_name)
{
	$img = new imagick();
    // 아래 설정은 readImage 이전에 설정해야 정상동작함
	$img->setResolution(180, 180);
	$img->setCompressionQuality(80);

    // PDF파일 경로가 안맞는 경우가 많으니 이 부분은 주의
    // 파일명 뒤에 [0] 을 붙이면 첫 페이지를 나타냄
	$img->readImage(realpath($file_name) . '[0]');

    // 확장자를 안 떼고 뒤에 .jpg만 붙여 넣음(편의를 위해서 이렇게 함)
    // 파일명이 test.pdf 인경우 결과 파일은 test.pdf.jpg임
	$img->setImageFormat('jpeg');
	$img->writeImage(realpath($file_name) . '.jpg');
	$img->destroy();
}

 

1. setResolution 과 setCompressionQuality는 적절히 조절(저 정도면 A4를 썸네일 이미지로 보여주는데 큰 문제는 없었음)

2. setImageFormat('png') 로 하면 png파일도 생성 가능, png로 생성하면 자동으로 배경이 투명화 처리 됨

3. 메모리 관리를 위해서 destory()를 호출하는 것을 잊으면 안됨

2023. 7. 6. 15:28

php를 이용한 간이 웹서버 만들기

php가 정상적으로 동작하고, path에 들어 있는 상태에서

아래와 같이 레지스트리를 등록하면,

탐색기에서 빈 공간에 마우스 오른쪽 버튼을 눌러 '웹서버만들기'를 누르면 해당 경로를 Root로 하는 웹서버가 만들어짐

 

포트번호는 localhost:8081 부분에서 8081를 수정하면 됨

 

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\Background\shell\웹서버만들기]

[HKEY_CLASSES_ROOT\Directory\Background\shell\웹서버만들기\command]
@="cmd.exe /c php.exe -S localhost:8081"

저 내용이 들어있는 reg파일도 같이 첨부함

웹서버만들기.reg
0.00MB

2023. 3. 10. 11:08

php 문자열 제거 각종 정규식

1. 정규식을 통한 제거

1
$text = preg_replace('/\r\n|\r|\n/','',$text);


2. 문자열 함수사용으로 제거

1
2
3
$text = str_replace(array("\r\n","\r","\n"),'',$text);
또는
$text = strtr($text,array("\r\n"=>'',"\r"=>'',"\n"=>''));

 

html 태그 제거

1
$content = preg_replace("(\<(/?[^\>]+)\>)", "", $content);

 

textarea 제거

1
2
$content = preg_replace("!<textarea(.*?)>!is","[textarea]",$content);
$content = preg_replace("!</textarea(.*?)>!is","[/textarea]",$content);


script 제거

1
$str=preg_replace("!<script(.*?)<\/script>!is","",$str);


iframe 제거

1
$str=preg_replace("!<iframe(.*?)<\/iframe>!is","",$str);


meta 제거

1
$str=preg_replace("!<meta(.*?)>!is","",$str);


style 태그 제거

1
$str=preg_replace("!<style(.*?)<\/style>!is","",$str);


&nbsp;를 공백으로 변환

1
$str=str_replace("&nbsp;"," ",$str);


연속된 공백 1개로

1
$str=preg_replace("/\s{2,}/"," ",$str);


태그안에 style= 속성 제거

1
2
$str=preg_replace("/ zzstyle=([^\"\']+) /"," ",$str); // style=border:0 따옴표가 없을때
$str=preg_replace("/ style=(\"|\')?([^\"\']+)(\"|\')?/","",$str); // style="border:0" 따옴표 있을때

 
태그안의 width=, height= 속성 제거

1
2
$str=preg_replace("/ width=(\"|\')?\d+(\"|\')?/","",$str);
$str=preg_replace("/ height=(\"|\')?\d+(\"|\')?/","",$str);


img 태그 추출 src 추출

1
2
preg_match("/<img[^>]*src=[\"']?([^>\"']+)[\"']?[^>]*>/i",$str,$result);
preg_match_all("/<img[^>]*src=[\"']?([^>\"']+)[\"']?[^>]*>/i",$str,$result);

 

특수문자 제거

1
$string = preg_replace("/[ #\&\+\-%@=\/\\\:;,\.'\"\^`~\_|\!\?\*$#<>()\[\]\{\}]/i", "", $string);


공백제거

1
2
$string = preg_replace('/ /', '', $string);
$string = preg_replace("/\s+/", "", $string);


반복 입력된 단어 제거

1
$string = preg_replace("/s(w+s)1/i", "$1", $string);


반복 입력된 부호 제거

1
$string = preg_replace("/.+/i", ".", $string);


영문자를 제외한 모든 문자 제거

1
$string = preg_replace("/[^A-Za-z]/", "", $string);


영문자와 공백문자(Space)를 제외한 모든 문자를 제거

1
$string = preg_replace("/[^A-Za-z|\x20]/", "", $string);


ASCII 범주 코드 영문+특수문자를 제외한 모든 문자를 제거

1
$string = preg_replace("/[^\x20-\x7e]/", "", $string);


img 태그 추출

1
2
preg_match_all("/<img[^>]*src=[\'\"]?([^>\'\"]+)[\'\"]?[^>]*>/", $img, $matchs);
print_r($matchs);


자주 쓰는 내용들이라 제가 두고두고 참고하려고 가져왔습니다

 

출처 : http://chongmoa.com/php/97908

 

C.m.A API 이야기(Mokulsha!)

1. 정규식을 통한 제거 $text = preg_replace('/||/','',$text); 2. 문자열 함수사용으로 제거 $text = str_replace(array("","",&quo..

chongmoa.com

 

2011. 4. 11. 14:27

쿠키/세션값이 저장되지 않을때(3사쿠키,P3P관련) 헤더 넣기

가끔 frame안쪽에서 구운 세션이나 쿠키가 안먹는 경우가 생김. 일반적으로 양쪽의 도메인이 다를때 그런일이 생기는데(보안때문임) 그럴때는 웹서버의 세팅에서 p3p관련 세팅을 잡아주던지(대부분 헤더 정보에 저 정보를 같이 보낼 수 있는 옵션이 있다) 아니면 주요 include page에 헤더 정보를 추가하면 됨.

요즘 반 강제적으로 쓰고 있는 php의 경우는 아래의 내용을 각 페이지에 넣어주면 정상동작함

 <?
header( 'P3P: CP=\"ALL IND DSP COR ADM CONo CUR CUSo IVAo IVDo PSA PSD TAI TELo OUR SAMo CNT COM INT NAV ONL PHY PRE PUR UNI\"');
?>