从 javascript 调用 Google 云打印/搜索 API

Posted

技术标签:

【中文标题】从 javascript 调用 Google 云打印/搜索 API【英文标题】:Calling Google cloud print /search API from javascript 【发布时间】:2015-07-16 15:28:04 【问题描述】:

有没有人通过 javascript 使用 Google 云打印(特别是 /search)API 取得任何成功?

我尝试了多种方法,但不断收到以下错误。

XMLHttpRequest 无法加载 https://www.google.com/cloudprint/search。请求的资源上不存在“Access-Control-Allow-Origin”标头。 Origin 'http://localhost:8080' 因此不允许访问。

代码sn-p:

    var search = new XMLHttpRequest();

    search.open('POST', 'https://www.google.com/cloudprint/search', true);
    search.withCredentials = true;          
    search.setRequestHeader("X-Cloud-Print", "Google-JS");

    search.onreadystatechange = function(response)
            console.log(response);
    ;

    search.send();

我可以使用演示表单发布:

    <form action="https://www.google.com/cloudprint/search" method="post" enctype="multipart/form-data" id="submitForm">
      <input type="submit" value="Search"/>
    </form>     

来自完全相同的网页并且成功;我花了很长时间确保这两个请求在提交的数据和标题方面看起来相同,但无济于事。我不愿意用 Java 写这个(因为试图避免涉及服务器后端),并且欢迎任何帮助。

【问题讨论】:

我在同样的问题上苦苦挣扎,我的三重检查是允许的,但仍然得到Origin is therefore not allowed access. from browser任何人知道解决方案吗? 你试过这个answer吗? 【参考方案1】:

Auth.html

<a href='<?!= getAuthURL(); ?>' target='_blank'>
<button>Authorize!</button>
</a>

授权。

  function test() 
  var html = HtmlService.createTemplateFromFile("Auth").evaluate().setSandboxMode(HtmlService.SandboxMode.NATIVE).setTitle("Test");
  SpreadsheetApp.getUi().showModalDialog(html, "Test");

function getAuthURL() 
  var options= 
    client_id : "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com", // your id
    scope : "https://www.googleapis.com/auth/cloudprint",
    redirect_uri : "https://script.google.com/macros/d/MDYeOxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/usercallback", // your uri
    state : ScriptApp.newStateToken().withMethod("getAuthResponse").createToken()
  ;
  var url = "https://accounts.google.com/o/oauth2/auth?response_type=code&access_type=offline";
  for(var i in options) 
    url += "&"+i+"="+encodeURIComponent(options[i]);
  return url;

获取 oAuth 令牌并调用 Google 云打印

function getAuthResponse(q) 
  var options = 
    method: "post",
    muteHttpExceptions: true,
    payload: 
      code: q.parameter.code,
      client_id : "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com", // your id 
      client_secret : "xxxxxxxxxxxxxxxxxxxxxxxx", // your secret
      redirect_uri: "https://script.google.com/macros/d/MDYeOxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/usercallback", // your uri
      grant_type: "authorization_code"
    
  
  var response = JSON.parse(UrlFetchApp.fetch("https://accounts.google.com/o/oauth2/token", options));
  var auth_string = response.token_type+" "+response.access_token;
  options.method = "get";
  options.payload = null;
  options.headers = Authorization: auth_string;
  response = UrlFetchApp.fetch("https://www.google.com/cloudprint/search",options);
  return ContentService.createTextOutput(response.getContentText());

【讨论】:

在我看来,您的回答显示了如何使用云打印按钮,但问题是关于搜索 API,它是一个不同的 API。

以上是关于从 javascript 调用 Google 云打印/搜索 API的主要内容,如果未能解决你的问题,请参考以下文章

是否可以从 JS 函数调用 Google Maps Javascript API 并将其显示在 ion-content 上?

页面如何从使用 Require() 的 javascript 文件中调用函数?

登录人人网(打码登录)

云打码 古诗文网

如何从 Javascript 函数中调用 PL/SQL 变量?

Python3爬虫使用云打码识别验证码