Обновить изображение профиля Google Apps / Google App Engine - PullRequest
3 голосов
/ 31 января 2012

Я пишу небольшое приложение на Google App Engine, чтобы обновлять изображения в профилях наших пользователей.Он берет там имя пользователя и изображение и помещает туда профиль, загружая изображение.Вот что у меня есть:

import atom.data
import gdata.data
import gdata.contacts.client
import gdata.contacts.data
import cgi
import wsgiref.handlers

from google.appengine.api import users
from google.appengine.ext import webapp

email = 'admin@domain.com'
password = 'password'
domain = 'domain.com'

gd_client = gdata.contacts.client.ContactsClient(domain=domain)
gd_client.ClientLogin(email, password, 'photoUpdate')


class PicPage(webapp.RequestHandler):
    def get(self):
        self.response.out.write("""<html><head><title>Sasaki Photo Uploader</title>
                                    <link type="text/css" rel="stylesheet" href="/stylesheets/form.css"></head>
                                    <body>
                                    <form action="/" enctype="multipart/form-data" method="post">
                                    <div><label>Person Name</label></div>
                                    <div><textarea name="name" rows="2" columns "60"></textarea></div>
                                    <div><label>Image</label></div>
                                    <div><input type="file" name="img"/></div>
                                    <div><input type="submit" value="Upload" /></div>
                                    </form>
                                    </body>
                                    </html>""")

    def post(self):
        person_name = self.request.get('name')
        img_img = self.request.get('img')
        profile_url = 'https://www.google.com/m8/feeds/photos/profile/domain.com/%s' % person_name
        media_object = img_img
        print(profile_url)
        profile = gd_client.GetProfile(profile_url)
        print(profile)
        gd_client.ChangePhoto(media_object, profile)
        self.redirect('/')

def main():
  application = webapp.WSGIApplication(
                                       [('/', PicPage)
                                        ],
                                       debug=True)

  wsgiref.handlers.CGIHandler().run(application)

if __name__=="__main__":
  main()

Когда я запускаю это, он возвращает ошибку:

 Traceback (most recent call last):
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\webapp\_webapp25.py", line 703, in __call__
    handler.post(*groups)
  File "C:\GAE_Local_Files\picupload\sasakipic.py", line 40, in post
    profile = gd_client.GetProfile(profile_url)
  File "C:\GAE_Local_Files\picupload\gdata\contacts\client.py", line 375, in get_profile
    auth_token=auth_token, **kwargs)
  File "C:\GAE_Local_Files\picupload\gdata\client.py", line 652, in get_entry
    desired_class=desired_class, **kwargs)
  File "C:\GAE_Local_Files\picupload\gdata\client.py", line 278, in request
    version=get_xml_version(self.api_version))
  File "C:\GAE_Local_Files\picupload\atom\core.py", line 520, in parse
    tree = ElementTree.fromstring(xml_string)
  File "<string>", line 106, in XML
ParseError: not well-formed (invalid token): line 1, column 0

Я не уверен, что это потому, что я передаю URL профиля какНеверная строка или загрузка картинки.Любой совет, высоко ценится.

РЕДАКТИРОВАТЬ Добавлена ​​полная трассировка стека

Ответы [ 3 ]

1 голос
/ 22 февраля 2012

Ну, ответ лежит в вопросе, который я указал в моем редактировании. Эта строка:

profile = gd_client.GetProfile(profile_url)

Пытается запросить изображение, расположенное в профиле, но если оно не существует, оно разрывается, поэтому я редактирую оператор try, чтобы передать URL-адрес профиля напрямую:

try:
    gd_client.ChangePhoto(media_object, profile_url)

Отлично сработало. Это отличный маленький инструмент для обновления изображений с помощью App Engine, и вам даже не нужно загружать его, просто запустите его локально на тестовом сервере механизма приложений. Я хочу попробовать добавить некоторые функции, такие как обрезка изображения или изменение размера перед загрузкой, большие изображения выглядят хорошо на странице профиля контакта, но могут искажаться в изображении чата.

1 голос
/ 03 марта 2012

Я пытался использовать сценарий, который вы опубликовали выше, включая исправление, которое вы отметили, как исправление ошибки недопустимого токена, но для меня это вызвало другую ошибку:

UnknownSize: Each part of the body must have a known size.

Чтобы исправить это, я исправил строку

media_object = img_img

читать:

media_object = gdata.data.MediaSource(img_img)

потому что объект MediaSource имеет неявный размер и является одним из приемлемых параметров client.py - за исключением того, что теперь появляется новая ошибка, и я не знаю, к чему обратиться.

RequestError: Server responded with: 400, Malformed Content-Type

Я пытался добавить параметр content-type = 'image / *' в ChangePhoto, но он не влияет.

Есть идеи?

поток ошибок:

Traceback (most recent call last):
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/webapp/_webapp25.py", line 703, in __call__
    handler.post(*groups)
  File " ...trim... /main.py", line 126, in post
    gd_client.ChangePhoto(media_object, profile_url, content_type='image/*')
  File " ...trim... /gdata/contacts/client.py", line 288, in change_photo
    ifmatch_header=ifmatch_header, **kwargs)
  File " ...trim... /atom/client.py", line 142, in put
    http_request=http_request, data=data, **kwargs)
  File " ...trim... /gdata/client.py", line 319, in request
    RequestError)
RequestError: Server responded with: 400, Malformed Content-Type
0 голосов
/ 01 февраля 2012

Мне кажется, проблема в том, что вам нужно аутентифицировать запрос к API.Смотрите здесь:

http://code.google.com/apis/contacts/docs/3.0/developers_guide.html#Auth

и посмотрите в этом примере приложения, как работает поток oauth:

http://code.google.com/p/google-api-python-client/source/browse/samples/appengine/main.py

Возможно, у вас естьВторая проблема заключается в том, что вам необходимо указать тип содержимого файла, но первым шагом является аутентификация для получения профиля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...