PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : (JavaScript) - [nodeJS] requestjs in Schleife



darkness
02.10.2017, 16:42
Hey,

ich versuche seit zwei Tagen irgendwie mein kleines Nodejs Programm zum laufen zu bekommen.

Ziel ist mit Hilfe von youtube-dl (Python) einer Menge Proxies und requests JS erstmal 1000 "Videos" von Streamcloud zu saugen.

Meine Applikation beginnt mit dem Import der benötigten Libs


var fs = require('fs');
fs.debug = true;
const request = require('request');
request.debug = true;
var glob = require("glob");
//const { spawn } = require('child_process');
var spawn = require('child_process').spawnSync;
const url = require('url');
var getSlug = require('speakingurl');
var path = require('path');
var async = require("async");

gefolgt vom laden der proxies aus einer text datei


var proxies = [];
var proxyList = fs.readFileSync('proxies.txt', 'utf8');
proxyList.split(/\r?\n/).forEach(function(proxy){

let $proxy = {};

$proxy = proxy.replace('name', 'SuperVIP*****');
$proxy = $proxy.replace('pass', 'Df****');

proxies.push($proxy);

});


Es folgt eine einfache Funktion die mir einen Proxie zurückgibt


function proxy(){
return proxies.shift();
}

Es folgt die Funktion download die den direkt download link ermittelt und den download durchführt


function download(link, savepath){

$proxy = proxy();
var child = spawn('youtube-dl' , ['-g', "--proxy", $proxy, link]);

console.log('stdout here: \n' + child.stdout);
console.log('stderr here: \n' + child.stderr);

$output = child.stdout.toString().replace(/\s/g, '');

if(url.parse($output)){
//request.defaults({'proxy': $proxy});

let r = request({
'url': $output,
'proxy': $proxy,
'rejectUnauthorized': false
});

r.on('error', function(err) {
console.log(err)
})

r.on('response', function (res) {
console.log(savepath+path.extname($output));
res.pipe(fs.createWriteStream(savepath+path.extnam e($output),{flags: 'w+'}));
});
r.end();

/*
var file = fs.createWriteStream(savepath+path.extname($output ), {flags:'w+',mode: 0666});
file.on('error', function(err){
console.log(err);
});
request
.get($output)
.on('error', function(err) {
console.log(err)
})
.on('data', function(chunk){
file.write(chunk);
})
.on('end', function(){
file.close();
})
.end();
*/
return savepath+path.extname($output);

}


}

Diese Funktion funktionierte (in irgend einer Version) mal, aber nur wenn man den Download einzeln durchführte.

Ich hatte es irgendwann am Tag mal so probiert


glob("input/*.json", function(err, files) {
if(err) {
console.log("cannot read the folder, something goes wrong with glob", err);
}
files.forEach(function(file){

var entity = JSON.parse(fs.readFileSync(file, 'utf8'));
entity.paths = [];

if(entity.links['streamcloud.eu'].length == 1){

$savepath = path.resolve(__dirname, 'storage/'+getSlug(entity.title, {lang: 'de'}));

$path = download(entity.links['streamcloud.eu'][0], $savepath);
entity.paths.push($path);

}
fs.writeFileSync(file.replace('input', 'output'), JSON.stringify(entity), 'utf8');

});

});


Jetzt bin ich soweit das mir bekannt ist das requestjs in einer Schleife nicht funktioniert. Irgendwas mit Sockets oder so.

Gut gibt ja async.js


var q = [];
glob("input/*.json", function(err, files) {
if(err) {
console.log("cannot read the folder, something goes wrong with glob", err);
}
files.forEach(function(file){

var entity = JSON.parse(fs.readFileSync(file, 'utf8'));
entity.paths = [];
entity.path = file;
entity.download = {path: ''};

if(entity.links['streamcloud.eu'].length == 1){

entity.download.path = path.resolve(__dirname, 'storage/'+getSlug(entity.title, {lang: 'de'})+'.mp4');
//console.log(entity.download.path);
entity.url = entity.links['streamcloud.eu'][0];
//$path = download(entity.links['streamcloud.eu'][0], $savepath);
//entity.paths.push($path);
fs.writeFileSync(file.replace('input', 'output'), JSON.stringify(entity), 'utf8');
q.push(requestApi(entity));

}

});

});


var requestApi = function(data, next){
console.log('job triggered');

$proxy = proxy();
var child = spawn('youtube-dl' , ['-g', "--proxy", $proxy, data.url]);

console.log('stdout here: \n' + child.stdout);
console.log('stderr here: \n' + child.stderr);

$output = child.stdout.toString().replace(/\s/g, '');

if(!url.parse($output)){
next();
}

request.defaults({'proxy': $proxy});
var file = fs.createWriteStream(data.download.path, {flags:'w+',mode: 0666});
request
.get($output)
.on('error', function(err) {
console.log(err);
next(err);
})
.on('data', function(chunk){
file.writeSync(chunk);
})
.on('end', function(){
file.close();
next();
})
.end();

};


async.series(q, function(err, data){
console.log(err);
});


Der Part DDL ermitteln funktioniert


stderr here:

REQUEST { uri: 'http://stor8.streamcloud.eu:8080/5hv75o2easoax3ptxzjijq77vum52hf
wnab4mmoq6rbxvjtmwc3a4g36r4/video.mp4',
method: 'GET',
callback: undefined }
REQUEST make request http://stor8.streamcloud.eu:8080/5hv75o2easoax3ptxzjijq77vu
m52hfwnab4mmoq6rbxvjtmwc3a4g36r4/video.mp4
job triggered
^C
C:\src\downloader>

Request wird auch gefeuert aber es wird nicht geladen.

Hat jemand irgendwie Vorschläge.

Ziel. Den Downloader zum laufen bekommen.

Btw. Wieso kann man bei streamcloud nicht einfach fremdlinks importieren wie bei openload?

EVXN
02.10.2017, 17:46
Btw. Wieso kann man bei streamcloud nicht einfach fremdlinks importieren wie bei openload?
Marcel spielt mit Openload in einer anderen Liga, da kommt so ein Hoster wie Streamcloud nie wieder ran.

Zu deinem Problem, du bist dir sicher dass der Download immer mit der gleichen Proxy-IP gestartet wird (kann aus den Codefetzen aktuell nichts brauchbares schließen)
Lass doch mal youtube-dl debuggen und dir den Log anzeigen (wenn das irgendwie geht), obwohl man dafür glaube ich kein youtube-dl braucht, es sollte normales GET reichen.

darkness
02.10.2017, 23:03
Ich nutze für youtube-dl und requestjs immer den gleichen proxy. Der Download funktioniert auch wenn er einzeln ausgeführt wird.

"Marcel spielt mit Openload in einer anderen Liga, da kommt so ein Hoster wie Streamcloud nie wieder ran.
"

Und nen import von files aus dem eigenen system ist hexenwerk? Das hat ja selbst jedes relativ gutes filehosting script von der stange