2
0
mirror of https://github.com/pyrogram/pyrogram synced 2025-08-28 04:48:06 +00:00

Merge #221, string sessions now work for bots too

This commit is contained in:
bakatrouble 2019-02-22 02:13:51 +03:00
parent fd5889d69e
commit 9c4e9e166e
6 changed files with 30 additions and 12 deletions

View File

@ -281,14 +281,15 @@ class Client(Methods, BaseClient):
if self.is_started:
raise ConnectionError("Client has already been started")
if self.BOT_TOKEN_RE.match(self.session_name):
self.is_bot = True
self.bot_token = self.session_name
self.session_name = self.session_name.split(":")[0]
warnings.warn('\nYou are using a bot token as session name.\n'
'It will be deprecated in next update, please use session file name to load '
'existing sessions and bot_token argument to create new sessions.',
DeprecationWarning, stacklevel=2)
if isinstance(self.session_storage, JsonSessionStorage):
if self.BOT_TOKEN_RE.match(self.session_storage.session_data):
self.is_bot = True
self.bot_token = self.session_storage.session_data
self.session_storage.session_data = self.session_storage.session_data.split(":")[0]
warnings.warn('\nYou are using a bot token as session name.\n'
'It will be deprecated in next update, please use session file name to load '
'existing sessions and bot_token argument to create new sessions.',
DeprecationWarning, stacklevel=2)
self.load_config()
self.load_session()

View File

@ -70,7 +70,6 @@ class BaseClient(SessionStorageMixin):
def __init__(self, session_storage: BaseSessionStorage):
self.session_storage = session_storage
self.is_bot = False
self.rnd_id = MsgId
self.channels_pts = {}

View File

@ -35,6 +35,7 @@ class BaseSessionStorage(abc.ABC):
self.auth_key = None
self.user_id = None
self.date = 0
self.is_bot = False
self.peers_by_id = {}
self.peers_by_username = {}
self.peers_by_phone = {}

View File

@ -50,6 +50,7 @@ class JsonSessionStorage(BaseSessionStorage):
self.auth_key = base64.b64decode("".join(s["auth_key"])) # join split key
self.user_id = s["user_id"]
self.date = s.get("date", 0)
self.is_bot = s.get('is_bot', self.client.is_bot)
for k, v in s.get("peers_by_id", {}).items():
self.peers_by_id[int(k)] = utils.get_input_peer(int(k), v)
@ -85,6 +86,7 @@ class JsonSessionStorage(BaseSessionStorage):
'auth_key': auth_key,
'user_id': self.user_id,
'date': self.date,
'is_bot': self.is_bot,
'peers_by_id': {
k: getattr(v, "access_hash", None)
for k, v in self.peers_by_id.copy().items()

View File

@ -60,6 +60,14 @@ class SessionStorageMixin:
def date(self, val):
self.session_storage.date = val
@property
def is_bot(self):
return self.session_storage.is_bot
@is_bot.setter
def is_bot(self, val) -> int:
self.session_storage.is_bot = val
@property
def peers_by_id(self) -> Dict[str, int]:
return self.session_storage.peers_by_id

View File

@ -11,24 +11,31 @@ class StringSessionStorage(BaseSessionStorage):
Char dc_id (1 byte, unsigned)
Boolean test_mode (1 byte)
Long long user_id (8 bytes, signed)
Boolean is_bot (1 byte)
Bytes auth_key (256 bytes)
Uses Base64 encoding for printable representation
"""
PACK_FORMAT = '<B?q256s'
PACK_FORMAT = '<B?q?256s'
def _unpack(self, data):
return struct.unpack(self.PACK_FORMAT, data)
def _pack(self):
return struct.pack(self.PACK_FORMAT, self.dc_id, self.test_mode, self.user_id, self.is_bot, self.auth_key)
def load_session(self):
try:
session_string = self.session_data[1:]
session_string += '=' * (4 - len(session_string) % 4) # restore padding
decoded = base64.b64decode(session_string, b'-_')
self.dc_id, self.test_mode, self.user_id, self.auth_key = struct.unpack(self.PACK_FORMAT, decoded)
self.dc_id, self.test_mode, self.user_id, self.is_bot, self.auth_key = self._unpack(decoded)
except (struct.error, binascii.Error):
raise SessionDoesNotExist()
def save_session(self, sync=False):
if not sync:
packed = struct.pack(self.PACK_FORMAT, self.dc_id, self.test_mode, self.user_id, self.auth_key)
packed = self._pack()
encoded = ':' + base64.b64encode(packed, b'-_').decode('latin-1').rstrip('=')
split = '\n'.join(['"{}"'.format(encoded[i: i + 50]) for i in range(0, len(encoded), 50)])
print('Created session string:\n{}'.format(split))