HTTPS介绍:
HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议 它是一个安全通信通道,它基于HTTP开发,用于在客户计算机和服务器之间交换信息。它使用安全套接字层(SSL)进行信息交换,简单来说它是HTTP的安全版。 它是由Netscape开发并内置于其浏览器中,使用SSL在发送方把原始数据进行加密,然后在接受方进行解密保证数据的安全性.然而,加密和解密过程需要耗费系统大量的开销,严重降低机器的性能.
HTTPS实际上就是SSL over HTTP,它使用默认端口443,而不是像HTTP那样使用端口80来和TCP/IP进行通信。HTTPS协议使用SSL在发送方把原始数据进行加密,然 后在接受方进行解密,加密和解密需要发送方和接受方通过交换共知的密钥来实现,因此,所传送的数据不容易被网络黑客截获和解密.然而,加密和解密过程需要耗费系统大量的开销,严重降低机器的性能,相关测试数据表明使用HTTPS协议传输数据的工作效率只有使用HTTP协议传输的十分之一。
如何实现加密:(其实就是sssl的交互过程)
HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据。具体是如何进行加密,解密,验证的
参考:
http://blog.csdn.net/binyao02123202/article/details/8049446
http://www.codeceo.com/article/why-http-better-than-https.html
标站点:
aHR0cHMlM0EvL2subS5hdXRvaG9tZS5jb20uY24vZGV0YWlsL3NoYXJlXzAxZG1xeThmYTE2OHZrYWU5aDYwdmcwMDAwLmh0bWw=
该地址经过base64加密,可以通过如下地址进行解密:
https://base64.supfree.net
准备工具:
chome浏览器,python3.7语言环境,pycharm,百度字体编辑器:http://fontstore.baidu.com/static/editor/index.html
破解方法:
1、打开chrome浏览器,在浏览器地址栏中输入目标地址,打开网页后,在页面中点击鼠标右键,选择检查,可以看到相关文字已被加密。
文字被加密
2、可以通过复制,来验证文字是否被加密。如复制:
老朋友的推荐
复制出的文字为:
老朋友?推荐
3、此类现象为文字被CSS样式加密,破解步骤如下:
1、通过浏览器开发者模式,找到页面中文字所使用的css样式 2、通过抓包等方法找到加载的css文件,通过正则表达式取出字体文件URL 3、通过百度字体编辑器解析woff文件:http://fontstore.baidu.com/static/editor/index.html 4、使用fontTools处理字体文件,得出对应关系 5、通过对应关系解析加密字体
4、首先使用python的request模块请求该页面,通过正则表达式获取字体文件URL,请求该URL,获取到字体文件,写入到本地。
5、通过百度字体编辑器,解析ttf文件
6、通过百度字体编辑器,可以看到,"的"对应的字体编码为"$EC2A",接下来通过python下的fontTools模块读取该TTF文件,并建立文字对应关系,保存为字典。
7、通过for循环遍历该文字对应关系字典,对原网页返回进行替换,即可得到正常数据。
老朋友的推荐,去看了一几个牌子,头都看晕了,没有结果,决定不了买哪个牌子,九了女儿意见,准备在荣威里面选盘款。性价上最高的就是I5了,看中这款的原因,并不是因为配置高,也不是养力强,而是囊中羞涩,预算控有那么电啊?,而荣威这个品牌过硬,质量可靠,故障率低,朋友买了都说挺一的。暂时没有,还是觉外有点说不过去啊!买车看车子做这个决定,是和女儿共同商量决定的,我看中的是这个牌子的知名度,品质这些方面,女儿的话是喜欢这款车型的十观,女孩子嘛,都是十貌协会,两厢车上较炫酷,十形时尚养感,适合年轻妹子。女儿盘看就中意了。
代码参考:
https://github.com/freedom-wy/js-reverse/tree/master/autohome/koubei
欢迎交流,一起学习,一起进步。
另外,我在慕课网上主讲课程:
《Python爬虫工程师必学——App数据抓取实战》,还请各位大神多多支持。课程地址:
理, 参考python Selenium.
Rust 对应的支持库: thirtyfour.
thirtyfour 是一个用于在 Rust 中使用 WebDriver / Selenium 生态系统自动化 Web 浏览器的 crate。它还为 Chrome DevTools 协议提供了一些支持,Cypress 和 Playwright 等流行框架都使用了该协议。
它旨在成为一个 "batteries-included "的框架,用于所有与 Web 浏览器自动化相关的事物,尤其是 Web 应用程序的自动化测试
本次实验采用chrome浏览器,windows 系统下.
请先下载chrome浏览器的webdriver. 注意版本一定要跟当前chrome浏览器版本一致.
https://chromedriver.chromium.org/downloads
Step 1:
手动启动 chromedriver.exe 或者自动启动,代码如下:
将chromedriver.exe复制到当前项目目录.
let dir=current_dir().unwrap();
let exe=dir.join("chromedriver.exe");
Command::new(exe)
.spawn()
.expect("启动[chromedriver.exe]失败!");
Step2:
连接webseriver. webservier将监听在本机9515端口.
let username="test0000";
let password="test0001";
// caps 支持启动参数. 具体请参考api.
let mut caps=DesiredCapabilities::chrome();
// 连接到web driver.
let driver=WebDriver::new("http://127.0.0.1:9515", caps).await?;
/// 载入登录页面.
driver.goto("https://login.xxxx.xxxx.com/cse/#/login").await?;
/// 找到输入手机号的地方. xpath, input输入框,提示符为请输入手机号.
let elem_phone=driver.find(By::XPath("//input[@placeholder='请输入手机号']")).await?;
/// 输入账号.
elem_phone.send_keys(username).await?;
///找到密码输入框. id是login-pwd. 通过F12 查找元素去找规则.
let elem_password=driver.find(By::Id("login-pwd")).await?
/// 输入密码.
elem_password.send_keys(password).await?;
/// 找到登录按钮.
let login_btn=driver.find(By::ClassName("ui-login-from__btn")).await?;
// 点击登录按钮.
login_btn.click().await?;
通过查找html元素找到元素的匹配规则,再做操作.
API 参考文档:
https://stevepryde.github.io/thirtyfour/introduction.html
固定时间等待.
//等待3秒.
sleep(Duration::from_secs(3)).await;
查询只到某个元素出现,看以下代码,这个地方会阻塞.
// 等待,只到元素出现或者超时为止.
let login_btn=driver.find(By::ClassName("ui-login-from__btn")).first().await?;
一些对安全性要求比较高的网站比如网银会对密码输入采用专用控件. 甚至对输入的键码进行了加密,
这种情况下send_keys是不会起作用的,可行的解决方案是采用驱动级的虚拟键盘,模拟键盘操作.来实现功能.
本文采用DD虚拟键盘来实现.
通过rust ffi接口,调用DD虚拟键盘的DLL.
DD虚拟键盘项目地址:
https://github.com/ddxoft/master
封装示例代码如下.
/// DD 虚拟键盘.
fn load_dd_virtual_kb()->Result<Library, Box<dyn std::error::Error>> {
unsafe {
let lib=libloading::Library::new("dd40605x64.dll")?;
return Ok(lib) ;
}
}
fn dd_btn(lib:&Library, btn: i32) -> Result<(), Box<dyn std::error::Error>>{
unsafe {
let func: libloading::Symbol<unsafe extern fn(i32)>=lib.get(b"DD_btn")?;
func(btn);
Ok(())
}
}
// 注意,rust 字符串与c str的内存布局和结束符是不同的.
fn dd_press_key(lib:&Library, key:&str) -> Result<(), Box<dyn std::error::Error>> {
unsafe {
let v=CString::new(key).unwrap();
let func: libloading::Symbol<unsafe extern fn(*const c_char)>=lib.get(b"DD_str")?;
// info!("Press Key:{}", key);
let c_pr: *const c_char=v.as_ptr();
func(c_pr);
Ok(())
}
}
// 慢慢按 1秒1个
async fn dd_press_key_slow(lib:&Library, keys:&str) -> Result<(), Box<dyn std::error::Error>> {
for c in keys.chars() {
let r=dd_press_key(&lib, format!("{}", c).as_str())?;
sleep(Duration::from_millis(1000)).await;
}
Ok(())
}
则上面输入密码框的做法是.
*请认真填写需求信息,我们会在24小时内与您取得联系。