Я приготовил для вас "модуль", при помощи которого можно принимать оплату на лолз. Лень заливать на pypi. Для его использования нам нужен токен от API: https://zelenka.guru/threads/3946042/ (Либо просто перейдите по ссылке и нажмите разрешить https://api.zelenka.guru/oauth/authorize?response_type=token&client_id=j0ay1lke24&scope=market+read+post , токен будет в адресной строке) Код модуля import time import random import secrets import requests class Lolz(): def __init__(self, access_token: str): self.api_url = 'https://api.zelenka.guru/' self.session = requests.session() self.session.headers = { 'Authorization': f'Bearer {access_token}' } self.user = self.get_user() self.user_id = self.user['user_id'] self.username = self.user['username'] def get_user(self): response = self.session.get('https://api.lzt.market/me') if response.status_code == 200: response = response.json() if 'user' not in response.keys(): raise ValueError('Invalid Token') return response['user'] else: raise BaseException(response.text.split('<h1>')[1].split('</h1>')[0]) def get_link(self, amount: int, comment: str): return f'https://lzt.market/balance/transfer?username={self.username}&hold=0&amount={amount}&comment={comment}' def get_random_string(self): return f'{time.time()}_{secrets.token_hex(random.randint(12, 20))}' def check_payment(self, amount: int, comment: str): data = { "type" : "money_transfer", "is_hold" : 0 } response = self.session.get(f'{self.api_url}market/user/{self.user_id}/payments') if response.status_code == 200: payments = response.json()['payments'] for payment in payments.values(): if 'Перевод денег от' in payment['label']['title'] and int(amount) == payment['incoming_sum'] and comment == payment['data']['comment']: return True return False else: raise BaseException(response.text.split('<h1>')[1].split('</h1>')[0]) Python import time import random import secrets import requests class Lolz(): def __init__(self, access_token: str): self.api_url = 'https://api.zelenka.guru/' self.session = requests.session() self.session.headers = { 'Authorization': f'Bearer {access_token}' } self.user = self.get_user() self.user_id = self.user['user_id'] self.username = self.user['username'] def get_user(self): response = self.session.get('https://api.lzt.market/me') if response.status_code == 200: response = response.json() if 'user' not in response.keys(): raise ValueError('Invalid Token') return response['user'] else: raise BaseException(response.text.split('<h1>')[1].split('</h1>')[0]) def get_link(self, amount: int, comment: str): return f'https://lzt.market/balance/transfer?username={self.username}&hold=0&amount={amount}&comment={comment}' def get_random_string(self): return f'{time.time()}_{secrets.token_hex(random.randint(12, 20))}' def check_payment(self, amount: int, comment: str): data = { "type" : "money_transfer", "is_hold" : 0 } response = self.session.get(f'{self.api_url}market/user/{self.user_id}/payments') if response.status_code == 200: payments = response.json()['payments'] for payment in payments.values(): if 'Перевод денег от' in payment['label']['title'] and int(amount) == payment['incoming_sum'] and comment == payment['data']['comment']: return True return False else: raise BaseException(response.text.split('<h1>')[1].split('</h1>')[0]) Примеры использования модуля Скрипт import time from marketapi import Lolz lzt = Lolz('') comment = lzt.get_random_string() link = lzt.get_link(amount=1, comment=comment) print(f'Link: {link}') while True: status = lzt.check_payment(amount=1, comment=comment) if status: print('Платеж найден!') break else: print('Платеж не найден:(') time.sleep(5) Python import time from marketapi import Lolz lzt = Lolz('') comment = lzt.get_random_string() link = lzt.get_link(amount=1, comment=comment) print(f'Link: {link}') while True: status = lzt.check_payment(amount=1, comment=comment) if status: print('Платеж найден!') break else: print('Платеж не найден:(') time.sleep(5) TG Бот from aiogram import Bot, Dispatcher, executor, types from marketapi import Lolz tg_token = '' lolz_token = '' bot = Bot(token=tg_token) dp = Dispatcher(bot) lzt = Lolz(lolz_token) def get_keyboard(pay_url, comment, amount): markup = types.InlineKeyboardMarkup() btn1 = types.InlineKeyboardButton(text=' Оплатить', url=pay_url) btn2 = types.InlineKeyboardButton(text=' Проверить', callback_data=f'check|{comment}|{amount}') btn3 = types.InlineKeyboardButton(text='⛔ Отмена', callback_data=f'back_1') markup.add(btn1) markup.add(btn2) markup.add(btn3) return markup @dp.message_handler(commands="deposit") async def deposit(message: types.Message): amount = message.get_args() comment = lzt.get_random_string() link = lzt.get_link(amount=1, comment=comment) await message.answer(f'Пополни по кнопке ниже:', reply_markup = get_keyboard(link, comment, amount)) @dp.callback_query_handler(state='*') async def handler_call(call: types.CallbackQuery): if call.data.startswith('check'): comment = call.data.split('|')[1] amount = call.data.split('|')[2] try: status = lzt.check_payment(amount=amount, comment=comment) if status: await bot.delete_message(call.message.chat.id, call.message.message_id) await bot.send_message(call.message.chat.id, f'✅ Оплата успешно прошла! Ваш баланс был пополнен на {amount} ₽.') else: await bot.send_message(call.message.chat.id, '⛔ Оплата не прошла, попробуйте через несколько секунд.') except BaseException as ex: await bot.send_message(call.message.chat.id, f'⛔ Оплата не прошла. {ex}') elif call.data.startswith('back_1'): await bot.delete_message(call.message.chat.id, call.message.message_id) await bot.send_message(call.message.chat.id, '⏪ Вы вернулись назад.') if __name__ == "__main__": executor.start_polling(dp, skip_updates=True) Python from aiogram import Bot, Dispatcher, executor, types from marketapi import Lolz tg_token = '' lolz_token = '' bot = Bot(token=tg_token) dp = Dispatcher(bot) lzt = Lolz(lolz_token) def get_keyboard(pay_url, comment, amount): markup = types.InlineKeyboardMarkup() btn1 = types.InlineKeyboardButton(text=' Оплатить', url=pay_url) btn2 = types.InlineKeyboardButton(text=' Проверить', callback_data=f'check|{comment}|{amount}') btn3 = types.InlineKeyboardButton(text='⛔ Отмена', callback_data=f'back_1') markup.add(btn1) markup.add(btn2) markup.add(btn3) return markup @dp.message_handler(commands="deposit") async def deposit(message: types.Message): amount = message.get_args() comment = lzt.get_random_string() link = lzt.get_link(amount=1, comment=comment) await message.answer(f'Пополни по кнопке ниже:', reply_markup = get_keyboard(link, comment, amount)) @dp.callback_query_handler(state='*') async def handler_call(call: types.CallbackQuery): if call.data.startswith('check'): comment = call.data.split('|')[1] amount = call.data.split('|')[2] try: status = lzt.check_payment(amount=amount, comment=comment) if status: await bot.delete_message(call.message.chat.id, call.message.message_id) await bot.send_message(call.message.chat.id, f'✅ Оплата успешно прошла! Ваш баланс был пополнен на {amount} ₽.') else: await bot.send_message(call.message.chat.id, '⛔ Оплата не прошла, попробуйте через несколько секунд.') except BaseException as ex: await bot.send_message(call.message.chat.id, f'⛔ Оплата не прошла. {ex}') elif call.data.startswith('back_1'): await bot.delete_message(call.message.chat.id, call.message.message_id) await bot.send_message(call.message.chat.id, '⏪ Вы вернулись назад.') if __name__ == "__main__": executor.start_polling(dp, skip_updates=True) Архив с файлами: https://t.me/autololzupdates/5 Скриншоты Всем хорошего дня!
Вариант с обычными кнопками для новичков from marketapi import Lolz from aiogram.dispatcher import FSMContext from aiogram.dispatcher.filters.state import State, StatesGroup from aiogram import Bot, Dispatcher, executor, filters, types from aiogram.types import ReplyKeyboardRemove from aiogram.utils import executor from aiogram.utils.markdown import hlink from aiogram.dispatcher.filters import Text tg_token = '' lolz_token = '' bot = Bot(token='токен') dp = Dispatcher(bot) lzt = Lolz('токен') class Jammer(StatesGroup): get_pay_count = State() continue_payment = State() @dp.message_handler(Text(equals=' Пополнить баланс')) async def create_pay(jam: types.Message): await jam.answer('Введите суму: ', reply_markup=ReplyKeyboardRemove()) await Jammer.get_pay_count.set() @dp.message_handler(state=Jammer.get_pay_count) async def create_link_pay(jam: types.Message, state: FSMContext): count_money = jam.text comment = lzt.get_random_string() link = lzt.get_link(amount=count_money, comment=comment) try: await state.update_data(count_money=count_money, comment=comment) text = hlink('| клик |', f'{link}') await jam.answer( f" <b>Переведите {count_money}₽ по этой ссылке: </b>{text}\n<b>Комментарий к переводу</b>: {comment}\n\n<i>Для проверки платежа нажмите кнопку</i>", reply_markup=твоя клава, parse_mode='HTML') await Jammer.continue_payment.set() except: await state.finish() await jam.answer('<b>Обнаружена ошибка на стороне бота, администратор уведомлен, пожалуйста, подождите!</b>', parse_mode='HTML') @dp.message_handler(Text(equals='⛓ Проверить платеж ⛓'), state=Jammer.continue_payment) async def payment_check(jam: types.Message, state: FSMContext): users_data = await state.get_data() user_id = jam.from_user.id count_money = users_data['count_money'] comment = users_data['comment'] try: status = lzt.check_payment(amount=count_money, comment=comment) if status: await jam.answer(f'Оплата успешно прошла! Ваш баланс был пополнен на {count_money} ₽.', reply_markup=твоя клава) else: await jam.answer('Оплата не прошла, попробуйте через несколько секунд.') except Exception as ex: await jam.answer(f' Оплата не прошла. {ex}') if __name__ == "__main__": executor.start_polling(dp, skip_updates=True) Python from marketapi import Lolz from aiogram.dispatcher import FSMContext from aiogram.dispatcher.filters.state import State, StatesGroup from aiogram import Bot, Dispatcher, executor, filters, types from aiogram.types import ReplyKeyboardRemove from aiogram.utils import executor from aiogram.utils.markdown import hlink from aiogram.dispatcher.filters import Text tg_token = '' lolz_token = '' bot = Bot(token='токен') dp = Dispatcher(bot) lzt = Lolz('токен') class Jammer(StatesGroup): get_pay_count = State() continue_payment = State() @dp.message_handler(Text(equals=' Пополнить баланс')) async def create_pay(jam: types.Message): await jam.answer('Введите суму: ', reply_markup=ReplyKeyboardRemove()) await Jammer.get_pay_count.set() @dp.message_handler(state=Jammer.get_pay_count) async def create_link_pay(jam: types.Message, state: FSMContext): count_money = jam.text comment = lzt.get_random_string() link = lzt.get_link(amount=count_money, comment=comment) try: await state.update_data(count_money=count_money, comment=comment) text = hlink('| клик |', f'{link}') await jam.answer( f" <b>Переведите {count_money}₽ по этой ссылке: </b>{text}\n<b>Комментарий к переводу</b>: {comment}\n\n<i>Для проверки платежа нажмите кнопку</i>", reply_markup=твоя клава, parse_mode='HTML') await Jammer.continue_payment.set() except: await state.finish() await jam.answer('<b>Обнаружена ошибка на стороне бота, администратор уведомлен, пожалуйста, подождите!</b>', parse_mode='HTML') @dp.message_handler(Text(equals='⛓ Проверить платеж ⛓'), state=Jammer.continue_payment) async def payment_check(jam: types.Message, state: FSMContext): users_data = await state.get_data() user_id = jam.from_user.id count_money = users_data['count_money'] comment = users_data['comment'] try: status = lzt.check_payment(amount=count_money, comment=comment) if status: await jam.answer(f'Оплата успешно прошла! Ваш баланс был пополнен на {count_money} ₽.', reply_markup=твоя клава) else: await jam.answer('Оплата не прошла, попробуйте через несколько секунд.') except Exception as ex: await jam.answer(f' Оплата не прошла. {ex}') if __name__ == "__main__": executor.start_polling(dp, skip_updates=True)
сделай автовывод через бота тг, ну и еще идея для скрипта, когда заканчиваются симпатии то бот автоматически покупает автореги вк, создает тему и раздает
1) функция get_link не учитывает валюту пользователя 2) get random string не гарантирует уникальность ключа, нужно дополнительно брать уникальный параметр (например текущее время до милисекунд) 3) зачем time sleep в init (в переменную уже записан пользователь новые запросы не создаются)
trogdor, на счёт второго дичь, т.к. комент не прям супер уникальным можно делать т.к. идёт ещё сверка по сумме
Lelouch, запрашиваем пополнение с 2 аккаунтов на одну и ту же сумму и ждём пока прокнет одинаковый комментарий == получаем х2 депозит
trogdor, во первых цикл завершается после нахождения хотя бы одного платежа, а во вторых ну удачи тыкать челу, который сгенерит в тг чате две одинаковые строки
Shell, я знаю, а в чем проблема? Я ж в боте показал как можно реализовать, если ошибка 429,то у тг просто кд на нажатия и через 10 секунд опять нажмет.
попробуй использовать httpx с asyncio вместо requests, будет получше (а то сейчас оно блочит луп у асинхронного бота, пока дожидается ответа сервака лзт)
Здравствуйте господа. The post was merged to previous Dec 11, 2022 Пишет ошибку: Оплата не прошла. bad operand type for unary +: 'str'
Обновление кода: Если у Вас не работает check_payment -> это фикс для Вас. import time import random import secrets import requests from datetime import datetime class Lolz(): def __init__(self, access_token: str): self.api_url = 'https://api.zelenka.guru/' self.session = requests.session() self.session.headers = { 'Authorization': f'Bearer {access_token}' } self.user = self.get_user() self.user_id = self.user['user_id'] self.username = self.user['username'] def get(self, url, params=None): if params is None: params = {} return self.session.get(self.api_url + url, params=params).json() def get_user(self): response = self.session.get('https://api.lzt.market/me') if response.status_code == 200: response = response.json() if 'user' not in response.keys(): raise ValueError('Invalid Token') return response['user'] else: raise BaseException(response.text.split('<h1>')[1].split('</h1>')[0]) def get_link(self, amount: int, comment: str): return f'https://lzt.market/balance/transfer?username={self.username}&hold=0&amount={amount}&comment={comment}' def get_random_string(self): return f'{time.time()}_{secrets.token_hex(random.randint(12, 20))}' def check_payment(self, type_: str = None, pmin: int = None, pmax: int = None, receiver: str = None, sender: str = None, startDate: datetime = None, endDate: datetime = None, wallet: str = None, comment: str = None, is_hold: str = None): if not self.user_id: return False data = {} if type_: data['type'] = type_ if pmin: data['pmin'] = pmin if pmax: data['pmax'] = pmax if receiver: data['receiver'] = receiver if sender: data['sender'] = sender if startDate: data['startDate'] = startDate if endDate: data['endDate'] = endDate if wallet: data['wallet'] = wallet if comment: data['comment'] = comment if is_hold: data['is_hold'] = is_hold return self.get(f'market/user/{self.user_id}/payments', data) Python import time import random import secrets import requests from datetime import datetime class Lolz(): def __init__(self, access_token: str): self.api_url = 'https://api.zelenka.guru/' self.session = requests.session() self.session.headers = { 'Authorization': f'Bearer {access_token}' } self.user = self.get_user() self.user_id = self.user['user_id'] self.username = self.user['username'] def get(self, url, params=None): if params is None: params = {} return self.session.get(self.api_url + url, params=params).json() def get_user(self): response = self.session.get('https://api.lzt.market/me') if response.status_code == 200: response = response.json() if 'user' not in response.keys(): raise ValueError('Invalid Token') return response['user'] else: raise BaseException(response.text.split('<h1>')[1].split('</h1>')[0]) def get_link(self, amount: int, comment: str): return f'https://lzt.market/balance/transfer?username={self.username}&hold=0&amount={amount}&comment={comment}' def get_random_string(self): return f'{time.time()}_{secrets.token_hex(random.randint(12, 20))}' def check_payment(self, type_: str = None, pmin: int = None, pmax: int = None, receiver: str = None, sender: str = None, startDate: datetime = None, endDate: datetime = None, wallet: str = None, comment: str = None, is_hold: str = None): if not self.user_id: return False data = {} if type_: data['type'] = type_ if pmin: data['pmin'] = pmin if pmax: data['pmax'] = pmax if receiver: data['receiver'] = receiver if sender: data['sender'] = sender if startDate: data['startDate'] = startDate if endDate: data['endDate'] = endDate if wallet: data['wallet'] = wallet if comment: data['comment'] = comment if is_hold: data['is_hold'] = is_hold return self.get(f'market/user/{self.user_id}/payments', data)