Support clicking buttons that require password

Should close #1716.
This commit is contained in:
Lonami Exo 2021-03-07 16:36:26 +01:00
parent 3ee94bdc5e
commit bfa7e4ca37
2 changed files with 23 additions and 15 deletions

View File

@ -832,7 +832,7 @@ class Message(ChatGetter, SenderGetter, TLObject):
async def click(self, i=None, j=None,
*, text=None, filter=None, data=None, share_phone=None,
share_geo=None):
share_geo=None, password=None):
"""
Calls :tl:`SendVote` with the specified poll option
or `button.click <telethon.tl.custom.messagebutton.MessageButton.click>`
@ -911,6 +911,12 @@ class Message(ChatGetter, SenderGetter, TLObject):
If the button is pressed without this, `ValueError` is raised.
password (`str`):
When clicking certain buttons (such as BotFather's confirmation
button to transfer ownership), if your account has 2FA enabled,
you need to provide your account's password. Otherwise,
`teltehon.errors.PasswordHashInvalidError` is raised.
Example:
.. code-block:: python
@ -934,19 +940,13 @@ class Message(ChatGetter, SenderGetter, TLObject):
return
if data:
if not await self.get_input_chat():
chat = await self.get_input_chat()
if not chat:
return None
try:
return await self._client(
functions.messages.GetBotCallbackAnswerRequest(
peer=self._input_chat,
msg_id=self.id,
data=data
)
)
except errors.BotResponseTimeoutError:
return None
but = types.KeyboardButtonCallback('', data)
return await MessageButton(self._client, but, chat, None, self.id).click(
share_phone=share_phone, share_geo=share_geo, password=password)
if sum(int(x is not None) for x in (i, text, filter)) >= 2:
raise ValueError('You can only set either of i, text or filter')
@ -1018,7 +1018,8 @@ class Message(ChatGetter, SenderGetter, TLObject):
button = find_button()
if button:
return await button.click(share_phone=share_phone, share_geo=share_geo)
return await button.click(
share_phone=share_phone, share_geo=share_geo, password=password)
async def mark_read(self):
"""

View File

@ -1,6 +1,8 @@
from .. import types, functions
from ... import password as pwd_mod
from ...errors import BotResponseTimeoutError
import webbrowser
import os
class MessageButton:
@ -59,7 +61,7 @@ class MessageButton:
if isinstance(self.button, types.KeyboardButtonUrl):
return self.button.url
async def click(self, share_phone=None, share_geo=None):
async def click(self, share_phone=None, share_geo=None, *, password=None):
"""
Emulates the behaviour of clicking this button.
@ -93,8 +95,13 @@ class MessageButton:
return await self._client.send_message(
self._chat, self.button.text, parse_mode=None)
elif isinstance(self.button, types.KeyboardButtonCallback):
if password is not None:
pwd = await self._client(functions.account.GetPasswordRequest())
password = pwd_mod.compute_check(pwd, password)
req = functions.messages.GetBotCallbackAnswerRequest(
peer=self._chat, msg_id=self._msg_id, data=self.button.data
peer=self._chat, msg_id=self._msg_id, data=self.button.data,
password=password
)
try:
return await self._client(req)