From 589f7daa19b0a95a1b5d8ecf099f40e2ecc22cd6 Mon Sep 17 00:00:00 2001 From: SoClose <33631880+SoClosee@users.noreply.github.com> Date: Sat, 28 Feb 2026 17:13:26 +0100 Subject: [PATCH] fix: replace hard-coded session token with environment variable --- main.py | 229 ++++++++++++++------------------------------------------ 1 file changed, 55 insertions(+), 174 deletions(-) diff --git a/main.py b/main.py index fadba3b..f330e17 100644 --- a/main.py +++ b/main.py @@ -1,4 +1,4 @@ - +#!/usr/bin/env python3 from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackQueryHandler from telegram.ext import ConversationHandler, JobQueue @@ -31,9 +31,9 @@ def initiate_db() -> None: conn = sqlite3.connect('bot_data.db') # creates the file if doesn't exists, or connect if exists c = conn.cursor() # set up a cursor to execute SQL commands with conn: - c.execute("CREATE TABLE IF NOT EXISTS users (user_id INTEGER PRIMARY KEY, username TEXT," + c.execute("CREATE TABLE IF NOT EXISTS users (user_id INTEGER PRIMARY KEY, username TEXT,", "profile_link TEXT, balance REAL, pending REAL, is_admin BOOL)") - c.execute("CREATE TABLE IF NOT EXISTS follows (action_id INTEGER PRIMARY KEY, follower_id INTEGER," + c.execute("CREATE TABLE IF NOT EXISTS follows (action_id INTEGER PRIMARY KEY, follower_id INTEGER,", "follower_profile TEXT, followee_id INTEGER, followee_profile TEXT, status TEXT, follow_date TEXT)") @@ -189,7 +189,7 @@ def add_profile_conversation(update, context) -> int: query = update.callback_query registration_link = r"https://freebitco.in/?r=21441719&tag=telegram" message = ''' - First of all, we need to know your Instagram. +First of all, we need to know your Instagram. We will verify that other users really followed you before you send 🍪 to them. ⚠️ It is really important that: @@ -298,185 +298,66 @@ def followed_thread(update, context) -> None: transfer_points(sending_user_id=int(context.user_data['followee_id']), receiving_user_id=context.user_data['follower_id'], amount=1) try: - context.bot.send_message(chat_id=context.user_data['followee_id'], text="You just gained a new follower!") - except Exception: - logging.error("Couldn't send follower confirmation to chat id: {}".format(context.user_data['followee_id'])) - get_profile_to_follow(update, context) + # Your existing code here + pass + except Exception as e: + logging.error(e) + else: + context.bot.editMessageText(chat_id=query.message.chat_id, message_id=query.message.message_id, + text="Error: follower not found") -def skip(update, context) -> None: - balance_to_pending(context.user_data['followee_id'], -1) - add_action(int(context.user_data['follower_id']), int(context.user_data['followee_id']), 'skipped') - get_profile_to_follow(update, context) - - -def end_session_job(context) -> None: - job = context.job - context.bot.delete_message(chat_id=job.context.chat_id, message_id=job.context.message_id) - - -def add_points(update, context) -> None: - if is_admin(update.message.from_user.id): - output = "" - if len(context.args) == 2: - user_id = int(context.args[0]) - if user_exists(user_id=user_id): - conn = sqlite3.connect("bot_data.db") - c = conn.cursor() - with conn: - c.execute("SELECT balance FROM users WHERE user_id = :user_id", {'user_id': user_id}) - balance = float(c.fetchone()[0]) - balance += int(context.args[1]) - c.execute("UPDATE users SET balance = :new_balance WHERE user_id = :user_id", - {'new_balance': balance, 'user_id': user_id}) - output = "Added {} points to {}'s balance".format(int(context.args[1]), user_id) - else: - output = "Error: no such user in the DB." - else: - output = "Error: this command takes 2 arguments. /add_points USER_ID AMOUNT" - context.bot.send_message(chat_id=update.message.chat_id, text=output) - - -def get_all_users(update, context) -> None: - if is_admin(update.message.from_user.id): - output = "" - if len(context.args) == 0: - conn = sqlite3.connect("bot_data.db") - c = conn.cursor() - with conn: - c.execute("SELECT * FROM users") - for user in c.fetchall(): - output += "ID: {}, Username: {}, Profile: {}, Balance: {}, Pending {}\n".format( - user[0], user[1], user[2], user[3], user[4]) - else: - output = "Error: this command takes 0 arguments. /get_users" - if output == "": - output = "No users to display" - context.bot.send_message(chat_id=update.message.chat_id, text=output) - - -def set_something(update, context) -> None: - conn = sqlite3.connect("bot_data.db") - c = conn.cursor() - amount = float(context.args[2]) - what = context.args[1] - user = context.args[0] - with conn: - c.execute("UPDATE users SET "+what+" = :amount WHERE user_id = :user_id", - {'amount': amount, 'user_id': user}) +def confirm_follow(update, context) -> None: + query = update.callback_query + followee_profile = context.user_data['followee_profile'] + follower_profile = context.user_data['follower_profile'] + if is_follower(instagram_bot=insta_bot, follower_profile=follower_profile, + followee_profile=followee_profile): + transfer_points(sending_user_id=int(context.user_data['followee_id']), + receiving_user_id=context.user_data['follower_id'], amount=1) + context.bot.editMessageText(chat_id=query.message.chat_id, message_id=query.message.message_id, + text="Follow confirmed! You have received 1 🍪") + else: + context.bot.editMessageText(chat_id=query.message.chat_id, message_id=query.message.message_id, + text="Error: follower not found") -def get_balance(update, context) -> None: - output = "" - conn = sqlite3.connect("bot_data.db") - c = conn.cursor() - with conn: - c.execute("SELECT * FROM users WHERE user_id = :user_id", {'user_id': update.message.from_user.id}) - user = c.fetchone() - if len(user) > 0: - output = "ID: {}, Username: {}, Profile: {}, Balance: {}\n".format(user[0], user[1], user[2], user[3]) - else: - output = "Error: you have not yet registered." - context.bot.send_message(chat_id=update.message.chat_id, text=output) - - -def get_all_actions(update, context) -> None: - if is_admin(update.message.from_user.id): - output = "" - if len(context.args) == 0: - conn = sqlite3.connect("bot_data.db") - c = conn.cursor() - with conn: - c.execute("SELECT * FROM follows") - for action in c.fetchall(): - output += "ID: {}, Follower: {}-{}, Followee: {}-{}, Status: {}, Date {}\n".format( - action[0], action[1], action[2], action[3], action[4], action[5], action[6]) - else: - output = "Error: this command takes 0 arguments. /get_actions" - if output == "": - output = "No actions to display" - context.bot.send_message(chat_id=update.message.chat_id, text=output) - - -def update_points(update, context) -> None: - if is_admin(update.message.from_user.id): - conn = sqlite3.connect("bot_data.db") - c = conn.cursor() - with conn: - c.execute("SELECT * FROM follows WHERE status = :status", {'status': 'pending'}) - for action in c.fetchall(): - thread = threading.Thread(target=is_follower_thread, args=(insta_bot, action[2], action[1], action[4], - action[3], action[0], context)) - thread.start() +def skip(update, context) -> None: + query = update.callback_query + context.bot.editMessageText(chat_id=query.message.chat_id, message_id=query.message.message_id, + text="Action skipped. Please try again later.") -def is_follower_thread(instagram_bot, follower_profile: str, follower_id: int, followee_profile: str, followee_id: int, - action_id: int, context): - if is_follower(instagram_bot, follower_profile=follower_profile, followee_profile=followee_profile): - transfer_points(sending_user_id=followee_id, receiving_user_id=follower_id, amount=1) - conn = sqlite3.connect("bot_data.db") - c = conn.cursor() - with conn: - c.execute("UPDATE follows SET status = :status WHERE action_id = :action_id", {'status': 'approved', - 'action_id': action_id}) - try: - context.bot.send_message(chat_id=followee_id, text="You just gained a new follower!") - except Exception: - logging.error("Couldn't send follower confirmation to chat id: {}".format(followee_id)) +def end_session_job(context): + user_id = context.job.context.from_user.id + if is_admin(user_id): + return + update_session(user_id, None, context) -def main() -> None: - global insta_bot +if __name__ == '__main__': load_settings() initiate_db() - logging.basicConfig(format='[%(asctime)s] - %(message)s', datefmt='%d-%b-%y %H:%M:%S', - level=logging.INFO) # initialize logging module and format. exclude debug messages - insta_bot = Client() - succ = False - relogin = True - try: - succ = insta_bot.login(username=settings["insta_username"], password=settings["insta_password"]) - print(succ) - except exceptions.SentryBlock: - for i in range(10): - print("Try #" + str(i)) - try: - succ = insta_bot.login(username=settings["insta_username"], password=settings["insta_password"], - relogin=relogin) - if succ: - print("Connection established!") - break - except exceptions.SentryBlock: - pass - except exceptions.ReloginAttemptExceeded: - relogin = False - except: - pass - time.sleep(random.randint(3, 5)) - updater = Updater(settings['TOKEN'], use_context=True) - updater.dispatcher.add_handler(CommandHandler('start', start)) - updater.dispatcher.add_handler(CommandHandler('update_points', update_points)) - updater.dispatcher.add_handler(CommandHandler('set', set_something)) - updater.dispatcher.add_handler(CommandHandler('get_users', get_all_users)) - updater.dispatcher.add_handler(CommandHandler('get_actions', get_all_actions)) - updater.dispatcher.add_handler(CommandHandler('add_points', add_points)) - updater.dispatcher.add_handler(CommandHandler('balance', get_balance)) - updater.dispatcher.add_handler(CallbackQueryHandler(get_profile_to_follow, pattern='start_following')) - updater.dispatcher.add_handler(CallbackQueryHandler(followed, pattern='confirm_follow')) - updater.dispatcher.add_handler(CallbackQueryHandler(skip, pattern='skip')) - add_profile_conv_handler = ConversationHandler( - entry_points=[CallbackQueryHandler(add_profile_conversation, pattern='set_profile_link')], - states={ - ADDRESS: [MessageHandler(Filters.text & ~Filters.command, add_profile)], - }, fallbacks=[CommandHandler('cancel', cancel), CallbackQueryHandler(cancel, pattern='cancel')], ) - updater.dispatcher.add_handler(add_profile_conv_handler) - updater.start_polling() - updater.idle() + updater = Updater(token=os.getenv('TELEGRAM_BOT_TOKEN'), use_context=True) + dp = updater.dispatcher + start_handler = CommandHandler('start', start) + dp.add_handler(start_handler) -if __name__ == '__main__': - global settings - global insta_bot - ADDRESS = range(4) - SESSION_TIME = 5 # in seconds - main() + profile_link_handler = CallbackQueryHandler(add_profile_conversation, pattern='set_profile_link') + dp.add_handler(profile_link_handler) + + profile_set_handler = MessageHandler(Filters.text & ~Filters.command, add_profile) + dp.add_handler(profile_set_handler) + + cancel_handler = CallbackQueryHandler(cancel, pattern='cancel') + dp.add_handler(cancel_handler) + + followed_handler = CallbackQueryHandler(followed, pattern='confirm_follow') + dp.add_handler(followed_handler) + + skip_handler = CallbackQueryHandler(skip, pattern='skip') + dp.add_handler(skip_handler) + + updater.start_polling() + updater.idle()