Advertisement
Markort

Bot for pinning suggestions in telegram group chat - EN version

Mar 27th, 2021
1,067
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.26 KB | None | 0 0
  1. #this bot is intended to be integrated with Amazon AWS Lambda and Gateway API
  2. #for further information on how to integrate with AWS and Telegram Bot API, I suggest to read related documentation
  3.  
  4. #it is intended to be used in group chats
  5. #it checks if a message contains a link or a suggestion for whatching a movie/clip/video or listening a song or reading a book
  6. #if the message matches those conditions, the bot asks to the users wheter to pin it or not
  7. #furthermore, the bot can unpin any pinned message whenever a user wants
  8. #it must be added into the group chat and needs for proper administrator permissions (pin, unpin and remove message)
  9.  
  10. #Be aware this is the English version! Enjoy it!
  11.  
  12. import json
  13. from time import sleep
  14.  
  15. #import os to integrate with AWS Lambda environment variables
  16. import os
  17. #import botocore.vendored to integrat with Telegram Bot API
  18. from botocore.vendored import requests
  19.  
  20. #TELE_TOKEN is Telegram Bot Token
  21. #URL_BOT is the base URL to communicate with Telegram Bots: "https://api.telegram.org/bot{}/"
  22. TELE_TOKEN = os.environ['TELE_TOKEN']
  23. URL = os.environ['URL_BOT'].format(TELE_TOKEN)
  24. #MY_ID is your telegram ID
  25. #Set it for logging
  26. myId = os.environ['MY_ID']
  27.  
  28. #Telegram Bot API communicating methods
  29. def send_message(text, chat_id, message_id):
  30.     url = URL + "sendMessage?text={}&chat_id={}&reply_to_message_id={}".format(text, chat_id, message_id)
  31.     requests.get(url)
  32.    
  33. def send_message_with_keyboard(text, chat_id, message_id, keyboard):
  34.     url = URL + "sendMessage?text={}&chat_id={}&reply_to_message_id={}&reply_markup={}".format(text, chat_id, message_id, keyboard)
  35.     requests.get(url)
  36.    
  37. def send_message_debug(text):
  38.     url = URL + "sendMessage?text={}&chat_id={}".format(text, myId)
  39.     requests.get(url)
  40.    
  41. def pin_message(chat_id, message_id):
  42.     url = URL + "pinChatMessage?chat_id={}&message_id={}".format(chat_id, message_id)
  43.     requests.get(url)
  44.  
  45. def delete_message(chat_id, message_id):
  46.     url = URL + "deleteMessage?chat_id={}&message_id={}".format(chat_id, message_id)
  47.     requests.get(url)
  48.    
  49. def edit_message_text(chat_id, message_id, text):
  50.     url = URL + "editMessageText?chat_id={}&message_id={}&text={}".format(chat_id, message_id, text)
  51.     requests.get(url)
  52.  
  53. def remove_reply_markup(chat_id, message_id):
  54.     url = URL + "editMessageReplyMarkup?chat_id={}&message_id={}".format(chat_id, message_id)
  55.     requests.get(url)
  56.  
  57. def update_reply_markup(chat_id, message_id, pinned_message_id, text):  
  58.     callbackData = "remove_pin_message|" + str(chat_id) + "|" + str(pinned_message_id)
  59.     inline_keyboard = [
  60.         [
  61.             {'text': 'Remove', 'callback_data': callbackData}
  62.         ]
  63.     ]
  64.     url = URL + "editMessageText?chat_id={}&message_id={}&reply_markup={}&text={}".format(chat_id, message_id, json.dumps({'inline_keyboard': inline_keyboard}), text)
  65.     requests.get(url)
  66.  
  67. def remove_pin_message(chat_id, message_id):
  68.     url = URL + "unpinChatMessage?chat_id={}&message_id={}".format(chat_id, message_id)
  69.     requests.get(url)
  70.  
  71. #message managing methods
  72. def manageMessage(body):  
  73.     message = body['message']  
  74.     if 'text' in message:
  75.         manageMessageWithText(message)
  76.     else:
  77.         send_message_debug("Found a new type of message: {}".format(message))
  78.  
  79. def manageMessageWithText(message):
  80.  
  81.     chat_id = message['chat']['id']
  82.     from_id = message['from']['id']
  83.     message_id = message['message_id']
  84.     message_text = message['text']
  85.     message_text = message_text.lower()
  86.    
  87.     if ( any(word in message_text for word in ["listen", "watch", "look", "read", "youtu.be", "youtube.", "https://", "http://"]) ):
  88.         callbackData = "pin_message|" + str(chat_id) + "|" + str(message_id)
  89.         callbackDataNo = "not_want_to_pin|Ok, I won't pin it."        
  90.         inline_keyboard = [
  91.             [
  92.                 {'text': 'OK', 'callback_data': callbackData},
  93.                 {'text': 'NO', 'callback_data': callbackDataNo}
  94.             ]
  95.         ]
  96.         send_message_with_keyboard("Shall I pin it?", chat_id, message_id, json.dumps({'inline_keyboard': inline_keyboard}))
  97.  
  98.  
  99. def manageCallbackQuery(body):
  100.     callbackQuery = body['callback_query']
  101.     data = callbackQuery['data'].split('|')
  102.     queryType = data[0]
  103.     if queryType == "delete_request":
  104.         message_id = callbackQuery['message']['message_id']
  105.         chat_id = callbackQuery['message']['chat']['id']
  106.         delete_message(chat_id, message_id)
  107.     elif queryType == 'pin_message':
  108.         inline_id = callbackQuery['message']['message_id']
  109.         inline_chat_id = callbackQuery['message']['chat']['id']
  110.         chat_id = data[1]
  111.         message_id = data[2]
  112.         update_reply_markup(inline_chat_id, inline_id, message_id, "Pinned it!")
  113.         pin_message(chat_id, message_id)
  114.     elif queryType == "not_want_to_pin":
  115.         message_id = callbackQuery['message']['message_id']
  116.         chat_id = callbackQuery['message']['chat']['id']
  117.         new_text = data[1]
  118.         delete_message(chat_id, message_id)
  119.     elif queryType == "remove_pin_message":
  120.         chat_id = data[1]
  121.         message_id = data[2]
  122.         inline_id = callbackQuery['message']['message_id']
  123.         inline_chat_id = callbackQuery['message']['chat']['id']
  124.         remove_pin_message(chat_id, message_id)
  125.         edit_message_text(inline_chat_id, inline_id, "Unpinned it!")
  126.     else:
  127.         send_message_debug("Found unexpected callback_query: {}".format(callback_query))
  128.  
  129. #this is the main method
  130. #it must be named "lambda_handler", for AWS Lambda integration
  131. #it must return 'statusCode': 200, for Telegram Bot API integration
  132. def lambda_handler(event, context):
  133.     myIdNum = int(myId)
  134.     try:
  135.         if 'body' in event:    
  136.             body = json.loads(event['body'])    
  137.             if 'callback_query' in body:
  138.                 manageCallbackQuery(body)
  139.             elif 'message' in body:
  140.                 manageMessage(body)
  141.             else:
  142.                 send_message_debug("Found a new type of body: " + body)    
  143.         else:
  144.             send_message_debug("Found a body-less event: {}".format(event))
  145.     except Exception as err:
  146.         send_message_debug("An error occured: {}. For event {}".format(err, event))
  147.     finally:
  148.         return {
  149.             'statusCode': 200
  150.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement