1

Google ドキュメントからファイルをダウンロードするためのプロキシに取り組んでいます。gdrive 以外のファイルタイプ (pdf、txt、jpeg) に対して Google Drive API が提供するダウンロード URL はリダイレクトであり、[1][2]を読んだので、 follow-redirects ライブラリを使用することにしました。http://localhost:3000/oauth2_download?accessToken=x&url=my_urlしたがって、x が私の GDrive access_token である場所をヒットすると、url は、たとえば、https://docs.google.com/uc?id=0B_31K_MP92hUNjljYjIyMzgtZTBmNS00MGMwLWIxNmQtYjMyNDFiYjY0MTJl&export=downloadファイルがダウンロードされるはずです。ただし、ブラウザから Google ドキュメントのサインイン ページが表示されます ( https://docs.google.com/uc?id=0B_31K_MP92hUNjljYjIyMzgtZTBmNS00MGMwLWIxNmQtYjMyNDFiYjY0MTJl&export=downloadGoogle ドキュメントにログインしている場合、ブラウザでヒットするとファイルがダウンロードされるため)、ヘッダーが正しく送信されていないことを意味します。この問題に対処するには、「follow-redirects」ライブラリをどのように使用すればよいですか? 前もって感謝します!

//var https = require('https');
var https = require('follow-redirects').https;
var app = require('express')();
var urllib = require('url');
// Downloads the file using OAuth2. Tested on Google Drive
app.get('/oauth2_download', function(req, res){
    var url = req.param('url');
    var accessToken = req.param('accessToken');
    var headers = { "Authorization": "Bearer " + accessToken }
    var searchname = urllib.parse(url).search;
    var hostname = urllib.parse(url).hostname;
    var pathname = urllib.parse(url).pathname;
    if (url && accessToken) {
        // downloading file with streaming
        var options = {
            hostname: hostname,
            port: 443,
            path: pathname + searchname,
            method: 'GET',
            headers: headers
        };
        https.request(options, function(response){
            for (var key in response.headers) {
                res.setHeader(key, response.headers[key]);
            }
            response.on('data', function(chunk) {
                res.write(chunk);
            });
            response.on('end', function() {
                res.end();
            });
            //console.log("Done downloading using OAuth2");
        }).on('error', function(e) {
            console.error(e);
        }).end();
    } else {
        res.send(404);
        res.end();
    }
});
4

0 に答える 0