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 の終わりのある時点で競合状態が発生する可能性があります。