0%

正威網路行銷工作室,專注於基隆、台北與全台客製化網頁設計,提供專業 RWD 響應式、SEO 搜尋引擎優化、品牌形象設計與網站維護託管服務。

搜尋文章
聯絡資訊
地址基隆市仁二路 220 號 5 樓
追蹤我們

網頁上的 Email 怎麼防止被採集:antispambot 與其他做法

網頁上的 Email 怎麼防止被採集:antispambot 與其他做法 封面

公司網站放上聯絡信箱之後,垃圾信越收越多。原因之一是有程式專門在網路上爬網頁,看到 xxx@xxx.com 這種格式就收集起來,拿去寄廣告信。

WordPress 內建一個小函式 antispambot(),可以把 Email 改寫成網頁編碼:

純文字
原本:service@example.com
處理後:service@example.com

瀏覽器會把編碼轉回來,訪客看到的還是 service@example.com,點了也能直接寫信;但網頁原始碼裡找不到完整的地址,只會比對文字格式的簡單爬蟲就收集不到。每次產生的編碼還會隨機變化。

程式碼

放在子佈景主題的 functions.php,或用 Code Snippets 這類外掛新增:

PHP
// 短代碼 [zw_email address="service@example.com"]:輸出打亂過的 Email 連結
add_shortcode( 'zw_email', function ( $atts ) {
	$email = sanitize_email( $atts['address'] ?? '' );
	if ( ! is_email( $email ) ) {
		return '';
	}
	return '<a href="mailto:' . antispambot( $email ) . '">' . antispambot( $email ) . '</a>';
} );

// 文章內容、摘要和留言裡直接打的 Email,顯示時自動打亂
function zw_hide_emails( $content ) {
	// WordPress 自動產生摘要時,會先跑一次 the_content 再截字;這時先不處理,
	// 等摘要截好之後(下面的 get_the_excerpt)再處理,免得把打亂後的字截斷
	if ( 'the_content' === current_filter() && doing_filter( 'get_the_excerpt' ) ) {
		return $content;
	}
	return preg_replace_callback(
		'/(?<![\w.\-+=\/@])[\w.+\-]+@[\w\-]+(?:\.[\w\-]+)+/u',
		function ( $m ) {
			return is_email( $m[0] ) ? antispambot( $m[0] ) : $m[0];
		},
		$content
	);
}
add_filter( 'the_content', 'zw_hide_emails', 20 );
add_filter( 'get_the_excerpt', 'zw_hide_emails', 20 );
add_filter( 'comment_text', 'zw_hide_emails', 20 );

短代碼 [zw_email]

在頁面放一個「短代碼」區塊,填入:

純文字
[zw_email address="service@example.com"]

會輸出一個可以點的 Email 連結,連結和顯示的文字都經過編碼。

文章、摘要、留言自動處理

下半段讓文章內容、摘要和留言裡直接打出來的 Email,在顯示時自動編碼,不用一篇一篇改:

  • 規則只抓「看起來像 Email」的文字,再用 is_email() 確認一次。
  • 網址裡的 @(例如圖片檔名 logo@2x.png 前面接著 /)不會被當成 Email。
  • 處理的是顯示的時候,資料庫裡的文章內容不會被改掉,拿掉程式碼就恢復原狀。

實際測試的結果

測試文章裡放了:兩個直接打的 Email、一個 mailto 連結、一個短代碼、程式碼區塊裡的 Email、一張檔名有 @2x 的圖片,留言裡再放一個 Email。

  • 網頁原始碼:找不到任何一個完整的 Email。
  • 瀏覽器顯示:每個 Email 都正常顯示,mailto 連結點下去的地址正確(mailto:boss@example.com、mailto:hello@example.com)。
  • 圖片網址 logo@2x.png 沒有被改到,圖片正常。
  • 留言裡的 Email,WordPress 本來就會自動變成連結,處理後連結也正確。

測試時發現的問題:摘要被截斷

第一版程式只處理 the_content,結果文章列表的自動摘要出現一段亂碼,像 &#9 […]。

原因是 WordPress 產生摘要時,會先把文章內容跑一次 the_content(這時 Email 已經被編碼成一長串),再截取前面幾十個字。剛好截在編碼的中間,就變成亂碼了。

現在的寫法是:產生摘要的過程中先不編碼,等摘要截好之後,再透過 get_the_excerpt 處理。測試一篇 Email 在摘要範圍內的長文章,摘要顯示正常,原始碼裡也沒有完整的 Email。

這種做法擋不住什麼

antispambot() 只是把字換成網頁編碼,比較進階的爬蟲會先把網頁編碼還原再收集,一樣抓得到。它能減少的是最簡單、數量最多的那一類。

更有效的做法:

  • 用聯絡表單取代公開 Email。客人填表單,信由網站寄給你,Email 完全不出現在網頁上。表單記得加上防垃圾機制。
  • 用專用信箱。網站上公開的信箱和自己平常用的分開,垃圾信太多時可以換掉。
  • 網站有用 Cloudflare 的話,它有「Email 位址混淆」功能,開啟後會自動處理整個網站。
  • 不建議把 Email 做成圖片。看不到圖的人沒辦法讀,也不能點擊或複製,對客人很不方便。

延伸閱讀

網站的聯絡方式要讓客人好找,又不能讓機器人太好找。正威網路行銷是 25 年經驗的基隆網頁設計工作室,會依你的接單方式規劃表單、LINE、電話這些聯絡入口,台北與全台客戶也歡迎來聊聊。

分享這篇文章

返回文章列表更多「Wordpress代碼教學」文章

發表留言

還沒有人留言,歡迎第一個分享你的想法或問題。留言經審核後才會顯示,Email 不會公開。

讓我們一起打造
您的專屬網站!