2016-03-23 16 views
11

Uzak bir sunucudan bir wav dosyası indirmek için PhantomJS ve HorsemanJS kullanıyorum. Ancak, dosya base64 kodlandığında ve yeni bir dosyaya yazıldığında, kullanılamaz hale getiren kaliteyi kaybeder. Ses var ama onun çarpıtılmış hali beni bir kodlama problemi olduğunu düşünmeme yol açıyor. Ubuntu 14.04 üzerinde no v5Horseman ve PhantomJS'yi kullanarak veri dosyasını kaybetmek için bir wav dosyası indirme

kullanarak çalıştırıyorum. Aşağıda benim betiğimde base64 kodlamasını geliştirmek için herhangi bir fikir var mıdır? dosya elle indirilen ve ince oynar aynı oynatıcı üzerinden oynanır Eğer

var Horseman = require('node-horseman'); 
var horseman = new Horseman({cookiesFile:'./cookiejar'}); 
var fs = require('fs'); 

horseman.on("urlChanged", function(url){ 
    console.log(url); 
}); 

horseman.on('consoleMessage', function(msg){ 
    console.log(msg); 
}); 

horseman 
    .userAgent("Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36") 
    .open('https://remoteserver.com/audo.aspx?guid=01439900-5361-4828-ad0e-945b56e9fe51') 
    .waitForNextPage() 
    .type('input[name="password"]', process.env.PASS) 
    .type('input[name="username"]', process.env.UN) 
    .click("button:contains('Login')") 
    .waitForNextPage() 
    .evaluate(function(){ 
    var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/"; 

    function base64encode(str) { 
     var out, i, len; 
     var c1, c2, c3; 

     len = str.length; 
     i = 0; 
     out = ""; 
     while(i < len) { 
     c1 = str.charCodeAt(i++) & 0xff; 
     if(i == len) 
     { 
      out += base64EncodeChars.charAt(c1 >> 2); 
      out += base64EncodeChars.charAt((c1 & 0x3) << 4); 
      out += "=="; 
      break; 
     } 
     c2 = str.charCodeAt(i++); 
     if(i == len) 
     { 
      out += base64EncodeChars.charAt(c1 >> 2); 
      out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4)); 
      out += base64EncodeChars.charAt((c2 & 0xF) << 2); 
      out += "="; 
      break; 
     } 
     c3 = str.charCodeAt(i++); 
     out += base64EncodeChars.charAt(c1 >> 2); 
     out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4)); 
     out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6)); 
     out += base64EncodeChars.charAt(c3 & 0x3F); 
     } 
     return out; 
    } 

    var url = $("a:contains('Uncompressed file')").attr("href"); 

    console.log(url); 

    var out; 
    $.ajax({ 
     'async' : false, 
     'url' : url, 
     'success' : function(data, status, xhr) { 
     console.log(status); 
     console.log(xhr.getResponseHeader('Content-Type')); 
     out = base64encode(data); 
     } 
    }); 
    return out; 
    }) 
    .then(function(out){ 
    fs.writeFile('./mydownloadedfile.txt', out, 'base64', function(){ 
     return horseman.close(); 
    }); 
    }); 

içerik türü bu süreç boyunca gittiğinde, sadece geri audio/wav

olarak gelir.

+0

Bu daha fazla bilgiye ihtiyaç duyar. Özellikle dosyayı indirip kaydedebilir misiniz? Yanlış zaman dizilimini çeken bir kodek gibi görünüyor, ancak örnek bir wav dosyasına ihtiyaç var. –

+0

Daha az kod içeren bir dosyayı PhantomJS yerine CasperJS ile indirebilir ve temel çözümü base64 üzerinden kullanmanız gerekmeyecektir. – st2erw2od

+0

@ st2erw2od CasperJS'ye bakacağım ama orijinal olarak incelediğimde bağımsız bir dosyaya sahip olsaydım, bu yüzden dosya ile ilgili bir şey yapamadım (S3 üzerinde sakla) – thegogz

cevap

1

Eğer çevreyi kontrol edip base64 kodlama ve kod çözme için, NodeJS içinde Tampon veya btoa()/atob() tarayıcıda kullanmayın Nedeni: komut

function base64Encode(plainData) { 
    if(isNode) { 
     return new Buffer(plainData).toString('base64'); 
    }else { 
     return window.btoa(plainData); 
    } 
} 

function base64Decode(encodedData) { 
    if(isNode) { 
     return new Buffer(encodedData, 'base64').toString(); 
    }else { 
     return window.atob(encodedData); 
    } 
} 

:

var out; 
$.ajax({ 
    'async' : false, 
    'url' : url, 
    'success' : function(data, status, xhr) { 
    console.log(status); 
    console.log(xhr.getResponseHeader('Content-Type')); 
    out = base64Encode(data); 
    } 
}); 
return out; 
})... 
+0

Tampon NodeJS sadece bu yüzden olamaz tarayıcıya, base64 kodlaması yaptığım ve sorunun nerede olduğu betiğine enjekte edildi. – thegogz

+0

Evet, çünkü soruda şöyle dediniz: "Ubuntu 14.04'te node v5 kullanarak koşuyorum" ve nodejs tabanlı bir çözüme ihtiyacınız olduğunu varsaydım. Tarayıcıdaki düğüm ve atob()/btoa() gibi ortamlarda (düğüm | tarayıcı) ve uygun yöntemlerin çalıştırılması hakkında ne yapılabilir? Cevabımı güncelledi. –

İlgili konular