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小時內與您取得聯系。