LINUX.ORG.RU

Аналог php/curl в nodejs

 , , , ,


0

1

Решили переписать скрипт для парсинга данных с веб страницы с php/curl на nodejs. Т.к. в nodejs огромное количество модулей и глаза разбегаются посоветуйте что лучше выбрать. Надо посылать GET, POST, XHR запросы и хотелось бы что бы cookie автоматически устанавливались/отсылались, например что то вроде

var httplib = require("httplib");
var client = httplib.createClient();

client.post("http://domain.com/login", {username: 'username', password: 'password'});
if (client.cookies['loggedIn'] != 1) {
  console.log("Login error");
} else {
  // Cookies set by http://domain.com/login page are saved within client
  // and will be sent automatcially with following request
  var html = client.get("http://domain.com/data_for_logged_in_users");
  // .... parse html here to extract data for logged in users ....
}


Последнее исправление: cetjs2 (всего исправлений: 1)

это все стандартными модулями реализуется строк в 50.

А про XHR че то не понятно, это зачем еще? Он отсылает все те же get/post запросы, это класс, часть браузерного API, че ты плетешь вообще?

filequest
()
Ответ на: комментарий от anonymous

Да я не хочу никакой синхронщины, просто так написал пример. Ну пусть будет так:

client.post("http://domain.com/login.php", {username: 'username', password: 'password'}, function (result) { // ...... });

iluha16
() автор топика
Ответ на: комментарий от filequest

По каким конкретно стандартным модулям? По поводу XHR я не знаю как правильно сказать но что бы можно было этот запрос делать так же как его делает браузер, в php/curl долго не мог догадаться как.

  public function xhr($url, $data = '') {
    curl_setopt($this->ch, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($this->ch, CURLOPT_URL, $url);
    curl_setopt($this->ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($this->ch, CURLOPT_HTTPHEADER, [
      'Content-Type: text/plain',
      'Content-Length: '.strlen($data),
    ]);

    $ret = curl_exec($this->ch);

    curl_setopt($this->ch, CURLOPT_HTTPHEADER, []);

    return $ret;
  }
iluha16
() автор топика
Ответ на: комментарий от Deleted

Какие преимущества в вашем Go, я с ним никогда вообще дела не имел только слухи о нём что модная фигня и всё такое.

iluha16
() автор топика
Ответ на: комментарий от iluha16

модуль http, там есть есть request. XHR обычный запрос, я тебе сказал, разница там только в заголовках

filequest
()
Ответ на: комментарий от filequest

Так и хотел вобщем, но решил уточнить что бы не городить велосипед в случае если есть ещё что.

iluha16
() автор топика
Ответ на: комментарий от anonymous

А вроде бы неплохая вещь это Go, я ошибочно думал что это какая то надстройка над джавой но это я путал с чем то другим. Надо будет как нибудь познакомиться поближе с Go.

iluha16
() автор топика

Вот что наколхозил. Для нужд программы этого модуля хватает. Критика приветствуется.

var request = require("request");

function Browser() {
	this.userAgent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36";
	this.cookies = {};
}
Browser.prototype.cookieStr = function () {
	var cookieStr = [];
	for (var cookie_name in this.cookies) {
		var cookie_val = this.cookies[cookie_name];
		cookieStr.push(cookie_name + '=' + cookie_val);
	}
	return cookieStr.join("; ");
};
Browser.prototype.processResponse = function (error, response, body) {
	var self = this;
	self.lastResponse = response;
	
	var set_cookie = response.headers['set-cookie'];
	if (Array.isArray(set_cookie)) {
		for (var i = 0; i < set_cookie.length; i++) {
			var cookie = set_cookie[i];
			cookie = cookie.split(";")[0];
			var cookie_name = cookie.split("=", 2)[0];
			var cookie_value = cookie.split("=", 2)[1];
			
			self.cookies[cookie_name] = cookie_value;
		}
	}
};
Browser.prototype.get = function (url, callback) {
	var self = this;
	
	request({
		url: url,
		headers: {
			"User-Agent": self.userAgent,
			"Cookie": self.cookieStr(),
		}
	}, function (error, response, body) {
		self.processResponse(error, response, body);
		
		callback(error, response, body);
	});
};
Browser.prototype.mpost = function (url, body, callback) {
	var self = this;
	request({
		method: 'POST',
		url: url,
		headers: {
			"User-Agent": self.userAgent,
			"Cookie": self.cookieStr(),
		},
		multipart: [
			{
				"content-type": "text/plain",
				body: body,
			}
		]
	}, function (error, response, body) {
		self.processResponse(error, response, body);
		
		callback(error, response, body);
	});
};
Browser.prototype.post = function (url, pars, callback) {
	var self = this;
	request({
		method: 'POST',
		url: url,
		headers: {
			"User-Agent": self.userAgent,
			"Cookie": self.cookieStr(),
		},
		form: pars,
	}, function (error, response, body) {
		self.processResponse(error, response, body);
		
		callback(error, response, body);
	});
}

exports.Browser = Browser;
iluha16
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.