getUserId in progress

This commit is contained in:
Taehoon Kim
2015-04-19 02:46:25 +09:00
parent 256a1b496c
commit 05f2613997
2 changed files with 88 additions and 12 deletions

View File

@@ -6,13 +6,27 @@ Core components for fbchat
""" """
import re
import json
import random
import requests import requests
import time
from time import time
from uuid import uuid1
from random import random
from bs4 import BeautifulSoup as bs from bs4 import BeautifulSoup as bs
from .utils import *
CHROME = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36" CHROME = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36"
SAFARI = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/601.1.10 (KHTML, like Gecko) Version/8.0.5 Safari/601.1.10" SAFARI = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/601.1.10 (KHTML, like Gecko) Version/8.0.5 Safari/601.1.10"
def now():
return int(time())
def get_json(text):
return json.loads(re.sub(r"for.*(.*;.*;.*).*;", '', text.decode("unicode-escape").encode("utf-8")))
class Client(object): class Client(object):
"""A client for the Facebook Chat (Messenger). """A client for the Facebook Chat (Messenger).
@@ -51,14 +65,20 @@ class Client(object):
'Connection' : 'keep-alive', 'Connection' : 'keep-alive',
} }
self.console("Logging in...") self._console("Logging in...")
if not self.login(): if not self.login():
raise Exception("id or password is wrong") raise Exception("id or password is wrong")
def console(self, msg): def _console(self, msg):
if self.debug: print(msg) if self.debug: print(msg)
def _get(self, url, query=None, timeout=30):
return self._session.get(url, headers=self._header, params=query, timeout=timeout)
def _post(self, url, query=None, timeout=30):
return self._session.post(url, headers=self._header, data=query, timeout=timeout)
def login(self): def login(self):
if not (self.email and self.password): if not (self.email and self.password):
raise Exception("id and password or config is needed") raise Exception("id and password or config is needed")
@@ -71,22 +91,66 @@ class Client(object):
r = self._post("https://m.facebook.com/login.php?login_attempt=1", data) r = self._post("https://m.facebook.com/login.php?login_attempt=1", data)
if 'expires' in r.headers.keys(): if 'home' in r.url:
self.client_id = hex(int(random()*2147483648))[2:]
self.start_time = now()
self.user_id = self._session.cookies['c_user']
self.user_channel = "p_" + self.user_id
self.ttstamp = ''
r = self._get('https://www.facebook.com/')
self.rev = int(r.text.split('"revision":',1)[1].split(",",1)[0])
soup = bs(r.text)
fb_dtsg = soup.find("input", {'name':'fb_dtsg'})['value']
for i in fb_dtsg:
self.ttstamp += str(ord(i))
self.ttstamp += '2'
self.form = {
'channel' : self.user_channel,
'seq' : '0',
'partition' : '-2',
'clientid' : self.client_id,
'viewer_uid' : self.user_id,
'uid' : self.user_id,
'state' : 'active',
'format' : 'json',
'idle' : 0,
'cap' : '8'
}
self.prev = now()
self.tmp_prev = now()
self.last_sync = now()
self.req_counter = 1;
return True return True
else: else:
return False return False
def _get(self, url, query=None, timeout=30):
return self._session.get(url, headers=self._header, params=query, timeout=timeout)
def _post(self, url, query=None, timeout=30):
return self._session.post(url, headers=self._header, data=query, timeout=timeout)
def listen(self): def listen(self):
pass pass
def getUserId(self): def getUserId(self, name):
pass payload = {
'value' : name.lower(),
'viewer' : self.user_id,
'rsp' : "search",
'context' : "search",
'path' : "/home.php",
'request_id' : str(uuid1()),
'__user' : self.user_id,
'__a' : '1',
'__req' : str_base(self.req_counter, 36),
'__rev' : self.rev,
}
self.req_counter += 1
r = self._get("https://www.facebook.com/ajax/typeahead/search.php", payload)
self.j = get_json(r.text)
self.r = r
def sendMessage(self): def sendMessage(self):
pass pass

12
fbchat/utils.py Normal file
View File

@@ -0,0 +1,12 @@
def digit_to_char(digit):
if digit < 10:
return str(digit)
return chr(ord('a') + digit - 10)
def str_base(number,base):
if number < 0:
return '-' + str_base(-number, base)
(d, m) = divmod(number, base)
if d > 0:
return str_base(d, base) + digit_to_char(m)
return digit_to_char(m)