2015-09-26 15 views
5

पर साइन इन करने के लिए फ़ैंटॉमजेएस कोड का समस्या निवारण मैंने Instagram में साइन इन स्वचालित करने के लिए इस PhantomJS स्क्रिप्ट को लिखा है। यह फॉर्म फ़ील्ड को सफलतापूर्वक भर सकता है और सबमिट बटन दबा सकता है, लेकिन यह हमेशा निम्न संदेश के साथ लॉगऑन स्क्रीन पर रीडायरेक्ट हो जाता है:Instagram

आपका उपयोगकर्ता नाम या पासवर्ड गलत था।

मैं 100% सकारात्मक हूं कि प्रमाण-पत्र सही हैं, और मैंने इसे एकाधिक Instagram खातों के साथ करने की कोशिश की।

मैं टर्मिनल से किसी Mac स्क्रिप्ट चल रहा हूँ:

$ phantomjs --ssl-protocol=any --cookies-file=cookies.txt script.js username password 

नोट --ssl-protocol=any विकल्प। इसके बिना PhantomJS HTTPS की वजह से लॉगिन पृष्ठ भी नहीं खोल सकता है। this question देखें।

यहां कोड है। मैंने इसे this tutorial पर आधारित किया, और Instagram के लॉगिन पृष्ठ के स्रोत कोड में हुए हालिया परिवर्तनों के लिए कोड को अपडेट किया।

var system = require('system'); 
var username = system.args[1]; 
var password = system.args[2]; 
var page = require('webpage').create(); 

page.open('https://instagram.com/accounts/login/', 
    function (status) { 
     if (status === "success") { 
      page.evaluate(function (uid, pwd) { 
       var username_field = document.getElementById('lfFieldInputUsername'); 
       username_field.value = uid; 
       var password_field = document.getElementById('lfFieldInputPassword'); 
       password_field.value = pwd; 
      }, username, password); 

      var point = page.evaluate(function() { 
       var element = document.getElementsByTagName('button')[0]; 
       var rect = element.getBoundingClientRect(); 
       return { 
        x: rect.left + Math.floor(rect.width/2), 
        y: rect.top + Math.floor(rect.height/2) 
       }; 
      }); 
      page.render('before-submit.png'); 
      page.sendEvent('click', point.x, point.y); 
     } 
     setTimeout(function() { 
      var error = page.evaluate(function() { 
       var element = document.getElementById('errorAlert'); 
       var error_message = false; 
       if (element !== null) { 
        error_message = element.innerText.trim(); 
       } 
       return error_message; 
      }); 

      page.render('after-submit.png'); 
      if (!error) { 
       console.log('Login Successful: ' + page.url); 
      } else { 
       console.log('Login Failed: ' + error); 
      } 

      phantom.exit(0); 
     }, 5000); 
    } 
); 

और यहाँ क्या मैं अब तक की कोशिश की है:

  1. स्थापना कुकीज़। --cookies-file=cookies.txt कमांड लाइन विकल्प जोड़ने के अलावा, मैंने कोड में phantom.addCookie भी कोशिश की है। कोई फर्क नहीं पड़ता।
  2. स्पष्ट रूप से ऑथ हेडर भेजना। this question देखें।
  3. टाइमज़ोन बदलना। यकीन नहीं है कि यह समझ में आता है। this question देखें।

स्पष्ट रूप से फ़ैंटॉमजेएस में एसएसएल के साथ कुछ समस्याएं हैं। क्या मुझे इस उद्देश्य के लिए इसका इस्तेमाल छोड़ देना चाहिए?

उत्तर

0

मुझे लगता है कि Instagram लॉगिन के साथ समस्या ReactJs है। जब आप टेक्स्ट फ़ील्ड का मान सेट करते हैं, तो प्रतिक्रिया राज्य को नहीं बदलती है। इसका मतलब यह है कि जब आप फ़ॉर्म जमा करते हैं तो लॉगिन और पासवर्ड खाली भेजते हैं।

मैंने कोशिश नहीं की, लेकिन मुझे लगता है कि आपको कुंजीपटल ईवेंट के साथ टेक्स्ट इनपुट भरना चाहिए, क्योंकि इनपुट घटक बदलते समय आंतरिक घटक (प्रतिक्रिया) स्थिति केवल तभी बदलती है। आपके द्वारा मूल्य निर्धारित करने से change ईवेंट ट्रिगर नहीं होगा।

+1

धन्यवाद! अब पूरी तरह से काम करता है। मैंने स्क्रिप्ट में आवश्यक समायोजन किए हैं और इसे गीथब पर प्रकाशित किया है - [यहां लिंक] (https://github.com/eafreitas/autoig) – Euripedes

+0

@Euripedes आपकी मदद करने के लिए बहुत खुश हैं। मेरे लिए यह पता लगाना मुश्किल था कि प्रत्येक इनपुट परिवर्तन अलग पृष्ठ में रखा जाना चाहिए। मूल्यांकन करें। –