如何使用谷歌应用程序脚本获取wordpress管理页面

时间:2013-10-24 13:18:46

标签: wordpress authentication google-apps-script urlfetch

我需要在我的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。 关于如何做到这一点的任何想法?

1 个答案:

答案 0 :(得分:11)

Google Apps脚本可能存在问题,并且会发布到一个可以返回重定向标头的网址。

似乎可能无法通过帖子关注重定向 - 这里有关于该问题的讨论 - https://code.google.com/p/google-apps-script-issues/issues/detail?id=1254#c3

如果您修改代码不遵循重定向,捕获cookie然后再向您的页面发送第二个请求,是否可能?我还没有真正使用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(找到)的响应代码。如果是这种情况,我们将处理标题并专门查看&#34; Set-Cookie&#34;头。如果设置了,我们将摆脱不需要的东西并存储cookie值。

最后,我们向管理员所需的页面发出了一个新的get请求(在本例中为/wp/wp-admin/edit-comments.php),但这次我们附加了&#34; Cookie&#34;标题包含上一步中获取的所有cookie。

如果一切按预期工作,您应该获得管理页面:)

我建议存储Cookie信息(如果您要向网页发出多个请求),以节省时间,资源和请求。

再一次 - 我还没有真正测试过代码,但理论上它应该可行。请测试它并回复我的任何调查结果。