本文涉及到的技術知識有:
- selenium 自動化定位;
- html dom element 抓取;
- 基於 opencv 的缺口滑塊定位;
- 正則表達式;
偶然地閱讀到一篇關於:利用爬蟲增加 processon 免費文件數,剛好 process on 文件數要滿了,所以想實操一把。
經分析,獲知 process on 可以通過分享自己專屬鏈接給別人,別人通過這個鏈接注冊賬號后,可以獲得系統擴容3個文件。
通過擼代碼整理出了通過 selenium 自動注冊的邏輯。直接上圖:
從上面可以了解到當時 ProcessOn 的登錄注冊過程還是比較簡單的,dom元素也不復雜,全部為輸入框。驗證也是通過郵箱驗證鏈接。
當時看到這篇文章的時候,ProcessOn 的注冊已經發生了變更,驗證方式改成了騰訊驗證滑塊。驗證滑塊通過后會發送郵件到注冊郵箱。郵件的內容是驗證碼。
selenium,soup,dom,temp-mail 都是新技能。其實 python 也擼得少。搭建了個環境大概的運行了一下,在 selenium 定位 dom element 的時候頻頻報錯。
萬能的度娘(我可能不是一只合格的猿,我還是習慣度娘,沒有趁手的梯子,速度忍不了),修改代碼如下:
def open(self): """ open browser, and input register code """ self.browser.get(self.url) time.sleep(5) # press 'register' button self.browser.find_element_by_class_name('button').click() # fill 'email/phone' as user_name self.browser.find_element_by_id('login_phone').send_keys(self.email) # fill 'password' self.browser.find_element_by_id('login_password').send_keys(self.psw) # fill 'fullname/nickname' self.browser.find_element_by_id('login_fullname').send_keys(self.name) # trigger 'TencentCaptcha' button to send verify email self.browser.find_element_by_id('TencentCaptcha').click()
還算見得多,知道那個是騰訊驗證滑塊,有了關鍵字,度娘之。找到一篇:騰訊防水牆驗證碼破解。拉下來復現之,可能比較新。復現通過了。
看了下源碼,主要的技術點是通過 opencv 獲取缺口的位置,當然還有模擬人體操作。
可以將 Login 類整體接入到 ProcessOn,修改的地方比較少:
class Login(object): def __init__(self, browser): # 跟 ProcessOn 在同一個瀏覽器上 # self.url = "https://open.captcha.qq.com/online.html" self.driver = browser def login_main(self): # 去掉觸發滑塊的動作,滑塊觸發由 ProcessOn 操作 # ssl._create_default_https_context = ssl._create_unverified_context driver = self.driver # wait for the dom load otherwise can not find the element # 此處一定要睡一會等待 dom 加載完成 time.sleep(5) driver.switch_to.frame(driver.find_element_by_id('tcaptcha_iframe')) # switch 到 滑塊frame time.sleep(0.5) bk_block = driver.find_element_by_xpath('//img[@id="slideBg"]') # 大圖 web_image_width = bk_block.size web_image_width = web_image_width['width'] bk_block_x = bk_block.location['x'] ... # 此處省略若干 ... # 不要將瀏覽器關閉 # self.after_quit()
接下來是要到 temp-mail 中獲取郵件並拿到驗證碼了。
在這之前有個小插曲,當時(幾個月前?)從 temp-mail 里獲取 domain 列表是正常的。
def getdomain(): global domains if domains == []: r = requests.get("https://temp-mail.org/en/option/change/") soup = BeautifulSoup(r.text, "html.parser") domains = [tag.text for tag in soup.find(id="domain").find_all("option")] return random.choice(domains)
今天運行的時候,發現拿到的 domains 為空。經過瀏覽器 F12 查看 element 變化情況后發現,temp-mail 進行了一定的反爬策略(也不知道是不是我的網速慢^_^)。<option> 是通過腳本動態加載的。當下拿到的html還未加載。
def getdomain(): global domains if domains == []: url = "https://temp-mail.org/en/option/change/" browser = webdriver.Chrome() browser.get(url) domainsText = browser.find_element_by_id('domain').get_attribute('innerHTML') patt = re.compile(r'<option.+?>(.+?)</option>') domains = patt.findall(domainsText) browser.quit() return random.choice(domains)
當時想到的方案是等待dom加載完成之后,再通過soup進行解析抓取郵件domain列表。研究了一陣未果,遂直接使用 selenium 神器。
加載完成比較慢,但是也是一錘子買賣。
拿到email domain 之后,我們就可以隨機構造郵箱地址、用戶名和密碼了,即准備好了賬號信息。
接下來的事情就是觸發驗證碼發送,並且去對應的郵箱在抓取驗證碼。
因為之前體驗過一次 temp-mail,郵箱隨便設置,郵件隨意收,以為小作品可以閉環了,不曾想大家技術升級太快,temp-mail 又在使妖。
欲知后事如何,且聽下文分解。
PS:不曾想 process on 又作妖了。
社會逼着我們成長!