作者 lemon

增加好友列表的两个接口

... ... @@ -101,6 +101,8 @@ class Executor():
for u in users:
info = common.todict(u, keys)
info['type'] = info.get('type').name
info['gender'] = 'boy' if info['gender'] == 'male_singular' else 'girl'
result.append(info)
return result
... ... @@ -155,5 +157,6 @@ class Executor():
for _, u in users.items():
info = common.todict(u, include=keys)
info['type'] = info.get('type').name
info['gender'] = 'boy' if info['gender'] == 'male_singular' else 'girl'
objects.append(info)
return objects
... ...
... ... @@ -150,6 +150,7 @@ class RequestSource():
3: 'profile_friends',
4: 'group_member_list',
5: 'hovercard',
6: 'browse',
}
@classmethod
... ... @@ -779,6 +780,46 @@ class FacebookClient(Client):
'ext_data': ext_data,
}
def friendsList(self, ext_data=None):
if ext_data:
data = {'av': self.uid,
'fb_api_caller_class': 'RelayModern',
'fb_api_req_friendly_name': 'ProfileCometAppCollectionListRendererPaginationQuery',
'variables': json.dumps({"count": 20,
"cursor": ext_data['cursor'],
"search": None, "scale": 2,
"privacySelectorRenderLocation": "COMET_PROFILE_COLLECTIONS",
"id": ext_data['id']}),
'doc_id': '2773917206008873'}
res = self._post('/api/graphql/', data)
res = res['data']['node']
else:
res = self._state._session.get(self._state.page_url + '/friends')
res = parse_html.get_frient_div(res.text)
edges = res['items']['edges']
count = res['items']['count']
friends = []
for edge in edges:
node = edge['node']
data = {
'image': node['image']['uri'],
'name': node['title']['text'],
'fbid': node['node']['id'],
'url': node['node']['url']
}
friends.append(data)
respone = {
'items': friends,
'count': count,
'ext_data': {
'id': res['id'],
'cursor': res['items']['page_info']['end_cursor']
},
'has_next_page': res['items']['page_info']['has_next_page']
}
return respone
def changePwd(self, old, new):
data = {
'recommended': False,
... ... @@ -855,3 +896,39 @@ class FacebookClient(Client):
}
res = self._post('/ajax/settings/language/account.php', data)
return {"success": True}
def inboxMessenger(self, ext_data=0):
if ext_data:
info = self.fetchThreadList(before=int(ext_data))
else:
info = self.fetchThreadList()
next_data = info[-1].last_message_timestamp if info else 0
friends = []
for foo in info:
if ThreadType.GROUP == foo.type:
friends.append({
'type': foo.type.name,
'fbid': foo.uid,
'name': foo.name,
'image': foo.photo,
'url': None,
'gender': None,
'message_count': foo.message_count,
'members': list(foo.participants),
})
elif ThreadType.USER == foo.type:
friends.append({
'type': foo.type.name,
'fbid': foo.uid,
'name': foo.name,
'image': foo.photo,
'url': foo.url,
'gender': 'boy' if foo.gender == 'male_singular' else 'girl',
'message_count': foo.message_count,
})
response = {
'items': friends,
'ext_data': next_data
}
return response
... ...
... ... @@ -8,6 +8,7 @@ import json
import re
import bs4
import demjson
from bs4 import BeautifulSoup
... ... @@ -175,6 +176,15 @@ def get_hidden_input(res):
args.update({x['name']: x['value']})
return args
def get_div_text(html):
b = bs4.BeautifulSoup(html, 'html.parser')
return b.text
def get_frient_div(text):
b = bs4.BeautifulSoup(text, 'html.parser')
script = b.find('script', string=re.compile(r'ProfileCometAppSectionFriendsList'))
a = re.findall(r'TimelineAppCollectionListRenderer",collection:(\{.*?\}\}\})', script.string)[0]
res = demjson.decode(a)
return res
... ...