Enable fetching pending/archived threads

Add "type" parameter to fetchThreadList().
type can be 'inbox', 'pending' or 'archived'

If set to 'pending', it can fetch messages from unknown users.
It is quite useful to build a service accepting requests from anyone.

For example, in doOneListen(), fetch pending messages once for a while
to handle the messages from strangers.
This commit is contained in:
Tang
2017-10-03 01:14:00 +08:00
parent 9d5f06b810
commit 2d027af71a

View File

@@ -748,11 +748,12 @@ class Client(object):
return list(reversed([graphql_to_message(message) for message in j['message_thread']['messages']['nodes']])) return list(reversed([graphql_to_message(message) for message in j['message_thread']['messages']['nodes']]))
def fetchThreadList(self, offset=0, limit=20): def fetchThreadList(self, offset=0, limit=20, type='inbox'):
"""Get thread list of your facebook account """Get thread list of your facebook account
:param offset: The offset, from where in the list to recieve threads from :param offset: The offset, from where in the list to recieve threads from
:param limit: Max. number of threads to retrieve. Capped at 20 :param limit: Max. number of threads to retrieve. Capped at 20
:param type: (optional) "inbox", "pending", "archived"
:type offset: int :type offset: int
:type limit: int :type limit: int
:return: :class:`models.Thread` objects :return: :class:`models.Thread` objects
@@ -763,10 +764,16 @@ class Client(object):
if limit > 20 or limit < 1: if limit > 20 or limit < 1:
raise FBchatUserError('`limit` should be between 1 and 20') raise FBchatUserError('`limit` should be between 1 and 20')
if type in ['inbox', 'pending', 'archived']:
if type == 'archived':
type = 'action:archived'
else:
raise ValueError('thread_type must be "inbox", "pending" or "archived"')
data = { data = {
'client' : self.client, 'client' : self.client,
'inbox[offset]' : offset, type + '[offset]' : offset,
'inbox[limit]' : limit, type + '[limit]' : limit,
} }
j = self._post(self.req_url.THREADS, data, fix_request=True, as_json=True) j = self._post(self.req_url.THREADS, data, fix_request=True, as_json=True)
@@ -774,6 +781,7 @@ class Client(object):
raise FBchatException('Missing payload: {}, with data: {}'.format(j, data)) raise FBchatException('Missing payload: {}, with data: {}'.format(j, data))
participants = {} participants = {}
if 'participants' in j['payload']:
for p in j['payload']['participants']: for p in j['payload']['participants']:
if p['type'] == 'page': if p['type'] == 'page':
participants[p['fbid']] = Page(p['fbid'], url=p['href'], photo=p['image_src'], name=p['name']) participants[p['fbid']] = Page(p['fbid'], url=p['href'], photo=p['image_src'], name=p['name'])
@@ -783,6 +791,7 @@ class Client(object):
raise FBchatException('A participant had an unknown type {}: {}'.format(p['type'], p)) raise FBchatException('A participant had an unknown type {}: {}'.format(p['type'], p))
entries = [] entries = []
if 'threads' in j['payload']:
for k in j['payload']['threads']: for k in j['payload']['threads']:
if k['thread_type'] == 1: if k['thread_type'] == 1:
if k['other_user_fbid'] not in participants: if k['other_user_fbid'] not in participants: