我需要为大量联系人更改联系人照片,使用 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 端的某个时刻可能会出现竞争条件。