【随笔小记】如何通过flask判断请求是否来自微信客户端

2024 / 4 / 30

因为代码需要 + 好久没有更了所以写一篇


首先,判断是否来自微信客户端肯定要看请求头 不然看什么?看URL吗?

咱分别获取了Windows 10 Edge浏览器、Vivo的via浏览器以及手机、电脑微信客户端的请求头数据:

  • Windows 10 Edge浏览器
{ "headers": { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6", "Cache-Control": "max-age=0", "Connection": "keep-alive", "Cookie": "cloudreve-session=MTcxMzA4OTA0OHxOd3dBTkRkWlJVUXpSMUZCTWxZMFdUZFJUMVJMV1RaWFZFdEJVMUExUWtwRFRrTkNSVmhXVmtNMVVFcERRazFCU0VaUlVqSldTa0U9fP8wdulS_g1re2fYg8ZUeIMm498Ms2-xs5_O3WcEIPsA", "Host": "192.168.1.3:8848", "Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0" } }
  • via浏览器
{ "headers": { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7", "Cache-Control": "max-age=0", "Connection": "keep-alive", "Cookie": "cloudreve-session=MTcxMzA3NjY3NXxOd3dBTkZkWU4wSlJOa1ZNVnpOUVdFUkZWMHBDUzA0MlJFSlNSMHRTVURKT1VGTkRORTAzUjFsVFRESk1Vak5RU1V4TU1sUkdXRkU9fAbHoe4OVdLTEuds16LgpYPkuhUjfm-gPQD4QHJvpCnR", "Dnt": "1", "Host": "192.168.1.3:8848", "Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Linux; Android 11; V2068A Build/RP1A.200720.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Mobile Safari/537.36", "X-Requested-With": "mark.via" } }
  • 手微
{ "headers": { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/wxpic,image/tpg,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7", "Connection": "keep-alive", "Host": "192.168.1.3:8848", "Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Linux; Android 11; V2068A Build/RP1A.200720.012; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36 XWEB/1160117 MMWEBSDK/20231002 MMWEBID/8032 MicroMessenger/8.0.43.2480(0x28002B51) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64", "X-Requested-With": "com.tencent.mm" } }
  • PC微
{ "headers": { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.9", "Connection": "keep-alive", "Host": "192.168.1.3:8848", "Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 NetType/WIFI MicroMessenger/7.0.20.1781(0x6700143B) WindowsWechat(0x63090a13) XWEB/9115 Flue" } }

显而易见,在微信客户端所发送的请求头的“User-Agent”中会包含WeChat字眼

然后 就可以对此做出判断:

# 这是伪代码 放到IDE里101%会报错的那种 if User-Agent字段包含“WeChat”: 使用的是微信客户端 进行处理…… return 使用微信访问 else: return

又因为在电脑里没有“WeChat”字眼,所以可以加多一个对“WindowsWechat”字眼的检测条件

然后问题就迎刃而解了


吗?

在IOS相关设备的测试中,发现它的请求头既不包含“WeChat”、也不包含“Weixin”什么的 他是这样的:

192.168.1.225 - - [30/Apr/2024 21:25:21] "GET / HTTP/1.1" 200 - Host: 192.168.1.3:8848 Upgrade-Insecure-Requests: 1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 16_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.49(0x18003127) NetType/WIFI Language/en Accept-Language: en-GB,en;q=0.9 Accept-Encoding: gzip, deflate Connection: keep-alive

没得检测

经过Google得知 MicroMessenger 这个和tx、微信毫不相干的东西就是微信内置浏览器的名称~(至于为什么就要去问那个傻逼张小龙了)~

所以 我们的代码就可以简化成:

if "MicroMessenger" in h["User-Agent"]: return "你可能在使用微信访问" else: return "你可能没有使用微信访问"

码:

from flask import Flask, request, jsonify app = Flask(__name__) @app.route('/', methods=['GET']) def main(): headers = request.headers print(headers) h = dict(headers) if "MicroMessenger" in h["User-Agent"]: ... return "你可能在使用微信访问" else: ... return "你可能没有使用微信访问" if __name__ == '__main__': app.run(host='0.0.0.0',port=8848,debug=True)

© Howard Jones 版权所有