Come posso aggiornare il contenuto degli allegati con l'API Python di Google Sites?
-
18-09-2019 - |
Domanda
Sto provando a scrivere uno script che aggiornerà automaticamente alcuni allegati su un sito web creato e gestito tramite Google Sites.Ciò dovrebbe essere possibile poiché Google ha rilasciato il file API dei siti nel mese di settembre e il API GData Python afferma di supportare i siti.Tuttavia, il metodo più vicino che riesco a trovare si chiama client.update
, che mi consente di aggiornare i metadati di un allegato, ma non il contenuto.
Nell'API Java l'aggiornamento di un allegato viene effettuato creando un nuovo file MediaFileSource
e poi chiamare entry.setMediaFileSource(source)
seguito da entry.updateMedia()
.Tuttavia, non riesco a trovare nulla di simile nell'API Python.Sono stupido e mi manca semplicemente qualcosa o non è davvero possibile aggiornare un allegato di siti Google utilizzando l'API Python?
Soluzione
l'API dei siti è stata aggiornata alla v1.1;questa è probabilmente una nuova aggiunta
http://code.google.com/apis/sites/docs/1.0/developers_guide_python.html#UpdatingContent
Altri suggerimenti
Il qui fornisce un esempio di come aggiornare il contenuto ei metadati di un allegato (sottosezione Sostituzione contenuto di un allegato e metadati)
L'unica cosa che resta fuori è quello di ottenere existing_attachment
che può essere fatto facilmente con qualcosa di simile:
existing_attachment = None
uri = '%s?kind=%s' % (client.MakeContentFeedUri(), 'attachment')
feed = client.GetContentFeed(uri=uri)
for entry in feed.entry:
if entry.title.text == title:
print '%s [%s]' % (entry.title.text, entry.Kind())
existing_attachment = entry
Ok, l'API non è strano, e la documentazione non è molto chiaro. Ecco quello che ho capito. La prima volta che si carica un allegato, lo si fa attraverso il metodo UploadAttachment, ma i tentativi di follow-up, è necessario chiamare Update. Ecco il codice che lo fa:
class AttachmentUploader(object):
"""Uploads a given attachment to a given filecabinet in Google Sites."""
def __init__(self, site, username, password):
self.client = gdata.sites.client.SitesClient(
source="uploaderScript", site=site)
self.client.ssl = True
try:
self.client.ClientLogin(username, password, "some.key")
except:
traceback.print_exc()
raise
def FindAttachment(self, title):
uri = "%s?kind=%s" % (self.client.MakeContentFeedUri(), "attachment")
feed = self.client.GetContentFeed(uri=uri)
for entry in feed.entry:
if entry.title.text == title:
return entry
return None
def FindCabinet(self, title):
uri = "%s?kind=%s" % (self.client.MakeContentFeedUri(), "filecabinet")
feed = self.client.GetContentFeed(uri=uri)
for entry in feed.entry:
if entry.title.text == title:
return entry
return None
def Upload(self, cabinet_title, title, file_path, description):
"""Upload the given file as attachment."""
ms = gdata.data.MediaSource(file_path=file_path, content_type="text/ascii")
existing_attachment = self.FindAttachment(title)
if existing_attachment is not None:
existing_attachment.summary.text = description
updated = self.client.Update(existing_attachment, media_source=ms)
print "Updated: ", updated.GetAlternateLink().href
else:
cabinet = self.FindCabinet(cabinet_title)
if cabinet is None:
print "OUCH: cabinet %s does not exist" % cabinet_title
return
attachment = self.client.UploadAttachment(
ms, cabinet, title=title, description=description)
print "Uploaded: ", attachment.GetAlternateLink().href
C'è un upload_attachment metodo, che dovrebbe funzionare. Si consiglia inoltre di controllare le codice di esempio per i siti API, utilizza questo metodo.