微信域名被封檢測原理並使用Python檢測
前言
相信很多朋友都遇到過,在微信裡面開啟某個好友分享的連結,提示因涉嫌誘導分享被禁止訪問。
遇到這個情況的時候對於普通使用者來說並沒有什麼影響,微信本身的策略就是不允許使用者分享一些亂七八糟的東西,但是作為微信開發者來說,尤其是像博主我這種在廣告公司做開發的碼農,公司的業務多多少少會涉及到一個分享領紅包,分享得積分這種業務需求,而市場競爭又很激烈,同行也會經常惡意舉報我們的連結,這就導致了我們公司的一些業務會受到影響,為了避免這個問題,我需要及時的判斷域名的狀態是否被封,以便做出對應的調整,比如切換域名或者提示活動結束等等。
當然了,最感興趣的我想是專業做微信裂變導流的開發者了,這篇文章可能會對很多做付費檢測的站長造成衝擊,因為你只要在搜尋引擎裡面搜尋微信防封,絕大部分的文章都是軟文,沒有任何一篇是講解域名檢測原理的,都是在推廣自己的付費檢測服務,而且價格不低,動不動一個月幾千...
這篇文章並不是為了給惡意誘導分享的開發者提供解決方案,目的只是為了給像博主這種底層碼農開發者提供思路,在遇到同樣問題的時候能夠及時有效的應對,畢竟微信封了域名可能直接影響線上的業務。
探索
發現這個原理的人我想一定不在少數,只是大多數人沒有分享出來而已,因為做成付費檢測服務實在是太賺錢了,幾乎不需要什麼成本,甚至連技術門檻都沒有,只要稍微會點服務端開發就能做成,基本原理並不高深。
博主在使用Burp抓包的時候發現,在微信中訪問被封的域名時直接被微信重定向到weixin110.qq.com上,這就說明微信在處理訪問連結的時候先經過伺服器處理,檢測域名是否合法,不合法就直接重定向,根本不給你訪問的機會。
既然這樣,我們使用一個模擬器,模擬訪問我們需要檢測的域名,如果出現重定向就說明被封。
好了,思路有了,具體實現是個大問題,首先我們需要一個模擬器,還得自動化操作,模擬訪問開啟連結需要時間,這樣檢測一次得好幾秒,emmmm...那些號稱千萬級毫秒訪問的大佬肯定覺得這方法行不通。
說實話,博主我也覺得這種方法有些智障,但是早期確實有一些人提供的付費服務是這麼做的,使用手機牆和群控實現也不難,而且這種方法也是最有效的。
你以為這篇文章就這樣講完了嗎?
錯!
要真是這麼做,我等碼農不也還是無法解決問題麼,我們的出發點是解決苦逼開發者的痛點,所以下面講的才是關鍵。
原理
上面說到域名都要先經過微信伺服器檢測一下,所以我們想辦法讓微信自己的域名過微信的檢測,利用經典的重定向方法。在很早的時候QQ也會給域名報紅,那個時候很多大佬千方百計的找各大廠的跳轉漏洞來躲過騰訊的檢測,也就是說騰訊檢測到域名是正常的就會放行,也就不會提示危險連結了。
這裡恰好也是利用這種思路,當然也是有些不同的。
QQ時代,大家擔心的是自己在聊天視窗發出去的連結會被QQ標記為“危險網站”,這樣大家一看就不會打開了,所以只要讓QQ標記為可信網站即可。
但是在微信時代,聊天視窗並不會提示微信網址,而是在開啟的過程中必須先過微信伺服器檢測,也就是說有沒有被封,只有開啟之後才會知道,雖然提示方式有所改變,但是利用思路還是一樣,重定向。
我們開啟微信公眾號開發文件 https://mp.weixin.qq.com/wiki 裡面的 “賬號管理”-> "長連結轉短連結介面"。
說到這我相信很多朋友已經豁然開朗,“啊?原來是這樣!!!”“這也太簡單了吧”“我終於明白了!!”
對,沒錯,就是利用這個,將需要檢測的域名轉換成短連結,使用程式去請求這個短連線,如果被封,域名會被重定向到weixin110.qq.com,我們只需要檢測重定向之後的域名是不是weixin110.qq.com就OK了。
好了,域名檢測就這麼簡單,下面來說說額外的一些技巧吧。
實現
我們觀察微信的文件,這個轉換功能需要三個引數
access_token 呼叫介面憑證 action 此處填long2short,代表長連結轉短連結 long_url 需要轉換的長連結,支援http://、https://、weixin://wxpay 格式的url
第一個引數是關鍵 access_token是從微信那裡獲取到的,獲取access_token需要在公眾號後臺新增伺服器的IP白名單,之後根據微信的文件拿到access_token就可以用了。
注意:這個介面只有認證過的服務號才擁有許可權,每天的請求次數是10000次 ,詳細許可權列表在這裡 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433401084。
那麼有同學就要問了,我沒有公眾號怎麼辦,或者說我公眾號一天10000次根本不夠怎麼辦呢?再或者,我換公眾號了不想新增伺服器白名單怎麼辦?我換伺服器了,改IP白名單很煩躁怎麼辦???
好了好了,博主我現在提供給你更方便更快捷的方法。
我們知道微信為了給開發者提供方便,推出了微信測試號,目的是開發的時候使用,測試號擁有服務號的絕大部分功能,但是基本上所有的功能只能開發者本人使用,連結發出去給別人別人也無法訪問不了。
但是!!!重點來了,那個長連結轉短接的就不一樣了,可以隨便用,我們就是利用了這個,而且有個好處就是微信測試號不需要繫結IP白名單也能獲取到access_token,任何微訊號,有沒有實名認證都無所謂,全部都能申請測試號,所以,你懂的。
測試號唯一的缺點就是,轉換短鏈的介面每天只有1000次的請求次數,所以,你可能需要準備很多個微信測試號,相對來說,微信測試號的成本比認證服務號的成本低的可不是一點點。
so...你懂的...
測試號申請地址 https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
好的,原理就是這麼簡單,下面給出一個簡單的Python程式碼,同學們可以根據自己的需要開發更加智慧的系統實現自動化檢測和切換域名功能,真的很簡單的,博主自己也開發了一整套系統,公司用就不開源了,截幾個圖吧
# 檢查域名是否被封 def check_domain_killed(domain): try: check_url = "http://%s" % domain short_url = create_wechat_short_url(check_url) if short_url: return_url = requests.get(url=short_url, timeout=30).url if "weixin110.qq.com" in return_url: push_msg("封號提醒", '域名' + domain + '被封') else: return False except Exception as e: return False # 建立微信短域名 def create_wechat_short_url(domain): try: access_token_string = "" # 這裡根據文件從微信獲取access_token to_short_params = { "access_token": access_token_string, "action": "long2short", "long_url": domain } short_url = "https://api.weixin.qq.com/cgi-bin/shorturl?access_token=%s" % access_token_string weixin_response = requests.post(url=short_url, data=json.dumps(to_short_params)).json() short_url = weixin_response.get("short_url") return short_url except Exception as e: return False
關鍵程式碼就這麼點,需要的同學自己修改就行了。
總結
不知道微信後期會不會修改這個介面...
本文連結:https://www.92ez.com/?action=show&id=23492
!!! 轉載請先聯絡[email protected]授權並在顯著位置註明作者和原文連結 !!!小黑屋
提示:技術文章有一定的時效性,請先確認是否適用你當前的系統環境。