1

我需要为大量联系人更改联系人照片,使用 Google Contacts API 3.0 的 python 客户端

gdata==2.0.18

我正在运行的代码是:

client = gdata.contacts.client.ContactsClient(source=MY_APP_NAME)
GDClientAuth(client, MY_AUTH)

def _get_valid_contact(contact_id):
    contact = client.GetContact(contact_id)
    if contact.GetPhotoLink() is None:
        # Generate a proper photo link for this contact
        link = gdata.contacts.data.ContactLink()
        link.etag = '*'
        link.href = generate_photo_url(contact)
        link.rel = 'http://schemas.google.com/contacts/2008/rel#photo'
        link.type = 'image/*'
        contact.link.append(link)
    return contact

def upload_photo(contact_id, image_path, image_type, image_size):
    contact = _get_valid_contact(contact_id)
    try:
        client.ChangePhoto(media=image_path,
                           contact_entry_or_url=contact,
                           content_type=image_type,
                           content_length=image_size)
    except gdata.client.RequestError as req:
        if req.status == 412:
            #handle etag mismatches, etc...
            pass

给定一个有效的 Google 联系人 ID 列表,如果我为每个联系人依次运行upload_photo方法,一切都会顺利进行,并且所有联系人的照片都会更改:

for contact_id in CONTACT_ID_LIST:
    upload_photo(contact_id, '/path/to/image', 'image/png', 1234)

但是,如果我尝试并行上传照片(使用至少 4 个线程),其中一些会随机失败并显示500,出现临时内部问题。稍后再试一次,作为对 client.ChangePhoto 调用的响应。不过,我可以稍后重试这些照片,它们终于得到了更新:

from multiprocessing.pool import ThreadPool
pool = ThreadPool(4)
for contact_id in CONTACT_ID_LIST:
    pool.apply_async(func=upload_photo,
                     args=(contact_id,'/path/to/image', 'image/png', 1234))

我使用的线程越多,错误发生的频率就越高。

我能找到的唯一类似问题是http://code.google.com/a/google.com/p/apps-api-issues/issues/detail?id=2507,它在前一段时间已经解决了。我现在面临的问题可能会有所不同,因为它是随机发生的,并且仅在并行运行更新时才会发生。因此,在 Google Contacts API 端的某个时刻可能会出现竞争条件。

4

0 回答 0