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