19

Web ページからテキストを取得してその文字列を処理する簡単なスクリプトを作成しようとしています。しかし、その Web サイトにはログインが必要です。その Web サイトへのログインに成功しました。これは私がログインした方法です:

var payload = {"name1":"val1","name2":val2"};

var opt ={"payload":payload,"method":"post"};

var respose = UrlFetchApp.fetch("http://website.com/login",opt);

ログイン後、ウェブサイトは私を配置しhttp://website.com/homeます。確認response.getContentText()したところ、 からのテキストが含まれているため、正常にログインできていることが確認できますhttp://website.com/home。次に、の内容を取得してhttp://website.com/page処理する必要があります。私は最初、スクリプトがそれ自体で Cookie を処理できると想定し、次の手順に進みました。

var pagedata = UrlFetchApp.fetch("http://website.com/page);//Did not work

それは明らかにpagedata.getContentText()うまくいかず、最初にログインするように言われます。これは、Cookie が正常に渡されなかったことを示しています。

次に、ログイン中にサーバーが応答した Cookie を抽出し、この要求と一緒に送信しようとしました。

var cookie = response.getAllHeaders()['Set-Cookie'];     

// variable cookie now contains  a legitimate cookie.

// It contains 'JSESSIONID=blabla;Path=/' and 
// it is the ONLY cookie that server responds.

ページリクエストでそのCookieを送信しようとしました。

var header = {'Cookie':cookie};

var opt2 = {"header":header};

var pagedata = UrlFetchApp.fetch("http://website.com/page",opt2);

コンテンツが再びログインするように言っているので、今でも Cookie が適切に送信されていないと思います。

Cookie を正しく渡していますか? リクエストで Cookie を送信する正しい方法についてサポートが必要です。

4

2 に答える 2

10

ここで Cookie の仕様を確認できます: http://www.w3.org/Protocols/rfc2109/rfc2109

コードに潜在的な問題があります。複数の「set-cookie」属性がサーバーから送り返された場合、response.getAllHeaders()['Set-Cookie'] は文字列または文字列のテーブルを返すことができます。

エリックの言う通り、消化せずにクッキーを返すことはできません。

コードの 2 番目のエラー:

var opt2 = {"header":header};

する必要があります

var opt2 = {"headers":header};

GAS は Google IP を使用することにも注意してください。2 つの連続したフェッチで異なる IP が使用される場合があります。接続先のサーバーは、セッション IP に依存している可能性があります。

サーバーは認証後に 1 つの Cookie のみを送り返しますか?

于 2012-06-05T08:37:06.597 に答える
3

UrlFetchApp.fetch() でヘッダーを正しく設定しているようです。

Set-Cookie ヘッダーのデータは、Cookie ヘッダーで期待されるデータとは異なる形式になっていると思います。たとえば、Set-Cookie には有効期限などの情報が含まれています。

于 2012-06-04T16:50:33.063 に答える