Add bot_token argument (#221)

* Add bot_token argument (closes #123)

* Make session_name docs more readable and detailed

* Explicitely set is_bot=False
This commit is contained in:
bakatrouble 2019-03-01 20:30:39 +03:00 committed by Dan
parent 87c4d08d9c
commit f84f9ec4df
3 changed files with 25 additions and 7 deletions

View File

@ -29,6 +29,7 @@ import struct
import tempfile import tempfile
import threading import threading
import time import time
import warnings
from configparser import ConfigParser from configparser import ConfigParser
from datetime import datetime from datetime import datetime
from hashlib import sha256, md5 from hashlib import sha256, md5
@ -67,10 +68,10 @@ class Client(Methods, BaseClient):
Args: Args:
session_name (``str``): session_name (``str``):
Name to uniquely identify a session of either a User or a Bot. Name to uniquely identify a session of either a User or a Bot, e.g.: "my_account". This name will be used
For Users: pass a string of your choice, e.g.: "my_main_account". to save a file to disk that stores details needed for reconnecting without asking again for credentials.
For Bots: pass your Bot API token, e.g.: "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11" Note for bots: You can pass a bot token here, but this usage will be deprecated in next releases.
Note: as long as a valid User session file exists, Pyrogram won't ask you again to input your phone number. Use *bot_token* instead.
api_id (``int``, *optional*): api_id (``int``, *optional*):
The *api_id* part of your Telegram API Key, as integer. E.g.: 12345 The *api_id* part of your Telegram API Key, as integer. E.g.: 12345
@ -144,6 +145,10 @@ class Client(Methods, BaseClient):
a new Telegram account in case the phone number you passed is not registered yet. a new Telegram account in case the phone number you passed is not registered yet.
Only applicable for new sessions. Only applicable for new sessions.
bot_token (``str``, *optional*):
Pass your Bot API token to create a bot session, e.g.: "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11"
Only applicable for new sessions.
last_name (``str``, *optional*): last_name (``str``, *optional*):
Same purpose as *first_name*; pass a Last Name to avoid entering it manually. It can Same purpose as *first_name*; pass a Last Name to avoid entering it manually. It can
be an empty string: "". Only applicable for new sessions. be an empty string: "". Only applicable for new sessions.
@ -192,6 +197,7 @@ class Client(Methods, BaseClient):
password: str = None, password: str = None,
recovery_code: callable = None, recovery_code: callable = None,
force_sms: bool = False, force_sms: bool = False,
bot_token: str = None,
first_name: str = None, first_name: str = None,
last_name: str = None, last_name: str = None,
workers: int = BaseClient.WORKERS, workers: int = BaseClient.WORKERS,
@ -218,6 +224,7 @@ class Client(Methods, BaseClient):
self.password = password self.password = password
self.recovery_code = recovery_code self.recovery_code = recovery_code
self.force_sms = force_sms self.force_sms = force_sms
self.bot_token = bot_token
self.first_name = first_name self.first_name = first_name
self.last_name = last_name self.last_name = last_name
self.workers = workers self.workers = workers
@ -263,8 +270,13 @@ class Client(Methods, BaseClient):
raise ConnectionError("Client has already been started") raise ConnectionError("Client has already been started")
if self.BOT_TOKEN_RE.match(self.session_name): if self.BOT_TOKEN_RE.match(self.session_name):
self.is_bot = True
self.bot_token = self.session_name self.bot_token = self.session_name
self.session_name = self.session_name.split(":")[0] 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)
self.load_config() self.load_config()
self.load_session() self.load_session()
@ -282,13 +294,15 @@ class Client(Methods, BaseClient):
try: try:
if self.user_id is None: if self.user_id is None:
if self.bot_token is None: if self.bot_token is None:
self.is_bot = False
self.authorize_user() self.authorize_user()
else: else:
self.is_bot = True
self.authorize_bot() self.authorize_bot()
self.save_session() self.save_session()
if self.bot_token is None: if not self.is_bot:
if self.takeout: if self.takeout:
self.takeout_id = self.send(functions.account.InitTakeoutSession()).id self.takeout_id = self.send(functions.account.InitTakeoutSession()).id
log.warning("Takeout session {} initiated".format(self.takeout_id)) log.warning("Takeout session {} initiated".format(self.takeout_id))
@ -1113,6 +1127,8 @@ class Client(Methods, BaseClient):
self.auth_key = base64.b64decode("".join(s["auth_key"])) self.auth_key = base64.b64decode("".join(s["auth_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)
# TODO: replace default with False once token session name will be deprecated
self.is_bot = s.get("is_bot", self.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)
@ -1246,7 +1262,8 @@ class Client(Methods, BaseClient):
test_mode=self.test_mode, test_mode=self.test_mode,
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,
), ),
f, f,
indent=4 indent=4

View File

@ -68,7 +68,7 @@ class BaseClient:
} }
def __init__(self): def __init__(self):
self.bot_token = None self.is_bot = None
self.dc_id = None self.dc_id = None
self.auth_key = None self.auth_key = None
self.user_id = None self.user_id = None

View File

@ -94,6 +94,7 @@ class Syncer:
auth_key=auth_key, auth_key=auth_key,
user_id=client.user_id, user_id=client.user_id,
date=int(time.time()), date=int(time.time()),
is_bot=client.is_bot,
peers_by_id={ peers_by_id={
k: getattr(v, "access_hash", None) k: getattr(v, "access_hash", None)
for k, v in client.peers_by_id.copy().items() for k, v in client.peers_by_id.copy().items()