From e893a9473fb3d5fd1f37984d7f0b212813ab184b Mon Sep 17 00:00:00 2001 From: lemon <961222258@qq.com> Date: Wed, 19 Feb 2020 09:48:44 +0800 Subject: [PATCH] 增加注销命令 --- core/monitor.py | 9 ++++++--- lib/facebook.py | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++----------------- requirements.txt | 3 ++- utils/parse_html.py | 17 +++++++++++++++++ 4 files changed, 75 insertions(+), 21 deletions(-) diff --git a/core/monitor.py b/core/monitor.py index fcc0791..e2f5fbc 100644 --- a/core/monitor.py +++ b/core/monitor.py @@ -84,9 +84,8 @@ class Monitor(callback.CallBack): return False self._remove_member(email) - if not client.listening: - return True - client.stopListening() + if client.listening: + client.stopListening() self.onLogout(client) return True @@ -176,6 +175,10 @@ class Monitor(callback.CallBack): kwargs = parameter.join(self.login, payload) client = Munch(email=kwargs.get('email')) self.executor.submit(self.thread, client, taskid, kwargs) + elif type_ == 'logout': + kwargs = parameter.join(self.logout, payload) + client = self._get_member(target) + self.executor.submit(self.thread, client, taskid, kwargs) else: try: client = self._get_member(target) diff --git a/lib/facebook.py b/lib/facebook.py index 27d5566..43748e5 100644 --- a/lib/facebook.py +++ b/lib/facebook.py @@ -5,6 +5,7 @@ # @File : facebook.py # @Software: PyCharm import base64 +import itertools import json import os import random @@ -12,6 +13,7 @@ import re import time from enum import Enum +import demjson import furl from fbchat import Client, ThreadType, Message, Sticker, FBchatUserError, _exception, log, _util from fbchat._state import State, session_factory, is_home @@ -90,10 +92,22 @@ class PCState(State): else: id = name = url = image = None + fb_dtsg = None + fb_dtsg_ag = None + jazoest = None try: - fb_dtsg = re.compile(r'name="fb_dtsg" value="(.*?)"').search(r.text).group(1) + rec = re.compile(r'\["DTSGInitData",\[\],(\{.*?\}),\d+\]') + initdata = rec.search(r.text).group(1) + initdata = json.loads(initdata) + fb_dtsg = initdata['token'] + fb_dtsg_ag = initdata['async_get_token'] except: - fb_dtsg = None + pass + + try: + jazoest = re.search(r'name="jazoest" value="(\d+)"', r.text).group(1) + except: + pass revision = int(r.text.split('"client_revision":', 1)[1].split(",", 1)[0]) @@ -105,7 +119,7 @@ class PCState(State): revision=revision, session=session, logout_h=logout_h, - counter=0 + counter=0, ) self.id = id @@ -113,6 +127,8 @@ class PCState(State): self.page_url = url self.imageurl = image self._online = is_online + self.fb_dtsg_ag = fb_dtsg_ag + self.jazoest = jazoest return self @@ -718,17 +734,34 @@ class FacebookClient(Client): def get_user_agent(self): return self._state._session.headers.get('User-Agent', random.choice(_util.USER_AGENTS)) - def searchForUserByFilter(self, name=None, city=None): - url = 'https://www.facebook.com/search/top/' - data = {'q': 'angel', - 'ref': 'side_filter', - 'epa': 'FILTERS', - 'filters': 'eyJycF9sb2NhdGlvbiI6IntcIm5hbWVcIjpcImxvY2F0aW9uXCIsXCJhcmdzXCI6XCIxMDYyNjI4ODI3NDU2OThcIn0ifQ==', - 'ajaxpipe': '1', - 'ajaxpipe_token': 'AXjhI9q4VDQji6Ox', - 'quickling[version]': '1001720869;0;' - } - # f = furl.furl(url).add(data) - # print(f.url) - res=self._state._get('https://www.facebook.com/search/people/?q=angel&epa=FILTERS&filters=eyJjaXR5Ijoie1wibmFtZVwiOlwidXNlcnNfbG9jYXRpb25cIixcImFyZ3NcIjpcIjEwNjI2Mjg4Mjc0NTY5OFwifSJ9&ref=side_filter',{}) - print(res) \ No newline at end of file + def searchForUserByFilter(self, ext_data=None): + if not ext_data: + r = self._state._session.get( + 'https://www.facebook.com/search/people/?q=%E5%B1%B1%E4%B8%8B&epa=FILTERS&filters=eyJjaXR5Ijoie1wibmFtZVwiOlwidXNlcnNfbG9jYXRpb25cIixcImFyZ3NcIjpcIjEwNjUxNDAwNjA1MzI1MFwifSJ9') + fbid = parse_html.get_all_raw_id(r.text) + + global_data = re.findall(r'globalData:(\{.*?display_params.*?\}),prefetchPixels', r.text)[0] + data = demjson.decode(global_data) + complete = re.findall('"pageletComplete",\[\],\[(.*?)\]', r.text)[0] + data.update(demjson.decode(complete)) + return {'fbid_list': fbid, 'ext_data': data} + else: + data = {'data': demjson.encode(ext_data), 'fb_dtsg_ag': self._state.fb_dtsg_ag} + res = self._state._get('https://www.facebook.com/ajax/pagelet/generic.php/BrowseScrollingSetPagelet', data) + ext_data.pop('page_number') + try: + for x in res.get('jsmods').get('require'): + if len(x) == 4 and x[1] == 'pageletComplete': + ext_data.update(x[3][0]) + break + except: + pass + + fbid = parse_html.get_all_raw_id(res['payload']) + if fbid and 'page_number' not in ext_data: + ext_data = None + # 无更多了 + return { + 'fbid_list': fbid, + 'ext_data': ext_data, + } diff --git a/requirements.txt b/requirements.txt index 6039479..03eb9de 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,4 +6,5 @@ pyyaml==5.3 munch==2.5.0 furl==2.1.0 sqlalchemy==1.3.12 -psutil==5.6.7 \ No newline at end of file +psutil==5.6.7 +demjson==2.2.4 \ No newline at end of file diff --git a/utils/parse_html.py b/utils/parse_html.py index ed99af2..f7bb390 100644 --- a/utils/parse_html.py +++ b/utils/parse_html.py @@ -145,3 +145,20 @@ def get_user_info(b): pass return id, name, url, image return None, None, None, None + + +def get_all_raw_id(text): + fbids = [] + b = bs4.BeautifulSoup(text, 'html.parser') + if 'raw_id\\\\":' in text: + pattern = re.compile(r'raw_id\\\\":(\d+),') + elem = b.find_all('div', class_='hidden_elem', string=pattern) + for e in elem: + key = pattern.findall(e.string) + fbids.extend(key) + fbids = list(set(fbids)) + else: + r = re.compile(r'\\"raw_id\\":(\d+),') + key=r.findall(text) + fbids.extend(key) + return fbids -- libgit2 0.24.0