웹사이트 백링크 확인 도구: 스케줄링 가능한 스크립트
여기서의 모든 호출은 curl 또는 기타 HTTP 클라이언트와 함께 작동합니다. 키를 교체하고 패턴을 유지하세요: 호출, 저장, 변경 비교(diff).
ArchiLinks 연구팀 ·

기본 규칙
한 번의 호출, 한 번의 청구. 행 수에 관계없이 각 요청은 한 번 청구되며, 단일 호출당 최대 1,000개의 행이 반환됩니다. 깊은 페이지네이션은 50,000행에서 중단되며, per 매개변수는 10부터 5,000까지의 값을 허용합니다.
이것이 스크립트 작성 방식에 영향을 미칩니다. per=1000을 요청하고 더 많은 데이터가 필요할 때만 페이지네이션을 사용하세요. 작은 페이지 단위로 구성된 웹사이트 백링크 확인 도구는 이득 없이 비용을 10배로 증가시킵니다. 오류 메시지는 명확합니다: 키가 누락되면 HTTP 401, 크레딧이 소진되면 402, 모든 JSON 본문에는 ok 필드가 포함됩니다.
작은 도메인 대상으로 각 스크립트를 한 번 수동으로 실행하고 JSON을 읽어보세요. 키 이름, 행 컨테이너 및 페이지네이션 필드는 예시가 아닌 실제 응답에서 가져와야 하므로, cron 작업에 의존하기 전에 이를 확인하세요.
Python: 날짜가 포함된 스냅샷 저장
응답의 필드 이름은 예시입니다. 키에 의존하기 전에 응답을 한 번 출력하세요.
import json, sys, datetime, requests
BASE = "https://archilinks.com/api.php"
KEY = "sk_live_..."
def snapshot(domain, action="refdomains"):
r = requests.get(BASE, params={"action": action, "q": domain, "per": 1000, "key": KEY}, timeout=30)
if r.status_code in (401, 402):
sys.exit(f"API said {r.status_code}: check key or balance")
r.raise_for_status()
body = r.json()
assert body.get("ok"), body
name = f"{domain}-{action}-{datetime.date.today()}.json"
json.dump(body, open(name, "w"), indent=1)
print(name, body.get("_credits"))
snapshot(sys.argv[1])Node: 목록용 도메인 평점(DR) 일괄 조회
bulk_dr은 GET 요청의 domains 매개변수 또는 POST 본문으로 최대 2,000개 도메인을 처리하며 호출당 1 크레딧이 필요합니다. 아래에 표시된 쉼표 구분자는 예시이며, 먼저 두 개의 도메인으로 테스트하세요. Node 18 이상에는 fetch가 내장되어 있습니다.
const domains = ["example.com", "example.org"];
const url = new URL("https://archilinks.com/api.php");
url.search = new URLSearchParams({
action: "bulk_dr",
domains: domains.join(","),
key: "sk_live_...",
});
const res = await fetch(url);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
console.log(JSON.stringify(await res.json(), null, 2));Bash 및 jq: 주간 변경 비교
날짜를 포함하여 스냅샷을 저장한 후 두 파일을 비교하세요. cron 작업을 주간 또는 월간으로 유지하세요. 색인은 약 한 달마다 새로 고쳐집니다.
# crontab: 0 6 1 * * /opt/seo/pull.sh old-shop.com
curl -s "https://archilinks.com/api.php?action=refdomains&q=$1&per=1000&key=$KEY" \
| jq -S . > "snap-$1-$(date +%F).json"
# compare two dated files
diff <(jq -S . snap-old-shop.com-2026-09-01.json) <(jq -S . snap-old-shop.com-2026-10-01.json) | head -50스크립트별 작업 선택
| 스크립트 | 작업 | 실행당 비용 | 출력 |
|---|---|---|---|
| 이민(bias) 기준선 | toppages, refdomains | 4 크레딧 | 두 개의 JSON 파일 |
| 아웃리치 정리 | bulk_dr | 호출당 1 크레딧, 최대 2,000개 도메인 | 각 후보의 DR |
| 경쟁사 중복 분석 | intersect | 2 크레딧 | 2~10개 도메인에 링크하는 사이트 |
| 앵커 모니터링 | anchors | 2 크레딧 | 앵커 텍스트 목록 |
| 포트폴리오 확인 | compare | 호출당 1 크레딧, 최대 20개 도메인 | 측정값 비교 |

예외 처리
스크립트는 예외 상황에서 실패합니다. 이에 대비하세요.
각 호출을 재시도 로직으로 감싸되, 3회 시도 후 중단하세요. 401 및 402 오류는 재시도로 해결되지 않으므로 제외하세요. 인증된 응답에서 _credits 객체를 로깅하여 지출 급증이 잔고에 반영되기 전에 로그에서 확인되도록 하세요. 또한 루프에 하드 최대 페이지 수를 설정하세요.
스냅샷은 파일 이름에 날짜를 포함하여 git 또는 객체 저장소에 보관하세요. 단순하고 지루하지만 효과적입니다. 마이그레이션의 경우 이 스크립트를 리디렉션 맵 레시피 및 마이그레이션 체크리스트와 함께 사용하세요. Google Sheets 사용자는 UrlFetchApp을 통해 Apps Script에서 동일한 URL을 호출할 수 있으며, 월간 트리거가 설정된 시트는 훌륭한 모니터링 도구가 됩니다.
스크립트 관련 질문
대부분의 스크립트가 배포되기 전에 세 가지 질문이 제기되며, 각각에 대한 짧은 답변이 있습니다.
내 사이트에 백링크가 얼마나 있는지 무료로 확인하는 방법은?
키 없이 overview 또는 stats 작업을 호출하세요. 둘 다 무료이며 자체 링크 인덱스의 총계를 반환합니다.
총계 뒤에 있는 목록을 확인하려면 키가 필요하며 호출당 2 크레딧이 필요합니다.
잔고가 고갈되면 어떻게 되나요?
API는 HTTP 402를 반환합니다. 스크립트는 루프를 돌며 재시도하는 대신 중단하고 알림을 보내야 합니다. 계정 페이지에서 USDT(TRC-20)로 크레딧을 충전한 후 다시 실행하세요.
브라우저에서 호출할 수 있나요?
네. CORS가 열려 있습니다. 하지만 누구나 키를 읽고 크레딧을 소모할 수 있으므로 공개 프론트엔드 코드에 키를 넣지 마세요.

크레딧 낭비 없이 페이지네이션하기
페이지네이션은 스크립트가 예상보다 더 많은 비용을 발생시키는 지점입니다. 각 페이지 요청은 별도의 호출이며 별도의 요금이 부과되므로, 불필요한 페이지를 한 번 더 요청하는 루프는 비용만 증가시킵니다.
루프를 작성하기 전에 실제 응답에서 페이지네이션 필드를 읽어보세요. 이 사이트의 예시는 구조를 보여주지만, 필드 이름 및 종료 신호는 라이브 JSON에서 가져와야 합니다.
요청한 행 수보다 적은 행이 반환되면 중단하세요
요청한 행 수보다 적은 행이 포함된 페이지는 보통 마지막 페이지입니다. 추가 페이지를 요청하여 확인하기보다 루프가 해당 지점에서 중단되도록 하세요.
응답에 total 또는 next-page 필드가 있는 경우 이를 종료 신호로 사용하세요. 저장한 행 수를 해당 필드와 비교하여 불일치가 발생하면 로그에 표시되도록 하세요.
모든 루프에 상한 설정
모든 루프에 페이지 수의 하드 최대치를 설정하세요. 필드 이름이 변경되어 스크립트가 동일한 페이지를 계속 요청하는 경우 잔고를 보호할 수 있습니다.
예상 크기에 따라 상한을 설정한 후, 실제 도메인에서 더 많은 페이지가 필요할 때 의도적으로 상한을 높이세요.
페이지가 도착할 때마다 기록하세요
페이지가 반환되는 즉시 페이지 번호가 포함된 파일 이름으로 디스크에 저장하세요. 40페이지에서 중단된 스크립트는 다시 시작하고 두 번 지불하는 대신 마지막 저장된 파일부터 재개할 수 있습니다.
도메인 및 날짜별 폴더에 파일을 보관하여 재실행 시 두 번의 추출이 혼합되지 않도록 하세요.
스케줄에 따라 스크립트 실행
어떤 스케줄러든 사용 가능합니다. 중요한 것은 각 실행이 파일을 남기고, 실패한 실행이 관련자에게 알림을 보내는 것입니다.
작업용 호스트 선택
Cron은 디스크를 직접 제어할 수 있는 서버에 적합합니다. CI 작업은 이미 스냅샷을 보관하는 저장소에 적합하므로, 기록이 해당 코드가 읽는 코드 옆에 유지됩니다.
어떤 방식을 선택하든 도메인 목록을 파일에 보관하세요. 이렇게 하면 도메인 추가가 스크립트 변경이 아닌 단순 편집으로 처리됩니다.
모든 성공이 아닌 실패 시 알림
스크립트가 실패하거나 잔고가 설정된 수준 이하로 떨어질 때 알림을 보내세요. 매일 아침 성공 메시지를 보내면 사람들이 실제 문제를 알리는 채널을 무시하게 됩니다.
Python 예시처럼 각 실행에서 _credits 객체를 로깅하고 월간으로 트렌드를 검토하세요.
5단계로 주간 변경 비교하기
작업 선택
질문에 답할 수 있는 두세 가지 호출을 선택하세요. 각 호출에는 크레딧 비용이 발생하므로 옆에 비용을 적어두세요.
원본 응답 저장
도메인과 날짜가 파일 이름에 포함된 상태로 JSON을 그대로 저장하세요. 포맷팅은 변경 비교 단계로 미루세요.
비교 전 키 정렬
jq -S 또는 유사한 도구를 사용하여 키 순서가 변경으로 표시되지 않도록 하세요. 위의 bash 예시가 이를 수행합니다.
파일이 아닌 목록 비교
URL 또는 도메인을 기준으로 두 응답을 조인한 후 추가, 제거, 변경된 항목을 보고하세요. 긴 파일의 원본 텍스트 diff는 실행하기 어렵습니다.
변경 사항 검토 및 조치
제거된 링크 도메인은 아웃리치 담당자에게, 제거된 페이지는 리디렉션 담당자에게 전달하세요.
cron 작업에 의존하기 전 스크립트 테스트
무인 실행되는 스크립트는 먼저 자체 검증을 해야 합니다. 작은 도메인 하나를 사용하고 전체 JSON을 읽은 후 목록을 확장하세요.
빠른 정상성 확인을 위해 동일한 도메인의 무료 overview 호출 결과와 총계를 비교하세요. 숫자가 유료 목록과 정확히 일치할 필요는 없지만, 규모는 일치해야 합니다.
두 개의 도메인으로 실행
두 개의 도메인은 루프, 파일 이름 및 오류 경로를 테스트합니다. 하나의 도메인은 운이 좋아 통과할 수 있지만, 두 개의 도메인은 루프가 도메인 간에 초기화되는지 여부를 보여줍니다.
잘 아는 도메인 하나와 잘 모르는 도메인 하나를 사용하여 출력이 올바른지 판단할 수 있도록 하세요.
키를 로그 및 티켓에서 제외
스크립트는 종종 전체 요청 주소를 출력하며, 키가 주소의 매개변수로 포함됩니다. 서버를 떠나는 모든 줄에서 키를 제거하거나 Authorization 헤더를 통해 보내어 주소에서 키를 숨기세요.
키가 티켓이나 공개 저장소에 표시되면 다음 실행 전에 해당 키를 사용하는 스케줄된 작업을 중지하세요.
키의 위치, 키를 읽는 스크립트 및 호출하는 호스트에 대한 짧은 메모를 보관하세요. 이 메모는 누가 잔고를 소모할 수 있는지 질문이 있을 때 필요합니다.
각 질문에 대한 작업 선택
엔드포인트 목록이 아닌 질문에서 시작하세요. 마이그레이션은 링크를 포함하는 URL을 알아야 하며, 아웃치 목록은 도메인 점수가 필요합니다. 하나의 호스트, 두 가지 질문. 각각은 다른 수의 크레딧이 필요합니다.
코드를 작성하기 전에 질문 옆에 비용을 적어두세요. 주간으로 실행되는 스크립트는 작은 가격을 52배로 증가시키며, 이 곱셈은 잔고가 이를 보여주기 전까지 잊히기 쉽습니다.
적절히 중단하는 재시도
타임아웃이나 서버 오류와 같은 임시 이유로 실패한 요청은 재시도하세요. 기다린다고 해서 401 또는 402가 해결되지 않으므로 이 두 오류에는 재시도하지 마세요.
모든 재시도를 작업 및 도메인과 함께 로깅하여 실패 패턴이 침묵이 아닌 패턴으로 나타나도록 하세요.
재시도 횟수를 한 곳에서 설정하여 스크립트의 모든 호출이 동일한 규칙을 따르도록 하세요. 흩어진 재시도 루프는 서로 불일치하기 쉬우며, 이러한 불일치는 로그에서 찾기 어렵습니다.