2010-01-04 4 views
2

Google 사이트 도구를 통해 만들고 관리하는 웹 사이트의 일부 첨부 파일을 자동으로 업데이트하는 스크립트를 작성하려고합니다. Google은 9 월에 Sites API을 공개하고 사이트를 지원하려면 Python GData API의 소유권 주장을 발표 했으므로이를 가능하게해야합니다. 그러나 찾을 수있는 가장 가까운 방법은 client.update이며 첨부 파일의 메타 데이터는 업데이트 할 수 있지만 콘텐츠는 업데이트 할 수 없습니다.Google 사이트의 Python API로 첨부 파일 내용을 업데이트하려면 어떻게해야합니까?

Java API에서 첨부 파일 업데이트는 새로운 MediaFileSource을 만들고 entry.setMediaFileSource(source) 다음에 entry.updateMedia()을 호출하여 수행됩니다. 그러나 파이썬 API에서 비슷한 것을 찾을 수 없다. 내가 벙어리하고 그냥 뭔가를 놓치고, 아니면 정말 파이썬 API를 사용하여 Google 사이트의 첨부 파일을 업데이트 할 수 있습니까?

답변

2

sites api가 v1.1로 업데이트되었습니다. 이것이 아마 새롭게 추가

http://code.google.com/apis/sites/docs/1.0/developers_guide_python.html#UpdatingContent

+1

가이드가 약간 잘못되었지만 승자가 있습니다. 'entry.content.text = "당신의 새로운 HTML"을 사용하는 대신에'entry.content = atom.data.Content ("YOUR NEW HTML")'을 사용해야합니다. 그렇지 않으면 그냥 데이터 앞에 추가됩니다. 귀하의 포인터는 이것을 알아 내는데 엄청난 도움이되었습니다. – Pridkett

0

upload_attachment 메서드가 있는데 작동해야합니다. Sites API의 sample code을 확인하고 싶다면 해당 메소드를 사용하십시오.

+0

불행하게도, 그것은 하나의 내가해야 할 일입니다 첨부 파일을 업데이트 할 수 없습니다. 중복 파일 이름으로'upload_attachment'를 호출하면 오류가 반환됩니다 : 서버가 다음과 같이 응답했습니다 : 409, 이름이 중복 된 삽입 노드 - " test.txt " 이미 있음 - 기존 노드 ID는 4770556649999999999 – Pridkett

+0

입니다. 유일한 방법은 Java 라이브러리 않습니다 : http://code.google.com/apis/sites/docs/1.0/developers_guide_protocol.html#UpdatingAnAttachment 현재 파이썬 라이브러리 코드는 문서화되지 않은 gdata 프로토콜을 사용합니다. 이 문제를 해결하려면 gdata 클라이언트에서 ClientLogin 인증을 가져 와서 PUT 메소드를 통해 http 요청을 직접 만드십시오. 또는 이전 파일을 삭제하고 새 파일을 업로드하십시오. 이는 매우 끔찍합니다. – livibetter

+0

자바 라이브러리도 GData 프로토콜을 사용합니다. 그래서, 그것의 소리에서, 지금은 파이썬에서 실제로 할 수 없습니다. 나는 삭제와 재 추가에 대해 생각해 왔지만, 그것은 정말로 끔찍하며 일부 링크를 망가뜨릴 수있다. 어쩌면 잠시 기다려야 할 수도 있습니다 ... – Pridkett

1

좋아이며, API는 이상이, 그리고 문서는 매우 명확하지 않다. 여기에 내가 알아 낸 것이있다. 처음으로 첨부 파일을 업로드 할 때는 UploadAttachment 메소드를 사용하여 수행하지만, 후속 시도에서는 Update를 호출해야합니다.

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 
+0

자세한 수업을 도와 주셔서 감사합니다. 원래 문제는 API가 당시 첨부 파일 업데이트를 지원하지 않았다는 것입니다. 앞으로도 구현을 모색하는 사람들에게 도움이 될 것이므로 여전히 점수를 얻습니다. – Pridkett

4

문서 here은 (첨부 파일의 컨텐츠와 메타 데이터를 교체 하위 섹션)

남겨 유일한 것은 얻는 것입니다 첨부 파일의 컨텐츠와 메타 데이터를 업데이트하는 방법에 대한 예제를 제공합니다 : 여기가하는 코드는 이런 식으로 쉽게 수행 할 수 있습니다 existing_attachment : 그 첨부 파일을 업로드 작동하는 동안

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 
관련 문제