참고사항 나리야빌더를 사용했다
제목에는 sns 메타태그로 표현했는데 트위터는 트위터 전용 메타태그를 따로 사용해야 한다.
일단 그누보드 사이트 방문자가 방문할 때마다 메타태그를 사용자 클라우드에 넣어줘야겠다.
사이트 이용자가 많으면 데이터베이스를 많이 조회해 줘야 하기 때문에 비효율 적일 수도?
나는 이용자가 적었기 때문에 잘 돌아갔었다. 그래서 정리해 보았다.
일단 메타태그를 적을 폴더의 경로는
/var/www/html/theme/BS4-Basic/head.sub.php 이경로이다
여기안에 많은 코드들이 있는데 정신없어서 include로 바깥에 코드를 적었다.
<?php include '/var/www/html/theme/BS4-Basic/meta_tags.php'; ?>
이제 meta_tags.php 이파일을 써주자
첫번째 코드
이 코드는 그누보드에서 데이터베이스 연결 설정을 현재 스크립트에서 바로 사용할 수 있다.
include_once('./_common.php');
그누보드 기본 url을 사용하여 url을 불러온다. url을 이용하여 메타태그를 동적으로 설정했다.
https://example.com/test.php?bo_table=gallery&wr_id=123일 경우
$SERVER[‘REQUEST_URL’]은 test.php?bo_table=gallery&wr_id=123을 반환
parse-url로 분해 PHP_URL_QUERY 는 bo_table=gallery&wr_id=123이부분만 반환하도록함
parse_str(parse_url($_SERVER['REQUEST_URI'], PHP_URL_QUERY), $params);
값이 없다면 null로 설정해 줘야 누락되었을 경우 오류를 방지한다.
$bo_table = $params['bo_table'] ?? null;
$wr_id = $params['wr_id'] ?? null;
$baseURL에는 기본이 되는 url 저장
$urlParams는 $$baseURL 뒤에 추가할 파라미터 $wr_id, $botable 변수에서 가져와서
URL http_build_query() 쿼리 스트링의 형식으로 변환 후
http_build_query()는 URL에서 사용될 수 있는 안전한 형식으로 데이터를 인코딩
풀 url 을 만든다
$baseURL = 'https://www.example.com/bbs/board.php';
$urlParams = array('bo_table' => $bo_table, 'wr_id' => $wr_id);
$queryString = http_build_query($urlParams);
$fullURL = $baseURL . '?' . $queryString;
wr_table 이 부분에 들어갈 원하는 테이블을 넣는다.
https://www.example.com//bbs/board.php?bo_table=wr_table&wr_id=123
$allowedTables = [
'wr_table' => 'g5_write_wr_table',
];
$bo_table이 이버있지 않고 $allowedTables 배열에 $bo_table이 존재하는 지 확인
if ($bo_table && array_key_exists($bo_table, $allowedTables)) {
테이블 이름 할당
$tableName = $allowedTables[$bo_table];
$wr_id 변수의 값에 따라 다른 SQL 쿼리 생성
$sql = !is_null($wr_id)
? "SELECT * FROM {$tableName} WHERE wr_id = '".sql_real_escape_string($wr_id)."' LIMIT 1"
: "SELECT * FROM {$tableName} ORDER BY wr_id DESC LIMIT 1";
쿼리 실행
$result = sql_query($sql);
$row에 데이터가 성공적으로 할당되었는지 확인후 검사 그리고
sql_fetch_array() 함수는 쿼리결과 $result 에서 한 행을 배열로 가져옴
if ($row = sql_fetch_array($result)) {
preg_match_all() 함수로 데이터베이스에 있는 미디어 URL 추출
if (preg_match_all('/<img src=\'(.*?)\'|<video src="(https?:\/\/[^"]+)">/',
$row['wr_content'], $matches)) {
gpt의 힘을 빌림
$mediaUrl = !empty($matches[1][0]) ? $matches[1][0] : (!empty($matches[2][0]) ? $matches[2][0] : '');
- 이 코드는 삼항 연산자를 사용하여
$mediaUrl
변수에 값을 할당합니다. 먼저$matches[1][0]
(첫 번째 이미지의src
값)이 비어있지 않은지 확인합니다. 비어 있지 않다면 이 값을$mediaUrl
에 할당합니다. - 만약
$matches[1][0]
가 비어 있다면,$matches[2][0]
(첫 번째 비디오의src
값)이 비어 있는지 확인하고, 비어 있지 않다면 이 값을$mediaUrl
에 할당합니다. - 만약 둘 다 비어 있다면,
$mediaUrl
은 빈 문자열이 됩니다.
이미지 메타 태그 설정 첫 번째 이미지로 했다.
카드 타입은 큰 이미지를 사용했다.
if (!empty($matches[1][0])) { // 첫 번째 이미지
echo '<meta name="twitter:card" content="summary_large_image">' . "\n";
echo '<meta name="twitter:image" content="' . htmlspecialchars($mediaUrl) . '">' . "\n";
}
영상 메타 태그 설정 이것 또한 마찬가지로 첫 번째 영상으로 설정했다.
elseif (!empty($matches[2][0])) { // 첫 번째 동영상
echo '<meta name="twitter:card" content="player">' . "\n";
echo '<meta name="twitter:player" content="' . htmlspecialchars($mediaUrl) . '">' . "\n";
}
공통 메타태그
echo '<meta name="twitter:site" content="@your_twitter_account">' . "\n";
echo '<meta name="twitter:title" content="' . htmlspecialchars($row['wr_subject']) . '">' . "\n";
echo '<meta name="twitter:url" content="' . htmlspecialchars($fullURL) . '">' . "\n";
다른 메타태그를 추가해 사용해도 된다.
이제 트위터 api를 통해 포스팅된 걸 업로드하는 로직이다.
새로운 php 파일을 만들어준다.
crontab은 상대 경로를 인식 못 해서 crontab을 사용하려면 데이터베이스에 연결해야 한다.
수동으로 하려면 ./_common.php를 사용해도 상관없다.
그치만 누가 수동으로 함?
$db_host = "127.0.0.1";
$db_user = "your_id";
$db_password = "password";
$db_name = "database";
// MySQL 데이터베이스에 연결
$mysqli = new mysqli($db_host, $db_user, $db_password, $db_name);
if ($mysqli->connect_error) {
die("연결 실패: " . $mysqli->connect_error);
}
$mysqli->set_charset("utf8");
쿼리는 컬럼을 골라라 wr_id, wr_subject, wr_content를 뭐로부터 g5_write_wr_table로 부터 그리고 순차적으로 정렬 해라 wr_id를 그리고 행하나 선택해라
$query = "SELECT wr_id, wr_subject, wr_content FROM g5_write_wr_table ORDER BY wr_id DESC LIMIT 1";
쿼리실행
$result = $mysqli->query($query);
변수 할당
if ($row = $result->fetch_assoc()) {
$latest_wr_id = $row['wr_id'];
$latest_subject = $row['wr_subject'];
$latest_content = $row['wr_content'];
그누보드 나리야 빌더에서는 사용자가 포스팅할 때 {video} 이런 태그를 쓴다
{video} <video> 둘 다 넣어줬다
// 비디오 태그 변환
$latest_content = preg_replace('/\{video:\s*(.+?)\s*\}/',
'<video src="$1" controls></video>', $latest_content);
// 이미지와 비디오 태그 모두를 찾기 위한 정규 표현식
$pattern = '/<img src=[\'"](.+?)[\'"]|<video src=[\'"](.+?)[\'"]/';
위의 정규 표현식으로 게시물에서 이미지와 동영상 찾기
preg_match_all($pattern, $latest_content, $matches, PREG_SET_ORDER);
$firstMediaUrl = '';
foreach ($matches as $match) {
if (!empty($match[1])) { // <img> 태그의 src가 매치된 경우
$firstMediaUrl = $match[1];
break;
} elseif (!empty($match[2])) { // <video> 태그의 src가 매치된 경우
$firstMediaUrl = $match[2];
break;
}
}
잘 되는지 찍어보았다.
if (!empty($firstMediaUrl)) {
echo "첫 번째 미디어 URL: $firstMediaUrl\n";
} else {
echo "미디어 URL을 찾을 수 없습니다.\n";
}
아까는 메타태그를 파라미터에서 가져왔지만 이제는 그럴 필요가 없어서 그냥 지정해 줬다.
$bo_table = 'wr_table';
$base_url = 'https://www.example.com';
$board_url = $base_url.'/bbs/board.php?bo_table='.$bo_table.'&wr_id='.$latest_wr_id;
X(트위터)의 api는 파이썬으로 만들었다 X로 바뀌고 얼마 안 돼서 코드를 구현했던 거라
php는 정보가 너무 없는 거 같다.
그리고 파이썬파일에는 X(트위터)의 api키등 여러정보가 있으니 주의
.htaccess 를 사용하여 접근을 못 하게 하거나 잘 숨겨놓도록 해야 한다.
$python_script = '/var/www/html/api.py';
파이썬에 배열에 들어갈 거 설정
// 기본 명령어 설정
$command = "python3 $python_script ";
// URL 인자 추가
$command .= escapeshellarg($board_url) . " ";
// 마지막으로 포스팅 된 제목 인자 추가
$command .= escapeshellarg($latest_subject) . " ";
// 미디어 URL 인자 추가
$command .= escapeshellarg($firstMediaUrl);
서버의 쉘에서 파이썬을 호출하는 방법이라고 한다.
$output = shell_exec($command);
echo $output;
} else {
echo "No rows found"; }
// 데이터베이스 연결 종료
$mysqli->close();
2편에서 계속