process on 自動注冊實操 (一)


本文涉及到的技術知識有:

  • 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 又作妖了。

社會逼着我們成長!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM