摘要
微信域名檢測自動化 HTTP 服務腳本,可檢測域名在微信內是否被封或被攔截。
支持檢測情況包括:
- 如需瀏覽,請長按網址複製後使用瀏覽器訪問
- 已停止訪問該網頁
- 將要訪問
- 非官方網頁
- 未備案
技術原理
使用Python腳本自動化控制微信電腦版,完成訪問網頁的過程,解析頁面內容,即可得到檢測結果。
- 優點:準確;
- 缺點:需要掛機、並且響應速度慢,大概需要3-5秒完成一次檢測;
檢測結果
| 顏色 | 頁面 Title | 頁面 Desc | 檢測結果 |
|---|---|---|---|
| 🔴 紅色攔截 | 已停止訪問該網頁 | 網頁包含 XXX 內容,為維護綠色上網環境,已停止訪問。 | 攔截 |
| 🔵 藍色封禁 | 將要訪問 | 非微信官方網頁,請確認是否繼續訪問。 | 攔截 |
| ⚪ 白色封禁 | 如需瀏覽,請長按網址複製後使用瀏覽器訪問 | 頁面 URL | 攔截 |
💡 以上情況均可檢測出結果。
如何使用
- 登錄微信電腦版
- 版本要求:最新版 Windows 微信(版本號 4.1.0.18)
- 打開任意網頁
- 窗口保持最小
- 窗口左上角到搜索框中間位置:265 像素
- 示例截圖:
-
可用截圖軟件測量距離。
優點與缺點
優點:準確
缺點:速度慢、獨佔一台電腦、微信客户端還存在掉線的可能
代碼
import uiautomation as auto
import pyautogui
import time
import json
from http.server import BaseHTTPRequestHandler, HTTPServer
from urllib.parse import urlparse, parse_qs
import pyperclip # 用於剪貼板操作
def find_all_controls(control, results=None):
"""遞歸收集所有控件"""
if results is None:
results = []
try:
if control.Exists(0.1):
results.append(control)
try:
children = control.GetChildren()
except:
children = []
for child in children:
find_all_controls(child, results)
except Exception:
pass
return results
def automate_url(url):
"""執行點擊輸入URL和獲取控件邏輯"""
class_name_to_search = "Chrome_WidgetWin_0"
desktop = auto.GetRootControl()
controls = [c for c in desktop.GetChildren() if c.ClassName == class_name_to_search]
for ctrl in controls:
try:
rect = ctrl.BoundingRectangle
x = rect.left + 275
y = rect.top + 15
# 鼠標點擊
pyautogui.moveTo(x, y, duration=0.3)
pyautogui.click()
# 直接將 URL 放入剪貼板並粘貼
pyperclip.copy(url)
pyautogui.hotkey("ctrl", "v") # 粘貼
pyautogui.press("enter")
time.sleep(2) # 等待頁面加載
# 獲取所有控件
all_controls = find_all_controls(ctrl)
text_controls = [c.Name for c in all_controls if c.ControlTypeName == "TextControl" and c.Name]
if text_controls:
title_text = text_controls[0]
desc_text = ",".join(text_controls[1:]) if len(text_controls) > 1 else ""
else:
title_text = ""
desc_text = ""
blocked_phrases = [
"如需瀏覽,請長按網址複製後使用瀏覽器訪問",
"已停止訪問該網頁",
"將要訪問"
]
if any(phrase in title_text for phrase in blocked_phrases):
return {"code": -1, "msg": "攔截", "url": url, "ret": {"title": title_text, "desc": desc_text}}
else:
return {"code": 0, "msg": "正常", "url": url, "ret": {"title": title_text, "desc": desc_text}}
except Exception as e:
return {"code": -2, "msg": f"操作失敗: {e}", "url": url, "ret": {"title": "", "desc": ""}}
# HTTP 服務器部分保持不變
class MyHandler(BaseHTTPRequestHandler):
def do_GET(self):
parsed_path = urlparse(self.path)
query = parse_qs(parsed_path.query)
url = query.get("url", [""])[0]
if not url:
self.send_response(400)
self.send_header("Content-type", "application/json")
self.end_headers()
self.wfile.write(json.dumps({"code": -3, "msg": "缺少url參數"}).encode("utf-8"))
return
result = automate_url(url)
self.send_response(200)
self.send_header("Content-type", "application/json")
self.end_headers()
self.wfile.write(json.dumps(result, ensure_ascii=False).encode("utf-8"))
if __name__ == "__main__":
host = "127.0.0.1"
port = 8000
print(f"服務器啓動: http://{host}:{port}")
server = HTTPServer((host, port), MyHandler)
server.serve_forever()
啓動HTTP服務
python weixin_domain_check.py
瀏覽器訪問
http://127.0.0.1:8000/?url=你要檢測的域名或鏈接