티스토리 구글 서치 콘솔 미생성 색인 요청 자동화하기 (nodejs)잡2025. 1. 30. 15:55
Table of Contents
728x90
728x90
2년 넘게 기술 블로그를 운영해오면서 블로그 세팅할 때 처음으로 들어가보고, 2년만에 구글 서치 콘솔에 들어가봤다.
어마어마하게 색인이 생성되지 않았는데, 아마 블로그를 운영하면서 불필요한 카테고리를 삭제하거나, 이동시킨 이유들 때문인 것 같다. 4040, 4043, 차단등의 문제는 제외하더라도, 적절한 표준 태그가 포함된 대체 페이지, 색인이 생성되지 않음 의 사유에 해당하는 페이지들은 색인 생성을 한 번쯤은 신청할 필요가 있어 보인다.
기술 블로그만해도 1500페이지 가량 되는 것 같은데, 이 수많은 페이지들을 일일이 색인 생성 요청을 보낼 수 없는 노릇이다. 그래서 GCP의 Web Search Index API를 이용해 자동으로 요청을 보내어 처리하였다.
페이지 색인 생성이 필요한 페이지 URL은 어느정도 수작업이 필요했는데, 페이지 색인 생성 페이지에서 세부 정보 보기를 클릭하여 내보내기 버튼을 통해 엑셀 파일로 내보낼 수 있었다. 내보내기를 통해 엑셀파일을 읽어 API를 통해 색인 업데이트 요청을 보내기만 하면 되는 간단한 자동 색인 생성 요청 코드를 만들어보았다.
const xlsx = require("xlsx");
const request = require("request");
const { google } = require("googleapis");
const key = require("./service_account.json");
// ✅ 1. 엑셀 파일 로드 & URL 리스트 추출
function getUrlListFromExcel(filePath) {
const workbook = xlsx.readFile(filePath); // 엑셀 파일 읽기
const sheetName = workbook.SheetNames[0]; // 첫 번째 시트 사용
const sheet = workbook.Sheets[sheetName];
// A열에서 URL 리스트 추출 (A2부터 끝까지)
const urlList = [];
const range = xlsx.utils.decode_range(sheet["!ref"]);
for (let row = 1; row <= range.e.r; row++) {
// 1부터 시작 (A2부터)
const cellAddress = xlsx.utils.encode_cell({ c: 0, r: row }); // A열(row)
const cell = sheet[cellAddress];
if (cell && cell.v) {
urlList.push(cell.v); // URL 추가
}
}
return urlList;
}
// ✅ 2. Google Indexing API 인증 및 요청 실행
const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); // 대기 함수 추가
async function requestIndexingWithDelay(urlList) {
const jwtClient = new google.auth.JWT(
key.client_email,
null,
key.private_key,
["https://www.googleapis.com/auth/indexing"],
null
);
const tokens = await new Promise((resolve, reject) => {
jwtClient.authorize((err, tokens) => {
if (err) reject(err);
else resolve(tokens);
});
});
let failedUrls = [];
for (let i = 0; i < urlList.length; i++) {
const url = urlList[i];
let options = {
url: "https://indexing.googleapis.com/v3/urlNotifications:publish",
method: "POST",
headers: {
"Content-Type": "application/json",
},
auth: { bearer: tokens.access_token },
json: {
url: url,
type: "URL_UPDATED",
},
};
try {
const response = await request(options);
console.log(`✅ 성공 (${i + 1}/${urlList.length}): ${url}`);
} catch (error) {
console.log(`❌ 실패 (${i + 1}/${urlList.length}): ${url}`);
failedUrls.push(url);
}
await delay(100); // 대기 후 다음 요청 실행 (Rate Limit 방지)
}
console.log("\n🎯 [실패한 URL 목록]");
if (failedUrls.length > 0) {
failedUrls.forEach((failedUrl) => console.log(failedUrl));
} else {
console.log("✅ 모든 요청이 성공적으로 처리되었습니다!");
}
}
// ✅ 3. 실행 (엑셀 파일에서 URL 가져와서 요청)
const filePath = "./urls.xlsx"; // ✅ 엑셀 파일 경로 (현재 폴더에 위치)
const urlList = getUrlListFromExcel(filePath);
console.log(`📢 총 ${urlList.length}개의 URL을 색인 요청합니다.`);
requestIndexingWithDelay(urlList);
혹여 코드를 사용해보려하는 사람들을 위한 세팅법을 간략하게 남기며 포스팅을 정리한다.
- JavaScript 코드를 실행해야하므로 nodejs를 필요로한다. nodejs를 설치하고 실행할 수 있는 환경을 구성해야한다.
- 색인 등록에 필요한 GCP부터 GCP IAM, API 세팅까지 끝마치고 GCP IAM의 JSON파일을 필요로한다. 세팅 방법은 링크에서 확인하자. 정말 자세하게 공유되어있다.
- IAM의 JSON파일과, 색인 URL 경로가 들어있는 xlsx파일은 위 코드와 같은 depth 경로에 있어야한다.
728x90
300x250
@mag1c :: 꾸준히 재밌게
2023.04 ~ 백엔드 개발자의 기록
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!