1. 程式人生 > >Java HttpClient 如何偽裝微信瀏覽器進行POST請求

Java HttpClient 如何偽裝微信瀏覽器進行POST請求

當我用HttpClient的post去請求外部微信支付跳轉時得到一個返回值:

{"code":"XXXXXXXXX,"message":"請使用微信開啟頁面"}

當時通過思考我想到了兩個辦法:

  • 把這個POST請求放在頁面上,通過Ajax去POST請求,由於是微信公眾號跳轉,所以跳轉肯定是用微信跳轉的
  • 還是通過後臺跳轉,想辦法傳送請求的時候跳過微信識別驗證或者直接把請求偽裝成微信瀏覽器請求

第一種辦法比較快捷,由於時間問題,肯定比較傾向快速解決:
執行專案後在微信裡去點選按鈕進行POST請求的時候報 405 這是資源跨域的問題,在網上找了一些辦法說在被請求的資源加上 “Access-Control-Allow-Origin”,但是我請求的是第三方,所以這個問題到了這裡對於我來說就有點無解,實在由於時間問題不去找其他資料了,這個等空閒了看看能不能實現。

第二種辦法和我當初的想法一樣,就是卡在這裡,既然第一種方法不行那就想想怎麼偽裝成微信去訪問:

去網上找了一些資料,得到的確是在谷歌瀏覽器開發者模式下手機模式下修改值為:

Mozilla/5.0 (Linux; U; Android 2.3.6; zh-cn; GT-S5660 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MicroMessenger/4.5.255

 這是什麼鬼

這樣就能用谷歌訪問必須要微信訪問的頁面,我試了用這個模式直接跳轉Url去跳轉第三方POST,發現有返回跳轉頁面,而不是“message”:”請使用微信開啟頁面”

,那就按照這個方式走,既然我能偽裝瀏覽器我為何不能偽裝後臺POST請求的時候偽裝的瀏覽器設定有微信特點的偽裝成微信瀏覽器去訪問呢?

逆向思維一下,既然第三方判斷我這邊請求不是用微信的話,它是通過什麼判斷的,所以我百度了一下,發現微信可以通過Request(請求)中獲取頭部中的userAgent值來判斷是否是微信內建瀏覽器,意思就是可以在POST請求上頭部資訊加上userAgent的值來偽裝微信內建瀏覽器去請求了:

    // 請求客戶端及引數
    CloseableHttpClient client = HttpClients.createDefault();
    // Post請求
    HttpPost httppost = new HttpPost(url);
    //在這裡我們給Post請求的頭部加上User-Agent來偽裝成微信內建瀏覽器
    httppost.setHeader("User-Agent"
,"Mozilla/5.0 (Linux; U; Android 2.3.6; zh-cn; GT-S5660 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MicroMessenger/4.5.255"); //這個是在網上看到的,要加上這個,避免其他錯誤 httppost.setHeader("Referer", "https://mp.weixin.qq.com"); //傳送Post請求 response = client.execute(httppost); //.....獲取response請求後其他的操作

通過測試,問題解決。

總結:

微信的內建瀏覽器識別是請求的頭部是否有 User-Agent 值並且值是否為User-Agent”,”Mozilla/5.0 (Linux; U; Android 2.3.6; zh-cn; GT-S5660 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MicroMessenger/4.5.255 所以以後要進行後臺跳轉相關微信服務可以通過設定頭的 User-Agent的值來進行偽裝微信內建瀏覽器請求