Advertisement
Guest User

Untitled

a guest
Aug 22nd, 2019
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.10 KB | None | 0 0
  1. import logging
  2. import random
  3. import aiohttp
  4. from aiogram import Bot, Dispatcher, executor, types
  5. from aiogram.contrib.fsm_storage.memory import MemoryStorage
  6. from aiogram.contrib.middlewares.logging import LoggingMiddleware
  7. from aiogram.dispatcher import FSMContext
  8. from aiogram.dispatcher.filters.state import State, StatesGroup
  9. from aiogram.utils.callback_data import CallbackData
  10. from aiogram.utils.exceptions import MessageNotModified
  11. import string
  12. import json
  13.  
  14. with open('settings.json') as settings:
  15.     json_body = json.load(settings)
  16. TELEGRAM_TOKEN = json_body['tg_token']
  17.  
  18. QIWI_TOKEN = f"Bearer {json_body['qiwi_token']}"
  19. SUMMA = json_body['sum']
  20. headers = {
  21.     'Accept': 'application/json',
  22.     'Authorization': QIWI_TOKEN
  23. }
  24. qiwi_content = {
  25.         'rows': 10,
  26.         'operation': 'IN'
  27.     }
  28.  
  29.  
  30. logging.basicConfig(level=logging.INFO)
  31. if json_body['proxy_url'] is None:
  32.     bot = Bot(token=TELEGRAM_TOKEN, parse_mode=types.ParseMode.HTML)
  33. else:
  34.     if json_body['proxy_auth']['user'] is None and json_body['proxy_auth']['password'] is None:
  35.         PROXY_URL = json_body['proxy_url']
  36.         bot = Bot(token=TELEGRAM_TOKEN, parse_mode=types.ParseMode.HTML, proxy=PROXY_URL)
  37.     else:
  38.         PROXY_AUTH = aiohttp.BasicAuth(login=json_body['proxy_auth']['user'], password=json_body['proxy_auth']['password'])
  39.         PROXY_URL = json_body['proxy_url']
  40.         bot = Bot(token=TELEGRAM_TOKEN, parse_mode=types.ParseMode.HTML, proxy=PROXY_URL, proxy_auth=PROXY_AUTH)
  41. storage = MemoryStorage()
  42. dp = Dispatcher(bot, storage=storage)
  43. dp.middleware.setup(LoggingMiddleware())
  44.  
  45.  
  46. keyboard = CallbackData('key', 'id', 'action')
  47.  
  48.  
  49. class Form(StatesGroup):
  50.     comment = State()
  51.     sum = State()
  52.     count = State()
  53.     status = State()
  54.  
  55.  
  56. def confirm_keyboard(sum, comment):
  57.         markup = types.InlineKeyboardMarkup()
  58.         markup.add(types.InlineKeyboardButton(text='Оплатить',
  59.                                        url=f'https://qiwi.com/payment/form/99?extra%5B%27account%27%5D=79991234567&amountInteger={sum}&amountFraction=0&extra%5B%27comment%27%5D={comment}&currency=643&blocked[0]=sum&blocked[1]=account&blocked[2]=comment')
  60.                    )
  61.         markup.row(
  62.             types.InlineKeyboardButton(text='Отменить оплату', callback_data=keyboard.new(id='payment', action='cancel')),
  63.             types.InlineKeyboardButton(text='Я оплатил', callback_data=keyboard.new(id='payment', action='confirm')),
  64.  
  65.         )
  66.         return markup
  67.  
  68.  
  69. def reply_keyboard():
  70.     markup = types.ReplyKeyboardMarkup(row_width=2, resize_keyboard=True)
  71.     markup.row(
  72.         types.KeyboardButton('Оформить заказ'),
  73.         types.KeyboardButton("Как пользоваться?"))
  74.     markup.add(
  75.         types.KeyboardButton('Поддержка')
  76.     )
  77.     return markup
  78.  
  79.  
  80. def repeat_confirm_keyboard():
  81.     return types.InlineKeyboardMarkup().row(
  82.         types.InlineKeyboardButton(text='Повторить попытку', callback_data=keyboard.new(id='payment', action='repeat')),
  83.         types.InlineKeyboardButton(text='Написать в тех. поддержку', url='t.me/themida'),
  84.  
  85.     )
  86.  
  87.  
  88. def incorrect_amount_keyboard():
  89.     return types.InlineKeyboardMarkup().row(
  90.         types.InlineKeyboardButton(text='Написать в тех. поддержку', url='t.me/themida'),
  91.     )
  92.  
  93.  
  94. def contact_keyboard():
  95.     return types.InlineKeyboardMarkup().row(
  96.         types.InlineKeyboardButton(text='Support', url='t.me/themida'),
  97.         types.InlineKeyboardButton(text='Чат', url='ya.ru')
  98.     )
  99.  
  100.  
  101. def count_keyboard():
  102.     n = 5
  103.     markup = types.InlineKeyboardMarkup(row_width=5)
  104.     for i in range(1, 11):
  105.         markup.insert(
  106.             types.InlineKeyboardButton(f'{n}', callback_data=keyboard.new(id='count', action=n))
  107.         )
  108.         n += 5
  109.     return markup
  110.  
  111.  
  112. def read(count):
  113.     strings = []
  114.     with open("good_promo.txt") as f:
  115.         for s in range(count):
  116.             q = f.readline()
  117.             strings.append(q)
  118.         with open("good_promo.txt", "r+") as g:
  119.             g.writelines(f)
  120.             g.truncate()
  121.     return '\n'.join(strings)
  122.  
  123.  
  124. async def qiwi_connect(state: FSMContext):
  125.     async with state.proxy() as data:
  126.         comment = data['comment']
  127.         sum = data['sum']
  128.         async with aiohttp.ClientSession() as session:
  129.             async with session.get('https://edge.qiwi.com/payment-history/v2/persons/79991234567/payments', headers=headers, params=qiwi_content) as get:
  130.                 json_body = await get.json()
  131.                 for i in json_body['data']:
  132.                     if i['comment'] is not None and i['comment'] == comment and i['status'] == 'SUCCESS':
  133.                         if i['sum']['amount'] == sum:
  134.                             data['status'] = 2  # Accept
  135.                             break
  136.                         else:
  137.                             data['status'] = 1  # Incorrect amount
  138.                             break
  139.                     else:
  140.                         data['status'] = 0  # not found transaction
  141.  
  142.  
  143. async def result_check(query, state: FSMContext):
  144.     await qiwi_connect(state)
  145.     async with state.proxy() as data:
  146.         status = data['status']
  147.         count = data['count']
  148.         if status == 2:
  149.             await bot.edit_message_text(f'Оплата прошла успешно\n'
  150.                                         f'{read(count)}', query.from_user.id, query.message.message_id)
  151.         elif status == 1:
  152.             try:
  153.                 await bot.edit_message_text(f'Некорректная сумма', query.from_user.id, query.message.message_id, reply_markup=incorrect_amount_keyboard())
  154.             except MessageNotModified:
  155.                 pass
  156.         else:
  157.             try:
  158.                 await bot.edit_message_text(f'Транзакция не обнаружена', query.from_user.id, query.message.message_id, reply_markup=repeat_confirm_keyboard())
  159.             except MessageNotModified:
  160.                 pass
  161.  
  162.  
  163. @dp.message_handler(commands='start')
  164. async def send_welcome(message: types.Message):
  165.     await bot.send_message(message.from_user.id, 'text', reply_markup=reply_keyboard())
  166.  
  167.  
  168. @dp.message_handler()
  169. async def get_count(message: types.Message):
  170.     text_of_button = message.text
  171.     logging.debug(text_of_button)
  172.     if text_of_button == 'Оформить заказ':
  173.         await bot.send_message(message.from_user.id, 'Укажите необходимое количество купонов', reply_markup=count_keyboard())
  174.     elif text_of_button == 'Как пользоваться?':
  175.         await bot.send_message(message.from_user.id, 'HELP')
  176.     elif text_of_button == 'Поддержка':
  177.         await bot.send_message(message.from_user.id, text='Контакты', reply_markup=contact_keyboard())
  178.     else:
  179.         pass
  180.  
  181.  
  182. @dp.callback_query_handler(keyboard.filter(id='count'))
  183. async def get_payment_with_count(query: types.CallbackQuery, callback_data: dict, state: FSMContext):
  184.     logging.info(callback_data)
  185.     count = int(callback_data['action'])
  186.     sum = count * SUMMA
  187.     comment = ''.join(random.sample(string.ascii_letters + string.digits, 12))
  188.     async with state.proxy() as data:
  189.         data['sum'] = sum
  190.         data['comment'] = comment
  191.         data['count'] = count
  192.     await bot.edit_message_text('После оплаты нажмите кнопку "Я оплатил"', query.from_user.id, query.message.message_id, reply_markup=confirm_keyboard(sum, comment))
  193.  
  194.  
  195. @dp.callback_query_handler(keyboard.filter(action='cancel'))
  196. async def cancel_payment(query: types.CallbackQuery, callback_data: dict):
  197.     logging.info(callback_data)
  198.     await bot.edit_message_text('Вы отменили оплату', query.from_user.id, query.message.message_id)
  199.  
  200.  
  201. @dp.callback_query_handler(keyboard.filter(action=['confirm', 'repeat']))
  202. async def check_payment(query: types.CallbackQuery, callback_data: dict, state: FSMContext):
  203.     logging.info(callback_data)
  204.     await result_check(query, state)
  205.  
  206.  
  207. if __name__ == '__main__':
  208.     executor.start_polling(dp, skip_updates=True)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement