作者 lemon

增加好友列表的两个接口

@@ -101,6 +101,8 @@ class Executor(): @@ -101,6 +101,8 @@ class Executor():
101 for u in users: 101 for u in users:
102 info = common.todict(u, keys) 102 info = common.todict(u, keys)
103 info['type'] = info.get('type').name 103 info['type'] = info.get('type').name
  104 + info['gender'] = 'boy' if info['gender'] == 'male_singular' else 'girl'
  105 +
104 result.append(info) 106 result.append(info)
105 return result 107 return result
106 108
@@ -155,5 +157,6 @@ class Executor(): @@ -155,5 +157,6 @@ class Executor():
155 for _, u in users.items(): 157 for _, u in users.items():
156 info = common.todict(u, include=keys) 158 info = common.todict(u, include=keys)
157 info['type'] = info.get('type').name 159 info['type'] = info.get('type').name
  160 + info['gender'] = 'boy' if info['gender'] == 'male_singular' else 'girl'
158 objects.append(info) 161 objects.append(info)
159 return objects 162 return objects
@@ -150,6 +150,7 @@ class RequestSource(): @@ -150,6 +150,7 @@ class RequestSource():
150 3: 'profile_friends', 150 3: 'profile_friends',
151 4: 'group_member_list', 151 4: 'group_member_list',
152 5: 'hovercard', 152 5: 'hovercard',
  153 + 6: 'browse',
153 } 154 }
154 155
155 @classmethod 156 @classmethod
@@ -779,6 +780,46 @@ class FacebookClient(Client): @@ -779,6 +780,46 @@ class FacebookClient(Client):
779 'ext_data': ext_data, 780 'ext_data': ext_data,
780 } 781 }
781 782
  783 + def friendsList(self, ext_data=None):
  784 + if ext_data:
  785 + data = {'av': self.uid,
  786 + 'fb_api_caller_class': 'RelayModern',
  787 + 'fb_api_req_friendly_name': 'ProfileCometAppCollectionListRendererPaginationQuery',
  788 + 'variables': json.dumps({"count": 20,
  789 + "cursor": ext_data['cursor'],
  790 + "search": None, "scale": 2,
  791 + "privacySelectorRenderLocation": "COMET_PROFILE_COLLECTIONS",
  792 + "id": ext_data['id']}),
  793 + 'doc_id': '2773917206008873'}
  794 + res = self._post('/api/graphql/', data)
  795 + res = res['data']['node']
  796 + else:
  797 + res = self._state._session.get(self._state.page_url + '/friends')
  798 + res = parse_html.get_frient_div(res.text)
  799 + edges = res['items']['edges']
  800 + count = res['items']['count']
  801 + friends = []
  802 + for edge in edges:
  803 + node = edge['node']
  804 + data = {
  805 + 'image': node['image']['uri'],
  806 + 'name': node['title']['text'],
  807 + 'fbid': node['node']['id'],
  808 + 'url': node['node']['url']
  809 + }
  810 + friends.append(data)
  811 +
  812 + respone = {
  813 + 'items': friends,
  814 + 'count': count,
  815 + 'ext_data': {
  816 + 'id': res['id'],
  817 + 'cursor': res['items']['page_info']['end_cursor']
  818 + },
  819 + 'has_next_page': res['items']['page_info']['has_next_page']
  820 + }
  821 + return respone
  822 +
782 def changePwd(self, old, new): 823 def changePwd(self, old, new):
783 data = { 824 data = {
784 'recommended': False, 825 'recommended': False,
@@ -855,3 +896,39 @@ class FacebookClient(Client): @@ -855,3 +896,39 @@ class FacebookClient(Client):
855 } 896 }
856 res = self._post('/ajax/settings/language/account.php', data) 897 res = self._post('/ajax/settings/language/account.php', data)
857 return {"success": True} 898 return {"success": True}
  899 +
  900 + def inboxMessenger(self, ext_data=0):
  901 + if ext_data:
  902 + info = self.fetchThreadList(before=int(ext_data))
  903 + else:
  904 + info = self.fetchThreadList()
  905 + next_data = info[-1].last_message_timestamp if info else 0
  906 + friends = []
  907 + for foo in info:
  908 + if ThreadType.GROUP == foo.type:
  909 + friends.append({
  910 + 'type': foo.type.name,
  911 + 'fbid': foo.uid,
  912 + 'name': foo.name,
  913 + 'image': foo.photo,
  914 + 'url': None,
  915 + 'gender': None,
  916 + 'message_count': foo.message_count,
  917 + 'members': list(foo.participants),
  918 + })
  919 + elif ThreadType.USER == foo.type:
  920 + friends.append({
  921 + 'type': foo.type.name,
  922 + 'fbid': foo.uid,
  923 + 'name': foo.name,
  924 + 'image': foo.photo,
  925 + 'url': foo.url,
  926 + 'gender': 'boy' if foo.gender == 'male_singular' else 'girl',
  927 + 'message_count': foo.message_count,
  928 + })
  929 +
  930 + response = {
  931 + 'items': friends,
  932 + 'ext_data': next_data
  933 + }
  934 + return response
@@ -8,6 +8,7 @@ import json @@ -8,6 +8,7 @@ import json
8 import re 8 import re
9 9
10 import bs4 10 import bs4
  11 +import demjson
11 from bs4 import BeautifulSoup 12 from bs4 import BeautifulSoup
12 13
13 14
@@ -175,6 +176,15 @@ def get_hidden_input(res): @@ -175,6 +176,15 @@ def get_hidden_input(res):
175 args.update({x['name']: x['value']}) 176 args.update({x['name']: x['value']})
176 return args 177 return args
177 178
  179 +
178 def get_div_text(html): 180 def get_div_text(html):
179 b = bs4.BeautifulSoup(html, 'html.parser') 181 b = bs4.BeautifulSoup(html, 'html.parser')
180 return b.text 182 return b.text
  183 +
  184 +
  185 +def get_frient_div(text):
  186 + b = bs4.BeautifulSoup(text, 'html.parser')
  187 + script = b.find('script', string=re.compile(r'ProfileCometAppSectionFriendsList'))
  188 + a = re.findall(r'TimelineAppCollectionListRenderer",collection:(\{.*?\}\}\})', script.string)[0]
  189 + res = demjson.decode(a)
  190 + return res