10

Wordpress ブログの管理領域内のページを取得する必要があります。次のスクリプト:

function fetchAdminPage() {
   var url = "http://www.mydomain.invalid/wp/wp-admin/wp-login.php";
   var options = {
      "method": "post",
      "payload": {
      "log": "admin",
      "pwd": "password",
      "wp-submit": "Login",
      "redirect_to":"http://www.mydomain.invalid/wp/wp-admin/edit-comments.php",
      "testcookie": 1
      }
   };
   var response = UrlFetchApp.fetch(url, options);
   ...
}

エラーなしで実行されます。とにかく、ログインページを返しますが、取得したいresponse.getContentText()ページhttp://www.mydomain.invalid/wp/wp-admin/edit-comments.phpにアクセスできません。これを行う方法について何か考えはありますか?

4

1 に答える 1

16

Google Apps スクリプトと、リダイレクト ヘッダーを返す URL への投稿に問題がある可能性があります。

投稿でリダイレクトをたどることができないようです - ここに問題に関する議論があります -

https://issuetracker.google.com/issues/36754794

リダイレクトに従わないようにコードを変更し、Cookie をキャプチャしてから、ページに 2 番目のリクエストを行うことは可能でしょうか? 私は実際に GAS を使用したことはありませんが、ドキュメンテーションを読んだ上での最良の推測は次のとおりです。

function fetchAdminPage() {
   var url = "http://www.mydomain.invalid/wp/wp-admin/wp-login.php";
   var options = {
      "method": "post",
      "payload": {
      "log": "admin",
      "pwd": "password",
      "wp-submit": "Login",
      "testcookie": 1
      },
      "followRedirects": false
   };
   var response = UrlFetchApp.fetch(url, options);
   if ( response.getResponseCode() == 200 ) {
     // Incorrect user/pass combo
   } else if ( response.getResponseCode() == 302 ) {
     // Logged-in
     var headers = response.getAllHeaders();
     if ( typeof headers['Set-Cookie'] !== 'undefined' ) {
        // Make sure that we are working with an array of cookies
        var cookies = typeof headers['Set-Cookie'] == 'string' ? [ headers['Set-Cookie'] ] : headers['Set-Cookie'];
        for (var i = 0; i < cookies.length; i++) {
           // We only need the cookie's value - it might have path, expiry time, etc here
           cookies[i] = cookies[i].split( ';' )[0];
        };
        url = "http://www.mydomain.invalid/wp/wp-admin/edit-comments.php";
        options = {
            "method": "get",
            // Set the cookies so that we appear logged-in
            "headers": {
               "Cookie": cookies.join(';')
            }
        };
        response = UrlFetchApp.fetch(url, options);
     };
   };
   ...
}

明らかに、デバッグとエラー処理を追加する必要がありますが、それでうまくいくはずです。

ここで何が起こるかというと、最初にログイン フォームに投稿します。すべてが正しく進むと仮定すると、応答コード 302(Found) が返されるはずです。その場合は、ヘッダーを処理し、特に「Set-Cookie」ヘッダーを探します。設定されている場合、不要なものを取り除き、Cookie の値を保存します。

最後に、管理者の目的のページ (この場合は/wp/wp-admin/edit-comments.php) に対して新しい get 要求を行いますが、今回は、前の手順で取得したすべての Cookie を含む「Cookie」ヘッダーを添付します。

すべてが期待どおりに機能する場合は、管理ページを取得する必要があります:)

時間、リソース、およびリクエストを節約するために、Cookie 情報を保存することをお勧めします (ページに対して複数のリクエストを行う場合に備えて)。

繰り返しますが、実際にはコードをテストしていませんが、理論的には動作するはずです。それをテストして、あなたが見つけた発見を私に返してください.

于 2013-10-29T12:52:09.223 に答える