diff --git a/core/command.py b/core/command.py index c1fb36e..c508c30 100644 --- a/core/command.py +++ b/core/command.py @@ -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 diff --git a/lib/facebook.py b/lib/facebook.py index ccc4cd2..69f7cf1 100644 --- a/lib/facebook.py +++ b/lib/facebook.py @@ -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 diff --git a/utils/parse_html.py b/utils/parse_html.py index a609771..75f555b 100644 --- a/utils/parse_html.py +++ b/utils/parse_html.py @@ -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