Compare commits
14 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
3c07e42ba2 | ||
|
2cd6376818 | ||
|
5e7f7750de | ||
|
2a223ec6db | ||
|
a99108fff6 | ||
|
8de4698cc4 | ||
|
637319ec2c | ||
|
f9398564cd | ||
|
b57f423eb4 | ||
|
3093f1f2b6 | ||
|
961777e0c1 | ||
|
d7139701f7 | ||
|
c6bac17d48 | ||
|
aca9176f7f |
@@ -17,7 +17,7 @@ from .client import *
|
||||
|
||||
|
||||
__copyright__ = 'Copyright 2015 - {} by Taehoon Kim'.format(datetime.now().year)
|
||||
__version__ = '1.0.11'
|
||||
__version__ = '1.0.16'
|
||||
__license__ = 'BSD'
|
||||
__author__ = 'Taehoon Kim; Moreels Pieter-Jan; Mads Marquart'
|
||||
__email__ = 'carpedm20@gmail.com'
|
||||
|
@@ -204,7 +204,8 @@ class Client(object):
|
||||
r = self._cleanPost(ReqUrl.LOGIN, data)
|
||||
|
||||
# Usually, 'Checkpoint' will refer to 2FA
|
||||
if 'checkpoint' in r.url and 'Enter Security Code to Continue' in r.text:
|
||||
if ('checkpoint' in r.url and
|
||||
('Enter Security Code to Continue' in r.text or 'Enter Login Code to Continue' in r.text)):
|
||||
r = self._2FA(r)
|
||||
|
||||
# Sometimes Facebook tries to show the user a "Save Device" dialog
|
||||
@@ -830,6 +831,13 @@ class Client(object):
|
||||
except (KeyError, IndexError) as e:
|
||||
raise Exception('Error when sending message: No message IDs could be found: {}'.format(j))
|
||||
|
||||
# update JS token if receive from response
|
||||
if ('jsmods' in j) and ('require' in j['jsmods']):
|
||||
try:
|
||||
self.payloadDefault['fb_dtsg'] = j['jsmods']['require'][0][3][0]
|
||||
except (KeyError, IndexError) as e:
|
||||
log.warning("Error when update fb_dtsg. Facebook might have changed protocol.")
|
||||
|
||||
return message_id
|
||||
|
||||
def sendMessage(self, message, thread_id=None, thread_type=ThreadType.USER):
|
||||
@@ -942,7 +950,7 @@ class Client(object):
|
||||
"""
|
||||
Sends a local image to a thread
|
||||
|
||||
:param image_path: URL of an image to upload and send
|
||||
:param image_path: Path of an image to upload and send
|
||||
:param message: Additional message
|
||||
:param thread_id: User/Group ID to send to. See :ref:`intro_threads`
|
||||
:param thread_type: See :ref:`intro_threads`
|
||||
@@ -1389,6 +1397,14 @@ class Client(object):
|
||||
elif mtype == "deltaflow":
|
||||
pass
|
||||
|
||||
# Chat timestamp
|
||||
elif mtype == "chatproxy-presence":
|
||||
buddylist = {}
|
||||
for _id in m.get('buddyList', {}):
|
||||
payload = m['buddyList'][_id]
|
||||
buddylist[_id] = payload.get('lat')
|
||||
self.onChatTimestamp(buddylist=buddylist, msg=m)
|
||||
|
||||
# Unknown message type
|
||||
else:
|
||||
self.onUnknownMesssageType(msg=m)
|
||||
@@ -1676,6 +1692,14 @@ class Client(object):
|
||||
"""
|
||||
pass
|
||||
|
||||
def onChatTimestamp(self, buddylist={}, msg={}):
|
||||
"""
|
||||
Called when the client receives chat online presence update
|
||||
|
||||
:param buddylist: A list of dicts with friend id and last seen timestamp
|
||||
:param msg: A full set of the data recieved
|
||||
"""
|
||||
log.debug('Chat Timestamps received: {}'.format(buddylist))
|
||||
|
||||
def onUnknownMesssageType(self, msg={}):
|
||||
"""
|
||||
|
@@ -48,11 +48,11 @@ def get_customization_info(thread):
|
||||
rtn['nicknames'][k['participant_id']] = k.get('nickname')
|
||||
elif info.get('participant_customizations'):
|
||||
_id = thread.get('thread_key', {}).get('other_user_id') or thread.get('id')
|
||||
if info['participant_customizations'][0]['participant_id'] == _id:
|
||||
if len(info['participant_customizations']) > 0 and info['participant_customizations'][0]['participant_id'] == _id:
|
||||
rtn['nickname'] = info['participant_customizations'][0]
|
||||
if len(info['participant_customizations']) > 1:
|
||||
rtn['own_nickname'] = info['participant_customizations'][1]
|
||||
elif info['participant_customizations'][1]['participant_id'] == _id:
|
||||
elif len(info['participant_customizations']) > 1 and info['participant_customizations'][1]['participant_id'] == _id:
|
||||
rtn['nickname'] = info['participant_customizations'][1]
|
||||
if len(info['participant_customizations']) > 1:
|
||||
rtn['own_nickname'] = info['participant_customizations'][0]
|
||||
|
@@ -1,3 +1,4 @@
|
||||
requests
|
||||
lxml
|
||||
beautifulsoup4
|
||||
enum34
|
||||
|
2
setup.py
2
setup.py
@@ -18,7 +18,7 @@ with open('README.rst') as f:
|
||||
|
||||
try:
|
||||
requirements = [line.rstrip('\n') for line in open(os.path.join('fbchat.egg-info', 'requires.txt'))]
|
||||
except FileNotFoundError:
|
||||
except IOError:
|
||||
requirements = [line.rstrip('\n') for line in open('requirements.txt')]
|
||||
|
||||
version = None
|
||||
|
Reference in New Issue
Block a user