2017-01-04 95 views
7

我正在嘗試使用phantom.js在Instagram網站上登錄。我的第一種做法是:Phantom.js登錄instagram頁面

document.querySelector("input[name='username']").value = "Username"; 
document.querySelector("input[name='password']").value = "Pass"; 

但是,此代碼不會更改da DOM。

我的第二個辦法:

document.getElementsByClassName("_kp5f7 _qy55y")[0].setAttribute("value", "Username"); 
document.getElementsByClassName("_kp5f7 _qy55y")[0].value = "Pass"; 

但是,當我檢查網絡數據包領域的用戶名和傳球都是空白。

Instagram的登錄頁面:https://www.instagram.com/accounts/login/

+0

有你正確設置標題和憑據?最重要的是 - 所有這些查詢選擇器在網頁的上下文中? – marmeladze

+0

你所做的是正確的,這個問題超出了所提供代碼的範圍。 – superhero

+2

您是否找到解決問題的方法?我一直面臨同樣的問題,但找不到解決方案。 –

回答

5

更新:請參閱下面的答案編輯

我真的不認爲

PhantomJS無法處理頁面

這可能是我們做得不夠好的模仿真正的瀏覽器

快速搜索「的Instagram登錄phantomjs」發現這個整潔的解決方案,工作https://github.com/awener/instagram-login-phantomjs/blob/master/phan.js

它採用模擬「實際」按鍵和點擊PhantomJS機制。

這是腳本的一個副本,以防萬一。

var page = require('webpage').create(); 
var username = "myusername"; 
var password = "password"; 
page.viewportSize = { width: 1024 , height: 600 }; 
page.settings.userAgent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36'; 

page.open('https:/instagram.com/accounts/login/', function() { 

    var ig = page.evaluate(function() { 
     function getCoords(box) { 
      return { 
       x: box.left, 
       y: box.top 
      }; 
     } 

     function getPosition(type, name) { 
      // find fields to fill 
      var input = document.getElementsByTagName(type); 
      for(var i = 0; i < input.length; i++) { 
       if(name && input[i].name == name) return getCoords(input[i].getBoundingClientRect()); 
       else if(!name && input[i].className) return getCoords(input[i].getBoundingClientRect()); // this is for login button 
      } 
     } 
     return { 
      user: getPosition('input', 'username'), 
      pass: getPosition('input', 'password'), 
      login: getPosition('button') 
     }; 

    }); 

    // fill in data and press login 
    page.sendEvent('click',ig.user.x, ig.user.y); 
    page.sendEvent('keypress', username); 

    page.sendEvent('click',ig.pass.x, ig.pass.y); 
    page.sendEvent('keypress', password); 
    page.sendEvent('click', ig.login.x, ig.login.y); 

    // wait for response 
    setTimeout(function() { 
     page.render('/path/to/screenshot.png'); 
     phantom.exit(); 
    }, 5000); 

}); 

編輯就如何在Linux

運行腳本,這並沒有在Debian/Ubuntu的工作的原因解釋是SSL證書問題。

當您使用--debug = true CLI選項運行PhantomJS時,有一個詳細的模式告訴PhantomJS正在做什麼。使用我已經找到了問題的原因:

[DEBUG] Network - SSL Error: "The issuer certificate of a locally looked up certificate could not be found" 
[DEBUG] Network - SSL Error: "The root CA certificate is not trusted for this purpose" 
[DEBUG] Network - Resource request error: QNetworkReply::NetworkError(SslHandshakeFailedError) ("SSL handshake failed") URL: "https://instagramstatic-a.akamaihd.net/h1/scripts/polyfills/es5-sham.min.js/fc3c22cf2d67.js" 
... 

爲了避免這種類型的問題,你只需要與其他CLI參數運行Phantomjs告訴它忽略SSL錯誤:

/pth/to/phantomjs --ignore-ssl-errors=true /path/to/script.js 
+0

我已經測試過,但不幸的是,腳本不能正常工作:'( –

+0

請更具體的說明它不工作的方式,我已經用PhantomJS 2.1.1在Win 7 x64上進行了測試,結果是'instagram .png'確實包含了我在Chrome登錄後看到 – Vaviloff

+0

'./phantomjs ins.js>的/ dev/stdout' - 在Debian 8(64位)不工作phantomjs'2.1.1' –