使用 2 Legged OAUTH / OPEN ID 域帐户通过 Google GData API 批量更新电子表格

2023-12-11

好吧,周末就这样拍摄了——这是我周日晚上最后一次求助。

必须使用 2 Legged OAUTH 方法的 Google Marketplace 应用程序需要将 50K 记录写入 Google 文档电子表格。我能够创建记录、调整大小、重命名记录并将其写入电子表格。单独写入 100 行最多需要一分钟,所以我必须使用批量更新。无法进行批量更新。下面的代码是我最好的尝试 - 我不断收到“令牌无效 - 无效令牌 401”。所有示例代码均用于三足 oauth - 但我无法提示用户批准该应用程序,因为它是一个市场应用程序

如果能找到使用 openid 和 2LO 批量更新电子表格的示例就太好了

      final String SCOPE = "https://spreadsheets.google.com/feeds/spreadsheets/private/full";
        SpreadsheetService spreadsheetService;
        String consumerKey = getInitParameter("consumer_key");
        String consumerSecret = getInitParameter("consumer_secret");
        GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters();
        oauthParameters.setOAuthConsumerKey(consumerKey);
        oauthParameters.setOAuthConsumerSecret(consumerSecret);
        oauthParameters.setOAuthType(OAuthParameters.OAuthType.TWO_LEGGED_OAUTH);
        oauthParameters.setScope(SCOPE);
        OAuthSigner signer = new OAuthHmacSha1Signer();
        spreadsheetService = new SpreadsheetService("nimbits-com");
        String title = entity.getName().getValue();

        try {

            spreadsheetService.setOAuthCredentials(oauthParameters, signer);
            spreadsheetService.setProtocolVersion(SpreadsheetService.Versions.V3);
            SpreadsheetQuery query = new SpreadsheetQuery(new URL(SCOPE));
            query.addCustomParameter(new Query.CustomParameter("xoauth_requestor_id", user.getEmail().getValue()));
            query.setTitleQuery(title);
            SpreadsheetFeed feed =  spreadsheetService.query(query, SpreadsheetFeed.class);


//works fine up to this point, I get the feed and spreadsheet.

            if (feed != null && ! feed.getEntries().isEmpty()) {

                com.google.gdata.data.spreadsheet.SpreadsheetEntry wsEntry = feed.getEntries().get(0);
                WorksheetEntry sheet = wsEntry.getWorksheets().get(0);
                CellFeed batchRequest = new CellFeed();
                String batchId = "R" + 2 + "C" + 1;


                URL entryUrl = new URL(sheet.getCellFeedUrl().toString() + "/" + batchId);

//Invalid TOKEN error here, trying to get the entry. 
CellEntry batchOperation = spreadsheetService.getEntry(entryUrl, CellEntry.class);
                batchOperation.setService(spreadsheetService);
                batchOperation.changeInputValueLocal("test");
                BatchUtils.setBatchId(batchOperation, batchId);
                BatchUtils.setBatchOperationType(batchOperation, BatchOperationType.UPDATE);
                batchRequest.getEntries().add(batchOperation);


                CellFeed cellFeed = spreadsheetService.getFeed(sheet.getCellFeedUrl(), CellFeed.class);
                Link batchLink = cellFeed.getLink(Link.Rel.FEED_BATCH, Link.Type.ATOM);
                URL batchUrl = new URL(batchLink.getHref());
                spreadsheetService.batch(batchUrl, batchRequest);
            }
        } catch (MalformedURLException e) {
            LogHelper.logException(this.getClass(), e);
            throw new NimbitsException(e);

        } catch (ServiceException e) {
            LogHelper.logException(this.getClass(), e);
            throw new NimbitsException(e);
        } catch (IOException e) {
            LogHelper.logException(this.getClass(), e);
            throw new NimbitsException(e);
        } catch (OAuthException e) {
            LogHelper.logException(this.getClass(), e);
            throw new NimbitsException(e);
        }

此示例仅尝试批量写入一条记录。我已经调整了电子表格的大小,看起来也不错。我不知道如何设置令牌,或使用 2LO 完成此请求。我尝试将 xoauth_requestor_id 添加到网址中。

自从我开始赏金以来编辑:

这段代码运行完美,并通过我拥有的 2LO 身份验证向现有电子表格添加了 1 行。我需要对其进行修改以快速插入 50,000 行。

 @Override
public void addSpreadsheetHeader(Entity entity) throws NimbitsException {
    final User user = UserServiceFactory.getServerInstance().getHttpRequestUser(
            this.getThreadLocalRequest());


    SpreadsheetService spreadsheetService;
    String consumerKey = getInitParameter("consumer_key");
    String consumerSecret = getInitParameter("consumer_secret");
    GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters();
    oauthParameters.setOAuthConsumerKey(consumerKey);
    oauthParameters.setOAuthConsumerSecret(consumerSecret);
    spreadsheetService = new SpreadsheetService("nimbits-com");


    //  SpreadsheetEntry entry = new SpreadsheetEntry();
    String title = entity.getName().getValue();
    //  entry.setTitle(TextConstruct.plainText(title));



    try {
        spreadsheetService.setOAuthCredentials(oauthParameters, new OAuthHmacSha1Signer());
        SpreadsheetQuery query = new SpreadsheetQuery(new URL("https://spreadsheets.google.com/feeds/spreadsheets/private/full"));
        query.addCustomParameter(new Query.CustomParameter("xoauth_requestor_id", user.getEmail().getValue()));

        query.setTitleQuery(title);
        SpreadsheetFeed feed =  spreadsheetService.query(query, SpreadsheetFeed.class);
        if (feed != null && ! feed.getEntries().isEmpty()) {
            com.google.gdata.data.spreadsheet.SpreadsheetEntry wsEntry = feed.getEntries().get(0);
            WorksheetEntry sheet = wsEntry.getWorksheets().get(0);
            URL cellFeedUrl= sheet.getCellFeedUrl ();
            CellFeed cellFeed= spreadsheetService.getFeed (cellFeedUrl, CellFeed.class);
            CellEntry cellEntry;

            cellEntry= new CellEntry (1, 1, "Timestamp");
            cellFeed.insert (cellEntry);

            cellEntry= new CellEntry (1, 2, "Value");
            cellFeed.insert (cellEntry);

            cellEntry= new CellEntry (1, 3, "Latitude");
            cellFeed.insert (cellEntry);

            cellEntry= new CellEntry (1, 4, "Longitude");
            cellFeed.insert (cellEntry);

            cellEntry= new CellEntry (1, 5, "Annotation");
            cellFeed.insert (cellEntry);

            cellEntry= new CellEntry (1, 6, "Data");
            cellFeed.insert (cellEntry);

        }



    } catch (MalformedURLException e) {
        LogHelper.logException(this.getClass(), e);
        throw new NimbitsException(e);

    } catch (ServiceException e) {
        LogHelper.logException(this.getClass(), e);
        throw new NimbitsException(e);
    } catch (IOException e) {
        LogHelper.logException(this.getClass(), e);
        throw new NimbitsException(e);
    } catch (OAuthException e) {
        LogHelper.logException(this.getClass(), e);
        throw new NimbitsException(e);
    }


}

在这里,很多小事情都没有记录 - 但两条腿的 oauth 转储到电子表格中:

从各种来源提取一些示例代码并将其组合在一起。文档键来自创建新文档.getId时返回的对象。

  @Override
    public void dumpValues(final Entity entity, int count) throws NimbitsException {
        String[][] values = {   {"1", "2", "3", "4", "5"},
                {"a", "b", "c", "d", "e"},
                {"dummy", "foo", "bar", "x", "y"}};


        final User user = //where you store your user


        SpreadsheetService spreadsheetService;
        String consumerKey = getInitParameter("consumer_key");
        String consumerSecret = getInitParameter("consumer_secret");
        GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters();
        oauthParameters.setOAuthConsumerKey(consumerKey);
        oauthParameters.setOAuthConsumerSecret(consumerSecret);
        spreadsheetService = new SpreadsheetService("nimbits-com");
        spreadsheetService.setProtocolVersion(SpreadsheetService.Versions.V1);


        try {
            spreadsheetService.setOAuthCredentials(oauthParameters, new OAuthHmacSha1Signer());
            String key = String.valueOf(this.getThreadLocalRequest().getSession().getAttribute("docId"));
            FeedURLFactory urlFactory = FeedURLFactory.getDefault();
            URL cellFeedUrl = urlFactory.getCellFeedUrl(key, "od6", "private", "full");


            CellQuery q = new CellQuery(cellFeedUrl);
            //CellQuery q = new CellQuery(worksheet.getCellFeedUrl());
            q.setMinimumRow(1);
            q.setMaximumRow(1 + values.length);
            q.setMinimumCol(1);
            q.setMaximumCol(values[0].length);
            q.setReturnEmpty(true);
            q.addCustomParameter(new Query.CustomParameter("xoauth_requestor_id", user.getEmail().getValue()));
            CellFeed cellFeed = spreadsheetService.query(q, CellFeed.class);

            CellFeed batchRequestFeed = new CellFeed();

            // set values for each cell
            int currentCellEntry=0;
            for (int i=0; i < values.length; i++) {
                for (int j=0; j < values[i].length; j++) {

                    CellEntry entry = new CellEntry(cellFeed.getEntries().get(currentCellEntry));
                    entry.changeInputValueLocal(values[i][j]);
                    BatchUtils.setBatchId(entry, (new Integer(currentCellEntry)).toString());
                    BatchUtils.setBatchOperationType(entry, BatchOperationType.UPDATE);
                    batchRequestFeed.getEntries().add(entry);
                    currentCellEntry++;
                }
            }

            // upload cells
            Link batchLink = cellFeed.getLink(Link.Rel.FEED_BATCH, Link.Type.ATOM);
            spreadsheetService.setHeader("If-Match", "*");

            CellFeed batchResponse = spreadsheetService.batch(new URL(batchLink.getHref() ), batchRequestFeed);
            spreadsheetService.setHeader("If-Match", null);
            for (CellEntry entry : batchResponse.getEntries()) {
                if (!BatchUtils.isSuccess(entry)) {

                    BatchStatus status = BatchUtils.getBatchStatus(entry);
                    throw new NimbitsException(BatchUtils.getBatchId(entry) + " " + status.getReason() + " " + status.getContent());
                }
            }
        } catch (IOException e) {
            LogHelper.logException(this.getClass(), e);
            throw new NimbitsException(e);
        } catch (ServiceException e) {
            LogHelper.logException(this.getClass(), e);
            throw new NimbitsException(e);
        } catch (OAuthException e) {
            LogHelper.logException(this.getClass(), e);
            throw new NimbitsException(e);
        }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 2 Legged OAUTH / OPEN ID 域帐户通过 Google GData API 批量更新电子表格 的相关文章

  • Twitter API:获取关注者 +99

    使用 twitter API 和 OAuth 如果我要调用用户关注者 状态 关注者 我将仅返回 99 个结果 有没有办法让我返回 99 然后从关注者 100 开始再次调用 然后循环这种调用方式 直到返回关注者总数 或者只是返回所有关注者 您
  • ServiceStack OAuth - 注册而不是登录

    在 servicestack OAuth 实现中 我只看到了自动登录的可能性 例如 脸书账号 但是否能够支持通过 Facebook 登录进行注册过程 我想要的是让用户登录到 facebook 应用程序 然后加载他们的姓名 姓氏和电子邮件 并
  • YQL API请求私有数据认证错误

    我正在使用 YQL 为我的 yahoo Fantasy Football League 提取一些数据 我已经创建了该应用程序 它给了我一个消费者 密钥 但我如何将此信息传递给 yahoo api 来让我登录 我知道我必须使用 OAuth 但
  • 从另一个域重定向时 Django 会话被丢弃

    当用户访问我的域时 django 会发出一个 sessionid 当他尝试使用 Facebook 进行 Oauth 时 他单击我网站上的一个按钮 该按钮会重定向到 Facebook com Facebook 重定向回我的域 但此时 用户的会
  • Meteor 访问令牌

    使用时Meteor http meteor com 与新的验证 https github com meteor meteor tree auth系统 我怎样才能获得facebook访问令牌 当登录时accounts facebook包裹 从
  • 检测 Twitter 的 iOS 版本?

    显然 我对 Twitter oAuth 令牌请求 的使用在 iOS 5 中不起作用 我如何为 iOS 5 以下的任何内容保留此代码并使用适用于 iOS 5 的新 Twitter 框架 可以检测iOS版本吗 Thanks 您 几乎 永远不想查
  • GAM SDK 测试安装后不显示 Gmail 上下文小工具

    在 Google Apps Marketplace SDK 中测试安装流程后 我无法在 Gmail 中看到上下文小工具 以下是我创建项目所采取的步骤 以域管理员身份登录 创建 Google Apps 控制台项目 创建 OAuth2 客户端
  • 使用 Facebook OAuth 2.0 - 如何获取访问令牌?

    我是新来的OAuth http en wikipedia org wiki OAuth 我正在尝试使用脸书连接 http en wikipedia org wiki Facebook Platform Facebook Connect与我的
  • Protractor e2e 测试登录重定向

    目前有部分端到端测试 输入用户名 密码并单击 登录 它成功完成了这一操作 但在 谢谢您已登录 页面结束 而不是像我通过浏览器登录那样被重定向到 帐户门户 或 仪表板 这个项目是新的 但我们正在使用 OAuth 主要问题 这听起来像是需要 h
  • 当用户存储在外部身份提供商服务中时与用户的关系

    我正在尝试为其创建一个 API 和一个网站客户端 最近 我读了很多关于 OAuth2 作为安全机制的文章 以及提供身份验证服务的公司 例如auth0 com https auth0 com 甚至 Azure Active Directory
  • 如何在 PHP 中实现 Google OpenID 身份验证并在本地主机上测试

    我是 OpenID 新手 想在我的网站上实施 Google OpenID 身份验证 我找不到任何例子 任何人都可以建议我一些好的教程 一步一步 或任何带有代码的工作示例 以使用 PHP 实现 Google OpenID 身份验证 我建议使用
  • 如何使用 cURL(或任何命令行工具)通过 OAuth 身份验证将 HTTP Post 发送到 Twitter?

    我希望使用命令行应用程序 例如cURL http en wikipedia org wiki CURL cURL 在我的测试 Twitter 帐户上发布一些测试帖子 我也希望通过 OAuth 身份验证来做到这一点 我怎样才能做到这一点 假设
  • 使用 OAuth2 对应用程序*和*网站进行身份验证

    我正在开发一个主要通过应用程序访问的网站 我想使用 OAuth2 进行用户注册和身份验证 由于它是一个 Android 应用程序 我将开始使用 Google 的 OAuth2 东西 因为它在 Android 上提供了一个不错的 UI 谷歌表
  • 客户端凭据授予的访问令牌是否可以映射到用户?

    我想使用 oauth2 中的客户端凭据授予来保护 API 但是 我希望访问令牌映射到单个用户 由我在带外信任 设置阶段选择 在该阶段我共享密钥 秘密 这是一个问题吗 我知道使用客户端凭据授予的访问令牌不应该在用户的上下文中 以这种方式绑定它
  • 使用 Python gdata 和 oAuth 2 对日历进行身份验证

    我正在将一个 Python 应用程序从 oAuth 1 迁移到 oAuth 2 该应用程序读取用户的 Google 日历提要 使用 oAuth 1 如果用户可以使用他的 GMail 进行身份验证 我的应用程序将打开浏览器 帐户并授权访问 我
  • 传递 oauth 令牌请求的授权标头

    我使用java实现oauth来获取未经授权的请求令牌 如何传递授权标头中的参数 我需要通过 GET request token HTTP 1 1 Host photos example net 80 Authorization OAuth
  • 为什么我的 Facebook 访问令牌突然停止工作? “OAuthException:验证访问令牌时出错。”

    我有一个 iframe Facebook 应用程序 它使用 Facebook PHP SDK 进行身份验证并进行 api 调用 在身份验证过程中 系统会提示用户输入基本信息和离线访问 如果他们允许我的应用程序访问 Facebook 会将它们
  • 在哪里可以找到 OpenID 提供商 URL 列表? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我已经在我的网站上实现了 OpenID 但我很难找到 OpenID 提供商 URL 列表 我以为这很容
  • Spring Boot - 使用 JWT、OAuth 以及单独的资源和身份验证服务器

    我正在尝试构建一个使用 JWT 令牌和 OAuth2 协议的 Spring 应用程序 我的身份验证服务器正在运行 感谢本教程 https medium com nydiarra secure a spring boot rest api w
  • 向 OpenID 提供商请求电子邮件地址

    我正在实施 OpenID 我想检索用户的电子邮件地址和有关用户的其他信息 我正在这样做 var fetch new FetchRequest fetch AddAttribute new AttributeRequest WellKnown

随机推荐

  • 如何使用 DOMDocument 方法更改节点的根?

    如何只更改 DOM 节点的根标签名称 在 DOM Document 模型中我们无法更改属性documentElement of a DOMElement对象 所以 我们需要 重建 节点 但是如何 重建 childNodes财产 注意 我可以
  • 使用python查找图像存在的docx文件

    我如何找到文档文件中存在的图像 python 中有没有相应的模块 我搜索过但没有用 这就是我们如何从word文件中读取内容 下面的代码没有提供有关文件中存在的图像的信息 from docx import Document documnet
  • 在 debian 中安装 Node js 时出错

    我尝试安装在debian nodejs 我正在按照以下步骤操作如何在 ubuntu 上安装 Node js但当我跑步时sudo bash nodesource setup sh下面的错误向我显示 有人帮我解决吗 W The reposito
  • React Native - 应用程序如何确定设备上未找到的打包器 IP 地址

    我有一个 React Native 应用程序 如果我在 iOS 模拟器上运行它 它可以工作并且可以连接到在 localhost 8081 上运行的正在运行的打包程序 但是如果我尝试在实际的 iOS 设备上运行该应用程序 它会失败 因为它无法
  • 子集数据帧中意外输出的原因 - R

    我有数据框 a 它有一个名为 VAL 的变量 我想统计VAL值为23或24的元素 我使用了两个工作正常的代码 nrow subset a VAL 23 VAL 24 nrow subset a VAL in c 23 24 但是 我尝试了其
  • Plotly Scattermapbox:有没有办法在标记上方和下方包含一些文本?

    在 Plotly 中 使用 Scattermapbox 有没有办法在标记上方和下方显示一些文本 目前 仅当我将鼠标悬停在标记上时才会显示文本 并且该图仅显示我想要显示的文本的一部分 我的输入数据框df area如下 我想显示两个中包含的文本
  • Picasa api 是否允许 CORS Post?

    Picasa api 允许跨域 GET 请求 但是当我尝试发布图像 评论时 出现以下错误 XMLHttpRequest 无法加载https picasaweb google com data feed api user default al
  • 如何使用 Python 逻辑检查回文

    我正在尝试用 Python 检查回文 我的代码非常for 循环密集 在我看来 人们从 C 转向 Python 时犯的最大错误是尝试使用 Python 实现 C 逻辑 这使得事情运行缓慢 而且没有充分利用该语言 我看到this网站 搜索 C
  • 如何跳过数组循环中的第一个键?

    我有以下代码 if POST submit Next foreach POST info as key gt value echo value 如何让 foreach 函数从数组中的第二个键开始 对于相当小的数组 使用数组切片创建第二个 f
  • 为什么自调用不适用于 Spring 代理(例如使用 AOP)?

    请解释一下 为什么对代理的自调用在目标上执行而不是在代理上执行 如果这是故意的 那为什么呢 如果通过子类化创建代理 则可以在每个方法调用之前执行一些代码 甚至在自调用时也是如此 我尝试过 并且我有自我调用代理 public class Du
  • 如何使用标志禁用 Crashlytics iOS 库?

    我正在使用最新的 iOS Crashlytics 库 我希望使用单个标志禁用 crashlytics 我怎样才能做到这一点 PS 我没有按照新的 SDK 集成指南使用设置 API 密钥方法 使用 MAC 应用程序集成 您是否试图阻止 Cra
  • 在哪里可以找到 Facebook cookie?

    我对此有点陌生 所以请耐心等待 我已经通过 Javascript SDK 安装了 使用 Facebook 登录 按钮 效果很好 我还设置了 PHP 代码 facebook php 我可以通过 javascript 成功登录 Facebook
  • 正则表达式引擎是否会跳过比模式短的字符串?

    我想循环一组字符串 在每个字符串上 我想循环遍历一组正则表达式 以确定哪些表达式与我所在的字符串匹配 但是 如果字符串长度短于模式字符串的最大可能长度 我希望正则表达式引擎跳过它 例如 假设我停在字符串 abc 上 并用这个正则表达式测试它
  • Angular >= 4.3,httpClient.get 参数为空

    我正在尝试迁移我的Http要求HttpClient要求 我能够迁移我的post查询 但我在迁移时遇到问题get查询 当我这样做时 我的后端没有分别收到任何参数 它告诉我参数未提供且为空 我做错什么了吗 import HttpClient H
  • 即使使用 EnableDelayedExpansion,%time% 也不会在 for 循环中扩展[重复]

    这个问题在这里已经有答案了 所以我注意到批处理文件的日志中的 time 变量不准确 如下所示 输出包含在代码下方 它在进入 for 循环时获取当前时间 但不会随时更新 这些 zip 文件很大 有时需要几分钟才能解压每个文件 有人知道这里发生
  • 带有导航控制器的选项卡栏应用程序

    我有一个简单的 iPhone 应用程序 有一个选项卡栏和 3 个选项卡 每个选项卡作为一个带有相应控制器的单独笔尖加载 每个笔尖都包含一个表格视图 其中包含一些其他用于搜索 过滤等的控件 我想要的 并且似乎找不到示例 是向应用程序添加一个导
  • Karate - 在 karate-config.js 中设置全局 User-Agent 标头

    所以我写了一些测试功能 我想全局添加 User Agent 标头 我更新了我的空手道配置 js为此归档 我添加下面的代码 karate configure headers User Agent Karete Apache HttpClien
  • 有没有办法在“交互”命令后“期望”和“发送”

    因此 我需要在标准输出上输出远程进程的输出 但我还需要能够 监听 它 并在匹配我的关键字后发送命令 我需要这样的东西 我知道这段代码不正确 它的唯一目的是说明我需要什么 usr bin expect log user 0 spawn ssh
  • 我怎样才能在jquery中获取锚标记内的文本

    div a link1 a a href link2 a div jquery div1 a click function var text div1 a text 在上面的标签上 我想在我点击它的锚标签旁边获取文本 但是单击上面的每个锚标
  • 使用 2 Legged OAUTH / OPEN ID 域帐户通过 Google GData API 批量更新电子表格

    好吧 周末就这样拍摄了 这是我周日晚上最后一次求助 必须使用 2 Legged OAUTH 方法的 Google Marketplace 应用程序需要将 50K 记录写入 Google 文档电子表格 我能够创建记录 调整大小 重命名记录并将