Загрузка...

Python | Принимаем оплату при помощи Lolz API

Тема в разделе Python создана пользователем its_niks 9 авг 2022. (поднята 6 ноя 2022) 5246 просмотров

  1. its_niks
    its_niks Автор темы 9 авг 2022 make testers great again! 16 934 29 янв 2021
    Я приготовил для вас "модуль", при помощи которого можно принимать оплату на лолз. Лень заливать на pypi.:ok_lol:
    Для его использования нам нужен токен от API: https://zelenka.guru/threads/3946042/ (Либо просто перейдите по ссылке и нажмите разрешить

    https://api.zelenka.guru/oauth/authorize?response_type=token&client_id=j0ay1lke24&scope=market+read+post
    , токен будет в адресной строке)

    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])

    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)
    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


    [IMG] [IMG]
    Всем хорошего дня!:smile:
     
    9 авг 2022 Изменено
  2. Toil
    Toil 9 авг 2022 ������� ������ :coder: 3543 18 ноя 2018
    Нормалёк, для новичков пойдёт, но не легче было сделать рандомный текст через uuid4?
     
    1. its_niks Автор темы
      Toil, может быть)
  3. cpp_inactive3442203
    cpp_inactive3442203 9 авг 2022 Заблокирован(а) 63 30 июл 2020
    Это что за хуйня...
     
    1. its_niks Автор темы
    2. its_niks Автор темы
      cpp_inactive3442203, там был второй запрос, я его убрал а слип забыл
  4. file_type_vscode2
    0xd
    0xd 9 авг 2022 5374 2 окт 2018
    Можно ещё сделать время платежа, и проверять платежи от этого времени до сейчас, а так нормик
     
    1. dvbum
      0xd, валему?????
  5. Jaammerr
    Jaammerr 9 авг 2022 8 2 окт 2021
    Вариант с обычными кнопками для новичков

    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)
     
    9 авг 2022 Изменено
    1. Посмотреть предыдущие комментарии (1)
    2. Lelouch
      кто такие эти ваши мм
    3. IMSmart
  6. 5xl
    5xl 9 авг 2022 Заблокирован(а) 1916 28 июл 2016
    сделай автовывод через бота тг, ну и еще идея для скрипта, когда заканчиваются симпатии то бот автоматически покупает автореги вк, создает тему и раздает
     
    1. Посмотреть предыдущие комментарии (1)
    2. Igore4ick_FKOP
      Lelouch, для запрещёнки)
  7. trogdor
    trogdor 10 авг 2022 4667 5 авг 2020
    1) функция get_link не учитывает валюту пользователя
    2) get random string не гарантирует уникальность ключа, нужно дополнительно брать уникальный параметр (например текущее время до милисекунд)
    3) зачем time sleep в init (в переменную уже записан пользователь новые запросы не создаются)
     
    10 авг 2022 Изменено
    1. Посмотреть предыдущие комментарии (6)
    2. Lelouch
      trogdor, на счёт второго дичь, т.к. комент не прям супер уникальным можно делать т.к. идёт ещё сверка по сумме
    3. trogdor
      Lelouch, запрашиваем пополнение с 2 аккаунтов на одну и ту же сумму и ждём пока прокнет одинаковый комментарий == получаем х2 депозит
      11 июл 2023 Изменено
    4. Lelouch
      trogdor, во первых цикл завершается после нахождения хотя бы одного платежа, а во вторых ну удачи тыкать челу, который сгенерит в тг чате две одинаковые строки
  8. OnerSD
    OnerSD 10 авг 2022 Разбань ютуб - https://lolz.live/threads/6716800/ 1517 24 мар 2021
    :+rep: удобная штука
     
  9. its_niks
    its_niks Автор темы 10 авг 2022 make testers great again! 16 934 29 янв 2021
    Перезалил модуль с доработками.
    - В комментарий вставляется время(секунды)
    - Убрал ненужный sleep.
     
    10 авг 2022 Изменено
  10. renameduser_757397
    renameduser_757397 10 авг 2022 Место для вашей рекламы 3806 29 дек 2018
    Спасибо, давно искал такое. Теперь можно будет не платить комиссию кристал пею
     
  11. Shell
    Shell 10 авг 2022 блесс 8262 13 май 2022
    Хочешь лютую хуйню скажу? Там 1 запрос в 3 секунды должен, короче не удобно честно говоря
     
    1. its_niks Автор темы
      Shell, я знаю, а в чем проблема? Я ж в боте показал как можно реализовать, если ошибка 429,то у тг просто кд на нажатия и через 10 секунд опять нажмет.
  12. teket4
    teket4 26 ноя 2022 4 9 июл 2020
    попробуй использовать httpx с asyncio вместо requests, будет получше (а то сейчас оно блочит луп у асинхронного бота, пока дожидается ответа сервака лзт)
     
    1. its_niks Автор темы
      teket4, можно переписать на aiohttp
    2. teket4
      its_niks, без разницы, просто httpx чуть более простой в использовании
  13. ToAllShop
    ToAllShop 29 ноя 2022 Заблокирован(а) 1130 23 июл 2022
     
    1. its_niks Автор темы
      ToAllShop, число нужно вводить, а не строку
    2. ToAllShop
    3. its_niks Автор темы
      ToAllShop, /deposit "сумма"
      Например /deposit 23
  14. h1yantan
    h1yantan 11 дек 2022 0 14 мар 2022
    Здравствуйте господа.
    --- Сообщение объединено с предыдущим 11 дек 2022
    Пишет ошибку: Оплата не прошла. bad operand type for unary +: 'str'
     
    1. ToSa
      h1yantan, возможно сумма не число, а строка
    2. ToSa
      h1yantan, сложно точно сказать
  15. DIMFLIX
    DIMFLIX 19 дек 2022 32 16 июн 2022
    А возможно самому как то пополнить баланс автоматически если он закончился
     
  16. ПулковоПолиция
    ПулковоПолиция 23 янв 2024 ливнул. 1331 1 апр 2022
    залил на pypi, если кому надо, то можете теперь просто написать
    ⁡pip install lztpayments
     
  17. prizrak3742
    prizrak3742 28 янв 2025 0 26 янв 2025
    Обновление кода:
    Если у Вас не работает check_payment -> это фикс для Вас.


    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)
     
    28 янв 2025 Изменено
    1. waterball
      prizrak3742, друг ты просто лучший, спасибо
Top
Загрузка...