tutorial secret google funciona como cliente oauth openid gdata gdata-api google-apps-marketplace

secret - oauth2 tutorial



Actualización por lotes a la hoja de cálculo con la API de Google GData utilizando la cuenta de dominio con dos patas OAUTH/OPEN ID (1)

Ok, el fin de semana se filma en esto - aquí está mi última llamada de socorro el domingo por la noche para pedir ayuda.

La aplicación de Google Marketplace que debe usar el enfoque 2 Legged OAUTH necesita escribir 50K registros en una hoja de cálculo de Google Docs. Puedo crear, cambiar el tamaño, cambiar el nombre y escribir registros en una hoja de cálculo. Lleva hasta un minuto escribir 100 filas individualmente, así que tengo que usar una actualización por lotes. No se puede hacer que funcione la actualización por lotes. El siguiente código es mi mejor intento: sigo recibiendo "Token invalid - Invalid token 401". Todo el código de muestra que hay es para oauth de tres patas, pero no puedo pedirle al usuario que apruebe la aplicación, ya que es una aplicación de mercado.

Sería genial encontrar un ejemplo de actualizaciones de hoja de cálculo por lotes usando openid y 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); }

Esta muestra solo intenta escribir un registro en un lote. Cambié el tamaño de la hoja de cálculo y se ve bien también. No veo cómo configurar el token o completar esta solicitud con 2LO. Intenté agregar xoauth_requestor_id a las URL.

editar desde que comencé la recompensa:

Este fragmento de código funciona perfectamente y agrega 1 fila a una hoja de cálculo existente con la autenticación 2LO que tengo. Lo necesito modificado para insertar 50,000 filas rápidamente.

@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); } }


Aquí está, un montón de pequeñas cosas no documentadas, pero el auth de dos patas se vuelca a una hoja de cálculo:

Tiró un código de muestra de varias fuentes para juntarlo. La clave del documento proviene del objeto devuelto cuando crea un nuevo documento .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); }