mirror of
https://github.com/pyrogram/pyrogram
synced 2025-08-28 21:07:59 +00:00
Merge #221, string sessions now work for bots too
This commit is contained in:
parent
fd5889d69e
commit
9c4e9e166e
@ -281,14 +281,15 @@ class Client(Methods, BaseClient):
|
|||||||
if self.is_started:
|
if self.is_started:
|
||||||
raise ConnectionError("Client has already been started")
|
raise ConnectionError("Client has already been started")
|
||||||
|
|
||||||
if self.BOT_TOKEN_RE.match(self.session_name):
|
if isinstance(self.session_storage, JsonSessionStorage):
|
||||||
self.is_bot = True
|
if self.BOT_TOKEN_RE.match(self.session_storage.session_data):
|
||||||
self.bot_token = self.session_name
|
self.is_bot = True
|
||||||
self.session_name = self.session_name.split(":")[0]
|
self.bot_token = self.session_storage.session_data
|
||||||
warnings.warn('\nYou are using a bot token as session name.\n'
|
self.session_storage.session_data = self.session_storage.session_data.split(":")[0]
|
||||||
'It will be deprecated in next update, please use session file name to load '
|
warnings.warn('\nYou are using a bot token as session name.\n'
|
||||||
'existing sessions and bot_token argument to create new sessions.',
|
'It will be deprecated in next update, please use session file name to load '
|
||||||
DeprecationWarning, stacklevel=2)
|
'existing sessions and bot_token argument to create new sessions.',
|
||||||
|
DeprecationWarning, stacklevel=2)
|
||||||
|
|
||||||
self.load_config()
|
self.load_config()
|
||||||
self.load_session()
|
self.load_session()
|
||||||
|
@ -70,7 +70,6 @@ class BaseClient(SessionStorageMixin):
|
|||||||
|
|
||||||
def __init__(self, session_storage: BaseSessionStorage):
|
def __init__(self, session_storage: BaseSessionStorage):
|
||||||
self.session_storage = session_storage
|
self.session_storage = session_storage
|
||||||
self.is_bot = False
|
|
||||||
|
|
||||||
self.rnd_id = MsgId
|
self.rnd_id = MsgId
|
||||||
self.channels_pts = {}
|
self.channels_pts = {}
|
||||||
|
@ -35,6 +35,7 @@ class BaseSessionStorage(abc.ABC):
|
|||||||
self.auth_key = None
|
self.auth_key = None
|
||||||
self.user_id = None
|
self.user_id = None
|
||||||
self.date = 0
|
self.date = 0
|
||||||
|
self.is_bot = False
|
||||||
self.peers_by_id = {}
|
self.peers_by_id = {}
|
||||||
self.peers_by_username = {}
|
self.peers_by_username = {}
|
||||||
self.peers_by_phone = {}
|
self.peers_by_phone = {}
|
||||||
|
@ -50,6 +50,7 @@ class JsonSessionStorage(BaseSessionStorage):
|
|||||||
self.auth_key = base64.b64decode("".join(s["auth_key"])) # join split key
|
self.auth_key = base64.b64decode("".join(s["auth_key"])) # join split key
|
||||||
self.user_id = s["user_id"]
|
self.user_id = s["user_id"]
|
||||||
self.date = s.get("date", 0)
|
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():
|
for k, v in s.get("peers_by_id", {}).items():
|
||||||
self.peers_by_id[int(k)] = utils.get_input_peer(int(k), v)
|
self.peers_by_id[int(k)] = utils.get_input_peer(int(k), v)
|
||||||
@ -85,6 +86,7 @@ class JsonSessionStorage(BaseSessionStorage):
|
|||||||
'auth_key': auth_key,
|
'auth_key': auth_key,
|
||||||
'user_id': self.user_id,
|
'user_id': self.user_id,
|
||||||
'date': self.date,
|
'date': self.date,
|
||||||
|
'is_bot': self.is_bot,
|
||||||
'peers_by_id': {
|
'peers_by_id': {
|
||||||
k: getattr(v, "access_hash", None)
|
k: getattr(v, "access_hash", None)
|
||||||
for k, v in self.peers_by_id.copy().items()
|
for k, v in self.peers_by_id.copy().items()
|
||||||
|
@ -60,6 +60,14 @@ class SessionStorageMixin:
|
|||||||
def date(self, val):
|
def date(self, val):
|
||||||
self.session_storage.date = 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
|
@property
|
||||||
def peers_by_id(self) -> Dict[str, int]:
|
def peers_by_id(self) -> Dict[str, int]:
|
||||||
return self.session_storage.peers_by_id
|
return self.session_storage.peers_by_id
|
||||||
|
@ -11,24 +11,31 @@ class StringSessionStorage(BaseSessionStorage):
|
|||||||
Char dc_id (1 byte, unsigned)
|
Char dc_id (1 byte, unsigned)
|
||||||
Boolean test_mode (1 byte)
|
Boolean test_mode (1 byte)
|
||||||
Long long user_id (8 bytes, signed)
|
Long long user_id (8 bytes, signed)
|
||||||
|
Boolean is_bot (1 byte)
|
||||||
Bytes auth_key (256 bytes)
|
Bytes auth_key (256 bytes)
|
||||||
|
|
||||||
Uses Base64 encoding for printable representation
|
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):
|
def load_session(self):
|
||||||
try:
|
try:
|
||||||
session_string = self.session_data[1:]
|
session_string = self.session_data[1:]
|
||||||
session_string += '=' * (4 - len(session_string) % 4) # restore padding
|
session_string += '=' * (4 - len(session_string) % 4) # restore padding
|
||||||
decoded = base64.b64decode(session_string, b'-_')
|
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):
|
except (struct.error, binascii.Error):
|
||||||
raise SessionDoesNotExist()
|
raise SessionDoesNotExist()
|
||||||
|
|
||||||
def save_session(self, sync=False):
|
def save_session(self, sync=False):
|
||||||
if not sync:
|
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('=')
|
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)])
|
split = '\n'.join(['"{}"'.format(encoded[i: i + 50]) for i in range(0, len(encoded), 50)])
|
||||||
print('Created session string:\n{}'.format(split))
|
print('Created session string:\n{}'.format(split))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user