2015-06-30 13 views
9

Python/Google App Engine'de GMail API kullanıyorum. Bazı iş parçacıklarını döndüren bir sorgum var ve şimdi her iş parçacığının son iletisini almak istiyorum. Sonuçlar zorunlu olarak tarihe göre sıralanmadığından, bunun için en verimli API çağrısı ne olacağını merak ediyorum. dizisindeki son eposta bir gönderilmişse, bu daha sonra diğer şeyler arasında öğrenmek için aşağıdaki mantığı çalışır get_items, yürütürGMail API - Bir iş parçacığının son iletisini al

if threads != []: 
    count = 0 #start a new batch request after every 1000 requests 
    batch = BatchHttpRequest(callback=get_items) 
    for t in threads: 
     batch.add(service.users().threads().get(userId=email, id=t), request_id=some_id) 
     count += 1 
     if count % 1000: #batch requests can handle max 1000 entries 
      batch.execute(http=http) 
      batch = BatchHttpRequest(callback=get_items) 
    if not count % 1000: 
      batch.execute(http=http) 

: Ben aşağıdaki toplu işlevini kurdum aşağıda açıklamalara dayanarak

öğe.

def get_items(request_id, response, exception): 
    if exception is not None: 
     print 'An error occurred: %s' % exception 
    else: 
     for m in response['messages']: #check each of the messages in the response 
      if m['historyId'] == response['historyId']: #if it equals the historyId of the thread 
       if 'SENT' in m['labelIds']: #and it is marked as a sent item 
        item = m #use this message for processing 

Ancak bu, yukarıda oluşturduğunuz olarak "öğe" farklı historyIds ile 2 mesajları içeren durumlar vardır, çoğu durum için çalışıyor gibi görünüyor. Bu neden oluyor ve ben

+0

[1] Bir dişin son mesajı almak için tarih kimliğini kullanabilir [1]: https://developers.google. com/gmail/aPI/v1/başvuru/kullanıcılar/ipler – cutteeth

+0

Ah evet, bu konuda düşünce aslında kaldırdı eğer olsa emin değildi. Bir mesaj silindiğinde yeni bir HistoryId düşüncesi de eklenebilir. Yakında öğreneceğim o zaman. Bir deneyecek, teşekkürler. – Vincent

+0

Bu, çoğu durumda çalışır, ancak bazı durumlarda historyId ile eşleşirse, yanıt olarak 1 iletiden daha fazlasını alırım. Yukarıdaki kodu ekliyorum. InternalDate'in historyId'den ne kadar farklılık gösterdiği – Vincent

cevap

3

Gmail API artık alanını internalDate destekler ... sadece bunun için-etrafında işi bir oluşturmadan önce öğrenmek istiyorum ne olduğundan emin.

INTERNALDATE - gelen kutusunda sipariş belirleyen dahili mesaj yaratma zaman damgası (Epoch ms), . Bireysel mesajların kimliği ve INTERNALDATE soran ve son oluşturulduğu endam, get-istek: dizisindeki son mesaj alma

hiçbir sert bir User.thread fazla.

fields = messages(id,internalDate) 

GET https://www.googleapis.com/gmail/v1/users/me/threads/14e92e929dcc2df2?fields=messages(id%2CinternalDate)&access_token={YOUR_API_KEY} 

Yanıt: Bu [link] gereğince

{ 
"messages": [ 
    { 
    "id": "14e92e929dcc2df2", 
    "internalDate": "1436983830000" 
    }, 
    { 
    "id": "14e92e94a2645355", 
    "internalDate": "1436983839000" 
    }, 
    { 
    "id": "14e92e95cfa0651d", 
    "internalDate": "1436983844000" 
    }, 
    { 
    "id": "14e92e9934505214", 
    "internalDate": "1436983857000" // <-- This is it! 
    } 
] 
} 
+0

? Her ikisi de, anladığım kadarıyla, Google'ın benzersiz zaman damgalarını oluşturdu. Emin değilim – Vincent

+1

@Vincent, dürüst olmak gerekirse. Sadece özel mesajı son değiştirildiği tarih kaydının bir kimliği olduğu için 'historyId', zaman zaman çalışmak zor buldum. Yeni 'internalDate' çok ileri doğru. – Tholle

+1

Tamam, teşekkürler! Yakında bunu deneyecek ve çalışıp çalışmadığını onaylayacağım. – Vincent