Repository: python-telegram-bot/python-telegram-bot
Pull request: extend deeplinking example
Closes #2318 

Problem statement:
Showcase answer_callback_query with deeplinking URL
Instead of using the deeplinking URL directly in text links or inline buttons, one can also use them as `answer_inline_query(url=deeplinking_url)`, as done e.g. by @spoilerobot . I think it would be a good idea to include this option in the `deeplinking.py` example somehow.

Hints from issue discussion:

Commit message: extend deeplinking example

Signed-off-by: starry69 <starry369126@outlook.com>

Patch to review:
diff --git a/examples/deeplinking.py b/examples/deeplinking.py
index e0886b2e5f4..8e2984fd628 100644
--- a/examples/deeplinking.py
+++ b/examples/deeplinking.py
@@ -22,21 +22,31 @@
 import logging
 
 from telegram import ParseMode, InlineKeyboardMarkup, InlineKeyboardButton, Update
-from telegram.ext import Updater, CommandHandler, Filters, CallbackContext
+from telegram.ext import (
+    Updater,
+    CommandHandler,
+    CallbackQueryHandler,
+    Filters,
+    CallbackContext,
+)
 
 # Enable logging
 from telegram.utils import helpers
 
 logging.basicConfig(
-    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO
+    format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", level=logging.INFO
 )
 
 logger = logging.getLogger(__name__)
 
 # Define constants that will allow us to reuse the deep-linking parameters.
-CHECK_THIS_OUT = 'check-this-out'
-USING_ENTITIES = 'using-entities-here'
-SO_COOL = 'so-cool'
+CHECK_THIS_OUT = "check-this-out"
+USING_ENTITIES = "using-entities-here"
+USING_KEYBOARD = "using-keyboard-here"
+SO_COOL = "so-cool"
+
+# Callback data to pass in 3rd level deeplinking
+KEYBOARD_CALLBACKDATA = "keyboard-callback-data"
 
 
 def start(update: Update, context: CallbackContext) -> None:
@@ -56,7 +66,7 @@ def deep_linked_level_1(update: Update, context: CallbackContext) -> None:
         " Now let's get back to the private chat."
     )
     keyboard = InlineKeyboardMarkup.from_button(
-        InlineKeyboardButton(text='Continue here!', url=url)
+        InlineKeyboardButton(text="Continue here!", url=url)
     )
     update.message.reply_text(text, reply_markup=keyboard)
 
@@ -71,6 +81,23 @@ def deep_linked_level_2(update: Update, context: CallbackContext) -> None:
 
 def deep_linked_level_3(update: Update, context: CallbackContext) -> None:
     """Reached through the USING_ENTITIES payload"""
+    update.message.reply_text(
+        "It is also possible to make deep-linking using InlineKeyboardButtons.",
+        reply_markup=InlineKeyboardMarkup(
+            [[InlineKeyboardButton(text="Like this!", callback_data=KEYBOARD_CALLBACKDATA)]]
+        ),
+    )
+
+
+def deep_link_level_3_callback(update: Update, context: CallbackContext) -> None:
+    """Answers CallbackQuery with deeplinking url."""
+    bot = context.bot
+    url = helpers.create_deep_linked_url(bot.get_me().username, USING_KEYBOARD)
+    update.callback_query.answer(url=url)
+
+
+def deep_linked_level_4(update: Update, context: CallbackContext) -> None:
+    """Reached through the USING_KEYBOARD payload"""
     payload = context.args
     update.message.reply_text(
         f"Congratulations! This is as deep as it gets 👏🏻\n\nThe payload was: {payload}"
@@ -101,6 +128,16 @@ def main():
         CommandHandler("start", deep_linked_level_3, Filters.regex(USING_ENTITIES), pass_args=True)
     )
 
+    # Possible with inline keyboard buttons aswell
+    dispatcher.add_handler(
+        CommandHandler("start", deep_linked_level_4, Filters.regex(USING_KEYBOARD))
+    )
+
+    # register callback handler for inline keyboard button
+    dispatcher.add_handler(
+        CallbackQueryHandler(deep_link_level_3_callback, pattern=KEYBOARD_CALLBACKDATA)
+    )
+
     # Make sure the deep-linking handlers occur *before* the normal /start handler.
     dispatcher.add_handler(CommandHandler("start", start))
 
@@ -113,5 +150,5 @@ def main():
     updater.idle()
 
 
-if __name__ == '__main__':
+if __name__ == "__main__":
     main()


Code review comments:
diff_hunk: @@ -71,6 +81,23 @@ def deep_linked_level_2(update: Update, context: CallbackContext) -> None:
 
 def deep_linked_level_3(update: Update, context: CallbackContext) -> None:
     """Reached through the USING_ENTITIES payload"""
+    update.message.reply_text(
+        "It is also possible to make deep-linking using InlineKeyboardButtons.",
+        reply_markup=InlineKeyboardMarkup(
+            [[InlineKeyboardButton(text="Like this!", callback_data=KEYBOARD_CALLBACKDATA)]]
+        ),
+    )
+
+
+def deep_link_level_3_callback(update: Update, context: CallbackContext) -> None:
+    """Answers CallbackQuery with deeplinking url."""
+    bot = context.bot
+    url = helpers.create_deep_linked_url(bot.get_me().username, USING_KEYBOARD)
path: examples/deeplinking.py
text: @user1:
doesn't `Bot` have a convenience property for the username? 🤔 

@author:
You're right, i just followed how it was done for other deeplinking levels without thinking, will change 👍