2015-10-03 18 views
7

Gần đây tôi đang cố gắng để loại bỏ thông tin từ một trang web (kicktipp) bằng cách sử dụng Nodejs, request module và cổ vũ. Vì trang web này yêu cầu xác thực để xem hầu hết các trang web, tôi đã cố gắng đăng nhập qua yêu cầu đăng và kiểm tra xem người dùng có đăng nhập bằng mã sau không (tôi đã thay thế bằng thông tin xác thực nhưng tôi sử dụng dữ liệu thực trong tập lệnh thực tế của mình):Nodejs trang web cạo với cookie xác thực

var request = require('request'); 
var jar = request.jar(); 
var request = request.defaults({ 
    jar: jar, 
    followAllRedirects: true 
}); 
var jar = request.jar(); 
var cheerio = require('cheerio'); 

request.post({ 
    url: 'http://www.kicktipp.de/info/profil/loginaction', 
    headers: { 'content-type': 'application/x-www-form-urlencoded' }, 
    method: 'post', 
    jar: jar, 
    body: '[email protected]&passwort=1234567890&_charset_=UTF-8&submitbutton=Anmelden' 
}, function(err, res, body){ 
    if(err) { 
    return console.error(err); 
    }; 

    request.get({ 
    url: 'http://www.kicktipp.de/', 
    method: 'get', 
    jar: jar 
    }, function(err, res, body) { 
    if(err) { 
     return console.error(err); 
    }; 

    var $ = cheerio.load(body); 
    var text = $('.dropdownbox > li > a').text(); 
    console.log(text); 
    var error = $('#kicktipp-content > div.messagebox.errors > p').text(); 
    console.log(error); 
    var cookies = jar.getCookies('http://www.kicktipp.de/'); 
    console.log(cookies); 
    }); 
}); 

các thông số gửi bởi html-form (như kiểm tra với trình duyệt) nhìn như thế này:

k[email protected]&passwort=1234567890&_charset_=UTF-8&submitbutton=Anmelden 

với kịch bản đó, tôi cookie jar trông như thế này:

[ Cookie="JSESSIONID=F650D7F5CD6AF4F6B0944B2190EE2D29.kt213; Path=/; hostOnly=true; aAge=1ms; cAge=179ms" ] 

JSESSIONID được lưu thành công nhưng máy chủ sẽ không được đăng nhập từ console.log(text) in Login nhưng cần in Logout nếu người dùng đăng nhập đúng cách.

Sau khi kiểm tra tình hình yêu cầu đăng nhập bằng trình duyệt Tôi nhận ra rằng trình duyệt nhận được một cookie mới mọi trang trên tên miền này được yêu cầu qua set-cookie trong tiêu đề phản ứng như thế này:

Set-Cookie: login=bS5zcGxpZXRob2V2ZXJAZ21haWwuY29tOjE0NzU0MDA3MjAxMjA6Mzg1NTI4OGY3ODgzN2FkMzllNTA0NWNkY2ZjMjBjZGM; Domain=.kicktipp.de; Expires=Sun, 02-Oct-2016 09:32:00 GMT; Path=/; HttpOnly 

Tuy nhiên tôi không có thể (hoặc chỉ không biết làm thế nào) để có được cookie này vào jar yêu cầu của tôi và do đó truy cập trang như một người dùng đã đăng nhập.

Có bất kỳ điều gì tôi thiếu ở đây để duy trì trạng thái đăng nhập (hoặc đăng nhập vào trang)? Cảm ơn trước.

Trả lời

4

Vấn đề là trang này dường như cần cookie cụ thể mà bạn nhận được trong lần truy cập trang đầu tiên của mình (trong trường hợp này có vẻ như cookie múi giờ). Để có được cookie này, bạn chỉ cần truy cập trang (sử dụng yêu cầu GET) trước khi gửi yêu cầu đăng nhập (POST) tới máy chủ. Trong trường hợp này, việc này dễ dàng như việc gửi một yêu cầu GET khác xung quanh mã ở trên:

var loginLink = 'http://www.kicktipp.de/info/profil/login'; 

// creating a clean jar 
var j = request.jar(); 

request.get({url: loginLink, jar: j}, function(err, httpResponse, html) { 
    // place POST request and rest of the code here 
}); 
Các vấn đề liên quan