首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 友情鏈接批量檢測工具:自動化驗證對方網站是否保留貴站連結

     編輯:PHP 相關知識

工具簡介

交換友情鏈接 (回連) 是 SEO 常見手段,但對方可能悄悄移除貴站連結。本工具提供一個完整的 PHP + JavaScript 解決方案,支援:

  • 視覺化輸入:直接在編輯區貼上對方網頁原始碼 (含圖片/文字連結)。
  • 智能解析:自動提取所有 <a href=...> 連結。
  • 異步批量檢測:使用隱藏 iframe + JS 遞迴逐一檢查,避免瀏覽器超時。
  • 雙模式:手動逐個點擊檢查 / 全自動連續檢查。
  • 結果判定:綠色通過 (找到連結) / 紅色失敗 (未找到) / 內部連結 / 抓取失敗 / 格式錯誤。

核心架構流程

  1. 前端:contenteditable iframe 做視覺編輯器 -> 正則提取連結 -> 產生檢查列表 -> JS 狀態機控制 hidden_iframe 發送檢查請求。
  2. 後端:check_links.php?mod=check_now 接收目標 URL + 待查連結 -> cURL/file_get_contents 抓取遠端內容 -> stristr 搜尋待查連結 -> 回傳 JS 腳本更新父頁面 DOM 狀態欄。
  3. 超時控制:JS setTimeout 監控,超時標記可重試,自動模式下自動跳過繼續下一個。

關鍵程式碼解析

1. 通用遠端內容獲取函數 (支援 cURL 回退)

function my_file_get_contents($url, $timeout = 30) {
    if (function_exists('curl_init')) {
        $ch = curl_init();
        curl_setopt_array($ch, [
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_CONNECTTIMEOUT => $timeout,
            CURLOPT_FOLLOWLOCATION => true, // 支援重導向
            CURLOPT_USERAGENT => 'Mozilla/5.0 (Link Checker Bot)',
            CURLOPT_SSL_VERIFYPEER => false, // 簡易處理 HTTPS
        ]);
        $content = curl_exec($ch);
        curl_close($ch);
        return $content;
    }
    // 回退方案
    if (ini_get('allow_url_fopen')) {
        $ctx = stream_context_create(['http' => ['timeout' => $timeout]]);
        return @file_get_contents($url, false, $ctx);
    }
    return '';
}

2. 後端檢查邏輯

if (isset($_GET['mod']) && $_GET['mod'] === 'check_now') {
    $targetUrl = $_GET['url'];
    $myUrl = $_GET['my_url'];
    $id = (int)$_GET['id'];
    $jsId = "parent.document.getElementById('s_$id').innerHTML";

    // 1. 過濾內部連結
    if (strpos($targetUrl, $myUrl) !== false) {
        die("");
    }
    // 2. 格式驗證
    if (stripos($targetUrl, 'https://') !== 0 && stripos($targetUrl, 'https://') !== 0) {
        die("");
    }

    // 3. 抓取並分析
    $content = my_file_get_contents($targetUrl);
    if (trim($content) === '') {
        $msg = '抓取內容失敗';
    } elseif (stripos($content, $myUrl) !== false) {
        $msg = '包含連結,檢查通過';
    } else {
        $msg = '未找到連結,請核查';
    }
    die("" . 
        ($_GET['auto_check'] ? "" : ''));
}

3. 前端連結提取正則 (PHP 端)

// 提取所有  的 URL
preg_match_all('/]*href=["\']?(https?:\/\/[^"\'>\s]+)["\']?/isU', $htmlCode, $matches);
$urls = $matches[1]; // 第 1 捕獲組為 URL

4. 前端 JS 狀態機核心

function checkLink(id) {
    const statusEl = document.getElementById('s_' + id);
    const urlEl = document.getElementById('u_' + id);
    if (!statusEl || !urlEl) return auto_check = 0; // 結束

    if (auto_check && statusEl.innerHTML.includes('超時')) {
        alert('請等自動檢查結束'); return false;
    }

    statusEl.innerHTML = '正在檢查...';
    hidden_iframe.src = `check_links.php?mod=check_now&url=${encodeURIComponent(urlEl.href)}&id=${id}&my_url=${encodeURIComponent(my_url)}&auto_check=${auto_check}`;
    
    setTimeout(() => checkTimeout(id), 25000); // 25秒超時
}

function checkTimeout(id) {
    const el = document.getElementById('s_' + id);
    if (el.innerHTML !== '正在檢查...') return; // 已完成
    el.innerHTML = "可能超時,重新檢查";
    if (auto_check) checkLink(id + 1); // 自動模式跳過
}

功能增強建議 (現代化改造)

現狀痛點改進方案
同步阻塞抓取,效率低後端改用 Swoole / Workerman / PHP-FPM + cURL Multi 並發抓取;前端用 fetch/axios + Promise.allSettled 批次請求 API。
僅檢查首頁 HTML,無法檢測 JS 渲染連結引入 Headless Chrome (Puppeteer/Playwright) 渲染後再檢查,或要求對方提供 sitemap.xml/API。
無 User-Agent 偽裝,易被防火牆攔截輪換 User-Agent、IP 代理池、設定 Accept-Language 模擬真實瀏覽器。
編碼問題 (GBK/UTF-8 混雜)統一用 mb_detect_encoding + mb_convert_encoding($content, 'UTF-8') 處理。
無資料庫記錄歷史建立 link_check_logs 表,記錄時間、狀態、HTTP Code、回應時間,支援趨勢圖表。
視覺編輯器相容性差改用 textarea 貼上原始碼,或整合 Monaco Editor / CodeMirror 高亮顯示。

安全性與法律提醒

  • 頻率控制:加入 sleep(rand(1,3)) 或 Token Bucket 限流,避免被目標站點封禁 IP 或觸發法律風險 (如《電腦犯罪條例》)。
  • Robots.txt 遵守:檢查前應解析目標 /robots.txt,尊重 Disallow 規則。
  • 輸入過濾:嚴格驗證 my_url 與提取出的 URL 格式,防止 SSRF (Server-Side Request Forgery) 攻擊內網服務。

結語

本工具雖屬經典「PHP 4/5 時代」作品 (使用 designMode iframe 編輯器、隱藏 iframe 異步通訊),但其「前端解析 -> 後端驗證 -> 前端輪詢更新」的架構思想在現代 SEO 監控工具中依然通用。建議將核心邏輯重構為 API 服務,前端採用 Vue/React 重寫,即可變身為專業級友鏈監控平台。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved