思路简介
使用selenium模拟访问网站时,一般大型网站会对此有检测,从而防止登陆,此方法是通过mitmproxy充当中间人对网站发送的js文件进行拦截,并修改从而达到屏蔽网站检测的目的。
总结一下整个过程填的坑吧。。。。。
首先所需要的东西,mitmproxy包,mitmproxy证书的获取,selenium的使用(之前已经学习过了)
一开始在云服务器上操作,按上去了,chrome,以及图形化桌面。。。。
以及安装mitmproxy,以及证书的安装。
如需要截获HTTPS请求,就需要配置相关证书:mitmProxy自身提供了一套ca证书,和常见的
中间人抓包工具fidder、charles一样,在客户端配置对mitmProxy证书的信任即可以通过
pip3 install mitmproxy安装包。
接下来获取证书时,要注意先用mitmdump运行一次,才会在根目录中产生.mitmproxy,否则是进不去的。
通过pip3 install mitmproxy进行安装
而在.mitmproxy中有很多证书,其中mitmproxy-ca-cert.pem是在linux虚拟机上的。
mitmproxy获取https的内容。
- 运行mitmdump命令,在root目录下的.mitmproxy查找相应的ca证书: mitmproxy-ca-cert.pem
- 将pem证书转换成.crt:
openssl x509 -in mitmproxy-ca-cert.pem -inform PEM -out mitmproxy-ca-cert.crt - 将ca证书添加到本地ca-trust存储来安装CA证书:
cp mitmproxy-ca-cert.crt /etc/pki/ca-trust/source/anchors/
update-ca-trust
感觉证书应该是一开始都安装好了,只不过因为后来的一些操作不当,导致一直没有成功。。。
通过该命令挂载py文件,mitmdump -s httpproxy.py -p 9090
而httpproxy.py 既是获取到js文件后对该文件进行的处理操作
第一个是网上搜索到的代码,第二个是ppt上的代码,因为PPT显示的不全,第一段就结合改了一下。
TARGET_URL = 'https://g.alicdn.com/secdev/sufei_data/3.6.11/index.js' #这个是淘宝的index.js文件的
INJECT_TEXT = 'Object.defineProperties(navigator,{webdriver:{get:() => false}});' #js执行文件
def response(flow):
if flow.request.url.startswith(TARGET_URL):
flow.response.text = INJECT_TEXT + flow.response.text
print('注入成功')
if 'um.js' in flow.request.url or '115.js' in flow.request.url:
# 屏蔽selenium检测
flow.response.text = flow.response.text + INJECT_TEXT
``
import re INJECT_TEXT = 'try{Object.defineProperties(navigator,{webdriver:{get:() => false
def response(flow):
match = re.search(r'\.js$',flow.request.url) if match: # 屏蔽selenium检测
flow.response.text = INJECT_TEXT + flow.response.text print('注入成功')
#flow.response.text = flow.response.text + INJECT_TEXT
挂载了py文件之后,就相当于以及开始监控了,但是因为在linux上,就是用ctrl+z直接将mitmdump -s httpproxy.py -p 9090其结束了后。就开始运行selenium上的代码了也就是机器模拟登录。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
import time
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--proxy-server=http://127.0.0.1:9090')#127.0.0.1本地登录
#chrome_options.add_argument('headless')
browser = webdriver.Chrome(executable_path="C:\\Users\\31114\\Downloads\\chromedriver_win32\\chromedriver.exe",chrome_options=chrome_options)
browser.get('https://aks.meituan.com/')
web = browser.execute_script("return window.navigator.webdriver")
print (web)
time.sleep(10)
browser.close()
然后就是。。找不到服务器。。。
之后为了不用ctrl+z结束,就再服务器上开启mitmproxy服务,从本地电脑上模拟登录,然后一直是找不到数据。。。
最后不通过云服务器了,在电脑上安装了mitmproxy,挂载后,模拟登录,成功了。
最后总结一下整个过程,其实就是mitmproxy在中间,当了一个中间人,所以mitmproxy很重要,
在这里再次使用云服务器实验了一下,,我突然想起来可以在开一个连接会话傻了。。。。。。。。。。一个用来运行mitmproxy挂载,一个用来执行模拟登录,成功。。所以一定要在那个服务器上挂载的注入程序,就在哪儿执行登录,不然会获取不到数据。。