使用Blogger API获取的帖子数限制(错误400)

时间:2013-06-19 06:25:09

标签: html rest google-api blogger

我正在尝试使用Blogger API从博客中获取所有帖子。由于某些未知原因,要获取的最大帖子数量似乎限制为20个。

如果我试试这个网址:

https://www.googleapis.com/blogger/v3/blogs/3089072491354463482/posts?maxResults=20&fields=items(title)&key=AIzaSyAJO5J-pRCaGOIeRLIJfvAPwxpMLKvwebU

我得到以下回复(按预期列出最后20个帖子标题):

{
"items": [
  {
   "title": "El Caballero"
  },
  {
   "title": "Une traversée de frontière… étonnante!"
  },
  {
   "title": "Hasta luego querida Argentina!"
  },
  {
   "title": "Dernier jour en Argentine"
  },
  {
   "title": "Humahuaca"
  },
  {
   "title": "Purmamarca"
  },
  {
   "title": "Tilcara"
  },
  {
   "title": "Premières grèves"
  },
  {
   "title": "Le Nord Argentin: Salta"
  },
  {
   "title": "Ca en fait de l'eau tout ça..."
  },
  {
   "title": "Un peu de pluie au Brésil"
  },
  {
   "title": "Iguazu"
  },
  {
   "title": "San José"
  },
  {
   "title": "Adieu à Buenos Aires"
  },
  {
   "title": "Traversons en Uruguay"
  },
  {
   "title": "Retour à Buenos Aires"
  },
  {
   "title": "Fin de l'aventure Patagonienne"
  },
  {
   "title": "Les fameuses tours nous surprennent"
  },
  {
   "title": "Un peu de pluie pour se changer les idées"
  },
  {
   "title": "Valle Francés"
  }
 ]
}

但是,如果我增加maxResults参数,

https://www.googleapis.com/blogger/v3/blogs/3089072491354463482/posts?maxResults=21&fields=items(title)&key=AIzaSyAJO5J-pRCaGOIeRLIJfvAPwxpMLKvwebU

我收到以下错误:

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "invalid",
    "message": "Invalid Value"
   }
  ],
  "code": 400,
  "message": "Invalid Value"
 }
}

如何增加我可以获取的最大帖子数限制?

谢谢,

尼古拉斯

2 个答案:

答案 0 :(得分:6)

我认为API仅限于将20个结果作为最大值。

因此,为了获取超过20个结果,您必须使用Bloggers参考API中指定的pageToken参数。

您的第一个请求应包含nextPageToken,以便您在回复中获得该请求。比使用此令牌来检索下一页等等。

您的第一个请求必须是这样的:

https://www.googleapis.com/blogger/v3/blogs/3089072491354463482/posts?maxResults=20&fields=items%28title%29%2CnextPageToken&key=AIzaSyAJO5J-pRCaGOIeRLIJfvAPwxpMLKvwebU

以下是预期结果:

{
 "nextPageToken": "CgkIChignPaz5ycQ-rn0pIfipe8q",
 "items": [
  {
   "title": "El Caballero"
  },
  {
   "title": "Une traversée de frontière… étonnante!"
  },
  {
   "title": "Hasta luego querida Argentina!"
  },
  {
   "title": "Dernier jour en Argentine"
  },
  {
   "title": "Humahuaca"
  },
  {
   "title": "Purmamarca"
  },
  {
   "title": "Tilcara"
  },
  {
   "title": "Premières grèves"
  },
  {
   "title": "Le Nord Argentin: Salta"
  },
  {
   "title": "Ca en fait de l'eau tout ça..."
  }
 ]
}

现在你要做的就是在结果中选择"nextPageToken": "CgkIChignPaz5ycQ-rn0pIfipe8q"并将其包含在下一个请求中:

https://www.googleapis.com/blogger/v3/blogs/3089072491354463482/posts?%20maxResults=20&pageToken=CgkIChignPaz5ycQ-rn0pIfipe8q&fields=items%28title%29%2CnextPageToken&key=AIzaSyAJO5J-pRCaGOIeRLIJfvAPwxpMLKvwebU

除了在下一个请求中使用的新``nextPageToken`之外,结果应显示接下来的20个帖子。

答案 1 :(得分:2)

我实施了Walid Laribi建议的旅游博客页面,该页面从博客中检索所有帖子的位置并绘制旅行期间的路径(blog)。

要获取所有帖子的位置,我首先会找到一个脚本来检索前10个帖子并给我nextPageToken

<script src="https://www.googleapis.com/blogger/v3/blogs/3089072491354463482/posts?fields=nextPageToken,items(title,location(name,lat,lng),url,published)&key=AIzaSyAJO5J-pRCaGOIeRLIJfvAPwxpMLKvwebU&callback=handleResponse">

在上一个脚本的回调中,我们可以获取每个帖子的位置,以及创建和执行脚本以获取下一个帖子:

// Get latitude/longitude from Blogger
function handleResponse(response) {
 for(i=0; i< response.items.length; i++){
  if(response.items[i].location != undefined){
   Lat.push(response.items[i].location.lat);
   Lng.push(response.items[i].location.lng);
   // etc.
  }
 }

 if(response.nextPageToken != undefined){
  var srctxt = 'https://www.googleapis.com/blogger/v3/blogs/3089072491354463482/posts?fields=nextPageToken,items(title,location(name,lat,lng),url,published)&key=AIzaSyAJO5J-pRCaGOIeRLIJfvAPwxpMLKvwebU&callback=handleResponse&pageToken=' + response.nextPageToken;

  // Execute the new script
  var head = document.getElementsByTagName('head')[0];
  var scriptElement = document.createElement('script');
  scriptElement.setAttribute('type', 'text/javascript');
  scriptElement.setAttribute('src', srctxt);
  head.appendChild(scriptElement);
  head.removeChild(scriptElement);
 }
}