2017-08-21 9 views
0

こんにちは、NodeJSの学習を始めようとしています。アプリケーションの作成途中です。現在のところ、ノードを介してWebサイトを呼び出し、認証トークンを取得し、ログイン情報と認証トークンを含むPOSTペイロードでもう一度そのWebサイトを呼び出します。 私はPythonを使用して同じプログラムを作成しました。私はnodeJSのどこに302という応答を得ます。ノードJSと外部Web呼び出しを正常に行う?

私は素早い解決策であると信じています。問題の主な原因はNodeJSここでは: 1.私は、これらの要求が同じ 'セッション'の一部であると考えられているので、これらの呼び出しを互いに入れ子にすることになっています。 2.もしそうなら、例の最後のURLに移動します。私がexample.com/pollのブラウザを使ってurlに行くと、ブラウザは自動的にそれが含んでいるファイルをJSON形式でダウンロードしていないので、その情報を保存/変更することができます(これはちょうどjsonです)。表示するだけです。これは私が必要なものです。私はこれを行うPythonでそれを

をダウンロードする文字列またはなどにそのデータを保存することができず、いずれかのように、ノードJSで、その後

url = "https://example.com/" 
session = requests.session() 
first_req = session.get(url) 
auth_token_str = re.search(XXX, first_req.text) 
login_url = 'https://example.com/sessions' 
payload = { 'session[username_or_email]' : 'username', 'session[password]' : 'password', 'redirect_after_login':'/', 'authenticity_token': authenticity_token } 
login_req = session.post(login_url, data=payload, headers=user_agent) 
print "login_req response: ", login_req.status_code //gets me 200 

を(2つの呼び出しを行うよりも、セッションを作成します):

var initLoad = { 
method: 'GET', 
url: 'https://example.com/', 
headers: { 
    'User-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36' 
    } 
}; 
request(initLoad, function(error, response, body) { 
    if (error) throw new Error(error); 
    var $ = cheerio.load(body, {xmlMode: false}); 
    var authenticityToken = $("input[name=authenticity_token]").val(); 
    console.log(authenticityToken); 
    var options = { 
    method: 'POST', 
    url: 'https://example.com/sessions', 
    headers: response.headers, 
    form: { 
     'session[username_or_email]': 'someUsername', 
     'session[password]': 'somePassword', 
     redirect_after_login: '/', 
     authenticity_token: authenticityToken 
    } 
    }; 
    request(options, function(error, response2, body2) { 
    if (error) throw new Error(error); 
    console.log(response2.statusCode); //gets me 302 not 200 
    var analytics_url = 'https://example.com/poll'; 
    var tripleload = { 
     method: 'GET', 
     url: analytics_url, 
     headers: response2.headers 
    }; 
    request(tripleload, function(error, response3, body3) { 
     if (error) throw new Error(error); 
     res.end(body3); 
    }); 
    }); 
}); 
+0

おそらく 'jar'を指定する必要があると思いますが、' request'ドキュメントの6番目のセクションを見てください(https://github.com/request/request#requestoptions-callback) –

+0

リクエストのようですモジュールは非Getメソッドのリダイレクトに従いません(デフォルト)。あなたはPOSTをしているので、私はオプションを 'followAllRedirects:true'を追加しようとする前に、あなたは302を取得しているPOSTを呼び出します。私はあなたがリダイレクトされている場所を参照してくださいしようとする別のものは、POSTのURLを試してください –

+0

投稿を呼び出す前にfollowAllRedirectsを自分のオプションに追加しようとしましたが、解決できませんでした。面白いことに、本文に「あなたはexample.com/login/error?username_or_email=username&redirect_afteR_login=/にリダイレクトされています。何らかの理由でNodeJSを介して送信すると情報が機能しませんが、私を混乱させているPythonの全く同じこと@AndrewLohr – Sarkis

答えて

0

302は、一時的にあなた(または、この場合には、サーバーに提供)に表示されているため、エラーページを取得し、リダイレクトを動かすこと。あなたが間違っているというこの呼び出しでは何かがあります。このように生成された場合、urlは間違っているかもしれません。

ノード内の初心者であり、ベアボーンであり、このようなことを書いても少しでも快適さを提供するリクエストを使用しているため、コードが乱雑です。

Axios:https://github.com/mzabriskie/axiosのようなものを使用すると、このような要求を簡単に書くことができます。

関連する問題