Saved searches
Use saved searches to filter your results more quickly
Cancel Create saved search
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.
Игровой бот на основе Python и PostgreSQL: https://t.me/LotEasyBot
License
qouglou/LotEasyBotAio
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Switch branches/tags
Branches Tags
Could not load branches
Nothing to show
Could not load tags
Nothing to show
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Cancel Create
- Local
- Codespaces
HTTPS GitHub CLI
Use Git or checkout with SVN using the web URL.
Work fast with our official CLI. Learn more about the CLI.
Sign In Required
Please sign in to use Codespaces.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching Xcode
If nothing happens, download Xcode and try again.
Launching Visual Studio Code
Your codespace will open once ready.
There was a problem preparing your codespace, please try again.
Latest commit
5ee5947 Mar 21, 2023
Git stats
Files
Failed to load latest commit information.
Latest commit message
Commit time
March 20, 2023 21:43
March 20, 2023 21:45
March 20, 2023 18:26
March 21, 2023 10:35
README.md
Игровой Telegram бот на Python, позволяющий играть как в быстрые (с помощью Telegram Dice), так и в онлайн игры с другими пользователями.
Технологии и инструменты
Pydantic — передача значений токена бота и настроек подключения к БД.
Termius — SSH клиент для управления хостом.
Навигация по файлам
- __main__ — запуск проекта, настройки диспетчера, подключение роутеров, внешних миддлварей, некоторых шаблонных и кастомных фильтров.
- callback_factory — фабрика Telegram коллбеков.
- checkers — ручные и авточекеры, проверяющие возможность вывода, ставки, а также проверка уведомлений пользователей о результатах операций и игр.
- db — инициализация базы данных, а также запросы к ней.
- db_connect_create — создание коннектора БД для последующего использования во всех обращениях к ней.
- fsm — установка состояний машины состояний (конечного автомата).
- games — обработчик онлайн и оффлайн игр.
- handlers — определение хэндлеров.
- filters — определение кастомных фильтров.
- middlewares — определение внешних и внутренних миддлварей.
- templates — определение шаблонных сообщений, клавиатур, кнопок и текстов.
- configs — настройки бота, логирования, а также токена бота и данных подключения к БД.
- difs — текстовые файлы с логами, номерами реквизитов пополнения.
Функции и возможности бота
Следующие смайлы — , используемые в боте, с помощью Telegram превращаются в настоящий генератор (псевдо)случайных чисел, что позволяет использовать эту механику для игр прямо в мессенджере. Выбрав тип игры и ставку, бот отправляет соответствующее Dice-сообщение, считывавает выпавшее значение, и приводит результат.
Пользователи бота также могут посоревноваться с другими пользователями, выбрав категорию Онлайн игр. В разных играх участвтует разное количество игроков (по умолчанию в Дуэли — 2, в Русской рулетке — 6, в Королевской битве — 10). В зависимости от игры и ставки пользователя закидывает в одну из соответствующих комнат.
Выбор псевдослучайного числа происходит при помощи Python модуля random. В процессе игры производится анимация загрузки игры, а также выбора числа при помощи стикера. Ниже предоставлен пример игры в Дуэль с разных аккаунтов.
Пополнения и выводы
Данный радел несет исключительно информативный формат и представляет собой метод возможной реализации ввода и вывода условных единиц. Бот не производит никких финансовых операций!
Для пополнения внутриигрового баланса и вывода условных единиц с него, реализованы соответствующие функции пополнения и вывода. Если пользователь хочет пополнить или вывести сумму, отличающуюся от стандартных (по умолчанию 50, 100, 500, 1000 у.е.), реализована функция ввода другой суммы, которая подвергается различным проверкам (корректность числа, величина суммы, при выводе наличие введенной суммы у пользователя на балансе).
В случае, если пользователь совершает пополнение, это отображается в базе данных, и при нажатии на кнопку проверки пополнения, происходит зачисление средств и завершение операции с последующим уведомлением пользователя. Также в боте реализованы авточекеры, которые раз в заданное время (по умолчанию 30 секунд) проверяют завершенность операций. Если перевод совершен, но средства не зачислены на баланс и операция не завершена, авточекер автоматически завершает операцию и уведомляет пользователя об этом. Процесс пополнения и работы авточекера показаны ниже.
Вывод средств организован так же, только с дополнительным вводом пользователем реквизитов для вывода.
История операций и игр
Для того, чтобы пользователь мог ознакомиться со всеми операциями ввода/вывода, которые он совершил, а также сввоей историей игр, реализованы соответсвующие разделы.
Разделы имеют пагинацию, а также с помощью эмоджи визуально информативно отображают завершенность и результат. Приложенное ниже GIF-изображение показывает данные разделы.
Для управления операциями, пользователями и администраторами разработана админ панель BPManage. Доступ к админ панели имеют только занесенные в базу данных администраторы.
С помощью BPManage можно просматривать, подтверждать и изменять операции, управлять пользователями (блокировать, изменять баланс, просматривать их историю операций и игр), а также управлять администраторами, выдавая и забирая полномочия, повышая или понижая их звание.
Существует 4 уровня администраторов. С каждым новым уровнем к предыдущим возможностям добавляются новые.
- 0 (JUNIOR) — может только просматривать информацию об операциях и пользователях.
- 1 (MIDDLE) — добавляется возможность подтверждать операции, блокировать пользователей.
- 2 (MASTER) — добавляется возможность изменять способы и реквизиты операций вывода.
- 3 (SUPERUSER) — добавляется возможность изменять баланс пользователей, а также полный доступ к панели управления администраторами.
Приведенный ниже короткий пример отображает возможности управления админ панелью BPManage от лица админа 3 уровня. (GIF плохого качества из-за ограничений в 10 МБ GitHub)
Мелочь, но приятно
В боте реализованы некоторые мелочи, которые порой даже удобны в использовании.
- При пересылке любого сообщения в бот выводится сообщение об ID пользователя и его имени (если у пользователя выставлены разрешающие настройки профиля). Если пересылает администратор, а сообщение от пользователя, который уже использовал бот, то к информации добавляется кнопка перехода в админ панель управления пользователем (картинка ниже).
- При попытке сделать ставку, превышающую баланс пользователя, выведется сообщение с вариантом пополнить баланс. Если пользователь решит пополнить, выберет способ и/или сумму пополнения, а потом решит вернуться назад, переход будет совершен к выбору ставок в игре, из которой он нажал кнопку пополнения.
- В боте ведутся логи некоторых событий.
- В боте настроены некоторые шаблонные и кастомные фильтры (например работа только в приватных ЛС чатах).
- С помощью эмоджи визуально представлены некоторые разделы бота и статус всевозможных действий, что позволяет гораздо удобнее, интуитивнее и быстрее воспринимать информацию.
- Созданы разделы справки, где есть некоторые ответы на возможные вопросы пользователей, а также кнопка обратной связи с администрацией.
- Настроены авточекеры пополнения и уведомления о результатах игры (пример авточекера пополнения указан выше).
- Если отправить боту стикер, он выведет ID стикера, эмодзи, прикрепленное к стикеру, в также статус анимации.
- Если отправить боту сообщение типа Dice (анимированный стикер с миниигрой), бот отреагирует, предложив сыграть все таки в его игры.
Пишем бот для рыбалки в игре Albion Online на языке Python
Всем привет, я являюсь счастливым пользователем операционной системы GNU/Linux.И как многим известно, игрушек идущих на линукс без дополнительных танцев с бубном намного меньше чем в «Винде».
И еще меньше игр в жанре MMORPG.
Однако, где-то пол года или год назад я узнал что под линукс портировали игру Albion Online.
Игра очень занимательная, однако занимает достаточно большое количество времени. И дабы не тратить свои драгоценные часы жизни по напрасну, я решил написать бота. Который будет фармить мне ресурсы, пока я буду заниматься своими делами.
В игре есть много видов ремесла, можно рубить лес, камни копать, даже выращивать огороды, однако мой выбор был сделан в пользу рыбалки.
Итак, суть рыбалки в альбион онлайн проста, берете удочку, подходите к водоему, зажимаете кнопку, дабы закинуть наживку, ждете в течении определённого времени поклевки.

Когда клюет, вы должны опять нажать на кнопки и сыграть в мини-игру.
Тут потребуется попеременно то тянуть, то не тянуть удочку, в зависимости от движений поплавка. Поплавок движется всегда случайно, с разными последовательностями и скоростями. И если вы все сделаете верно и поплавок не выйдет за прелы допустимой зоны, то вы выловите рыбу.
Итак, все это дело мы будем автоматизировать. По средствам компьютерного языка python. Начать я решил с самого сложного, а именно с момента, где начинается игра с поплавком. Тут снова мне на выручку пришла моя любимая библиотека с компьютерным зрением OpenCV. Запустив ее мы можем обнаруживать объекты к примеру на картинках. Однако сама библиотека не знает что именно нам нужно обнаружить. Конечно существуют множество шаблонов где представлены различные предметы для их определения. Однако, там точно нет поплавков для Albion Online.
Зато в данной библиотеке есть замечательная функция поиска по заданному шаблону. И в качестве шаблона я просто взял скриншот нашего поплавка.

И как мы видим все прекрасно нашлось на картинке.
А разница между картинкой и потоковым виде не велика, ведь по сути это просто поток картинок с очень быстрой скоростью, и несколько строчек кода. И вот мы уже можем находить поплавок на потоковом видео.
import numpy as np import cv2 from mss.linux import MSS as mss from PIL import Image import time import pyautogui as pg import cv2 import mss import numpy template = cv2.imread("2019-07-02_06-55_1.png", cv2.IMREAD_GRAYSCALE) w, h = template.shape[::-1] with mss.mss() as sct: monitor = while "Screen capturing": last_time = time.time() img = numpy.array(sct.grab(monitor)) cv2.imshow("OpenCV/Numpy normal", img) print("fps: <>".format(1 / (time.time() - last_time))) gray_frame = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) res = cv2.matchTemplate(gray_frame, template, cv2.TM_CCOEFF_NORMED) loc = np.where(res >= 0.7) for pt in zip(*loc[::-1]): cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0, 255, 0), 3) cv2.imshow("Frame", img) key = cv2.waitKey(1) if cv2.waitKey(25) & 0xFF == ord("q"): cv2.destroyAllWindows() break
Идем далее. Сам поплавок двигается туда-сюда и мы также должны его двигать, нажимая кнопку на мышке.
А посему, нам нужны его координаты. И для этого нас выручают вот эти строчки.
for p in img: pts = (pt[0],pt[1]) x = (pt[0]) y = (pt[1]) print (x) cv2.circle(template,pts,5,(200,0,0),2) cv2.putText(img, "%d-%d" % (x,y), (x+10,y-10), cv2.FONT_HERSHEY_SIMPLEX, 1, color_yellow, 2)
Затем мы просто воспользуемся библиотекой PyAutoGUI, которая будет зажимать кнопку мыши и отжимать ее с определенной периодичностью.
if 100 < x < 500: pyautogui.mouseDown(button='left') time.sleep(1) pyautogui.mouseUp(button='left') x = 0
И сама мини игра успешно выигрывается.

Засунем все это дело в функцию и пока оставим.
Затем вернемся к изначальной части, где мы должны следить за поплавком.
Тут все несколько иначе, допустим мы можем определить, куда закинется поплавок, и попробовать анализировать ту часть экрана на наличие поплавка. Однако поплавок закинутый в воду предстает под разными углами и постоянно колышется.
В таком случае мы возьмём тот несколько иной метод. Суть его в том, что мы анализируем, скажем так разницу в пикселях внутри отслеживаемого фрагмента. Которая, если поплавка нет приближается к нулю.
В итоге было найдено оптимальное значение при котором при исчезновении поплавка, мы можем производить действия.
def screen_record(): sct = mss.mss() last_time = time.time() while(True): img = sct.grab(mon) print('loop took <> seconds'.format(time.time() - last_time)) last_time = time.time() img = np.array(img) processed_image = process_image(img) mean = np.mean(processed_image) print('mean = ', mean) if mean
И мы их производим, а именно нажимаем на кнопку мыши. Также засовываем это в функцию.
Ну и наконец в заключении мы просто записываем скрипт где в бесконечном цикле мы забрасываем удочку и выполняем попеременно первую и вторую функцию.
while "Черный": time.sleep(1) pyautogui.moveTo(431,175,duration=1) pyautogui.mouseDown(button='left') pyautogui.moveTo(450.200,duration=1) pyautogui.mouseUp(button='left') time.sleep(2) screen_record() time.sleep(0.01) ss()
Вот полная видео инструкция и пример работы данного бота:
Есть правда некоторые нюансы в том что там надо шаманить с цифрами, так как эти цифры подобраны под мой монитор, локацию, персонажа и экипировку. Но я думаю для грамотного пижониста это не составит проблем.
import numpy as np import cv2 from mss.linux import MSS as mss from PIL import Image import time import pyautogui as pg import imutils import mss import numpy import pyautogui template = cv2.imread("2019-07-02_06-55_1.png", cv2.IMREAD_GRAYSCALE) w, h = template.shape[::-1] color_yellow = (0,255,255) mon = def process_image(original_image): processed_image = cv2.cvtColor(original_image, cv2.COLOR_BGR2GRAY) processed_image = cv2.Canny(processed_image, threshold1=200, threshold2=300) return processed_image def ss(): op = 1 with mss.mss() as sct: monitor = while "Screen capturing": last_time = time.time() img = numpy.array(sct.grab(monitor)) gray_frame = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) res = cv2.matchTemplate(gray_frame, template, cv2.TM_CCOEFF_NORMED) loc = np.where(res >= 0.7) op += 1 print (op) for pt in zip(*loc[::-1]): cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0, 255, 0), 3) for p in img: pts = (pt[0],pt[1]) x = (pt[0]) y = (pt[1]) print (x) if 100 < x < 490: pyautogui.mouseDown(button='left') time.sleep(2) pyautogui.mouseUp(button='left') x = 0 break else: continue break else: continue break key = cv2.waitKey(1) if cv2.waitKey(25) & 0xFF == ord("q"): cv2.destroyAllWindows() if op >35: return def screen_record(): sct = mss.mss() last_time = time.time() while(True): img = sct.grab(mon) print('loop took <> seconds'.format(time.time() - last_time)) last_time = time.time() img = np.array(img) processed_image = process_image(img) mean = np.mean(processed_image) print('mean = ', mean) if mean
Те кто любит сказать, что это бесполезная трата времини, я замечу, что это лишь инструмент, эти библиотеки вы можете применить и в других проектах. Само компьютерное зрение применяется как при наведении баллистических ракет, так и в программах для помощи инвалидам. Куда вы решите их применить, только ваше желание.
Всем спасибо за внимание.
Как написать игру для ICQ на Python
Пишем простого ICQ-бота на Python для игры в «Угадай число», где диапазон чисел составит от 1 до 99 для отгадывания.
Приветствую. Сегодня хотелось бы написать простого ICQ бота для игры в «Угадай число», где у пользователя будет неограниченное количество попыток, а диапазон чисел составит от 1 до 99 для отгадывания. Сразу хотелось бы сказать, что данный бот работает не совсем так, как хотелось бы, это можно увидеть по фото ниже, т. к. я в этом начинающий.
Устанавливаем библиотеку для ICQ ботов
Для начала нам понадобится сам Python, и специальная библиотека для работы с ботами, качаем её через pip:
pip install mailru-im-bot
Теперь, переходим в ICQ и ищем в поиске @metabot. Создаём бота, скопировав и сохранив токен. В дальнейшем он нам понадобится.
Код игры
from bot.bot import Bot from bot.handler import MessageHandler, BotButtonCommandHandler import json import random ran_num = random.randint(1, 100) ran_num = str(ran_num) TOKEN = "Токен вашего бота" bot = Bot(token=TOKEN) def bot_play_text(bot, event): if event.data["text"] == "/start": bot.send_text(chat_id=event.from_chat, text="Привет! Я бот для игры в угадай число. Начнём?", inline_keyboard_markup="<>".format(json.dumps([[ ]]))) def num_play(bot, event): if event.data["text"] == ran_num: bot.send_text(chat_id=event.from_chat, text="Да, вы справились") elif event.data["text"] > ran_num: bot.send_text(chat_id=event.from_chat, text="Загаданное число меньше.") elif event.data["text"] < ran_num: bot.send_text(chat_id=event.from_chat, text="Загаданное число больше.") def bot_play(bot, event): if event.data["callbackData"] == "call_btn_id_1": bot.send_text(chat_id=event.from_chat, text="Я загадал число от 1 до 99, количество попыток: неограниченно.") bot.send_text(chat_id=event.from_chat, text="Ваше предположение?") bot.dispatcher.add_handler(MessageHandler(callback=bot_play_text)) bot.dispatcher.add_handler(MessageHandler(callback=num_play)) bot.dispatcher.add_handler(BotButtonCommandHandler(callback=bot_play)) bot.start_polling() bot.idle()
Итог
Оставьте программу активной и перейдите в ICQ. Найдите своего бота в списке и отправьте команду /start.
Бот для игры в 'Слова' для telegram бота
Возможно ли сделать телеграм бота для игры в слова на языке программирования python (Пользователь пишет слово, а бот придумывает слово на последнюю букву предыдущего. Например: Пользователь: машинА Бот: АрбуЗ Пользователь: ЗебрА И так далее) если да, то подскажите библиотеку
Отслеживать
787 1 1 золотой знак 6 6 серебряных знаков 19 19 бронзовых знаков
задан 4 мар в 5:48
15 3 3 бронзовых знака
Вам стоит уточнить для чего именно Вы желаете сделать бота? Телеграм/Дискорд или просто исполняемый скрипт в python (так как каждая реализация имеет свои нюансы). В любом случае, самый простой и минимально-исполняемый код для выполнения этой задачи Вы можете сделать просто используя модуль random и списком заранее сформированных слов, где поиск выполняется по last_letter = word[-1] . Во всяком случае, Вам нужно уточнить вопрос и добавить свое минимальное решение, чтобы Вам смогли корректно оказать поддержку.
4 мар в 6:00
Для телеграмм бота, а можно как то сделать так что бы бот сам слова придумывал?
4 мар в 6:07
Так и тем более тогда бот будет выводить случайное слово, а мне надо что бы это слово начиналось с быквы предедущего
4 мар в 6:14
Чтобы он сам слова придумывал, можете имплементировать нейросети, но тогда Вам придется их заранее обучить или постараться найти где-то заранее обученные. По второму комментарию, там же указано про last_letter , бот будет выводить случайное слово и списка, которое начинается на последнюю букву. Для этого будет совершаться проверка в этом списке. Все же не так просто 🙂
4 мар в 6:43
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Я сделал для Вас условно рабочий код с использованием нейронной сети от OPEN AI (модель GPT2 - text-davinci-002) . Это Вам для затравки, читайте документацию, изучайте, развивайте и у Вас все получится. Здесь не прописано множество ограничений, таких как проверка того, чтобы пользователь вводил корректный ответ с учетом последнего слова бота, исключения на буквы "ь, ы" ну и прочих, возможно нестандартных ответов бота, которые нужно протестировать, но которые обязательно будут.
Успехов Вам в изучении.
Код:
import telebot import openai bot = telebot.TeleBot("") # Регистрируется через BOT FATHER в TELEGRAM openai.api_key = "" # Нужно быть зарегистированым в OPEN AI и получить токен. @bot.message_handler(func=lambda message: True) def game(message): # Получение последней буквы слова пользователя last_letter = message.text[-1].lower() # Получение списка слов из OpenAI GPT-2 модели prompt = f"Give me a word that starts with " response = openai.Completion.create( engine="text-davinci-002", prompt=prompt, max_tokens=60, n=1, stop=None, temperature=0.5, ) generated_word = response.choices[0].text.strip() # Если полученное слово не пустое и начинается с правильной буквы, отправляем его пользователю, иначе выполняем else if generated_word and generated_word[0].lower() == last_letter: bot.send_message(message.chat.id, generated_word) else: bot.send_message(message.chat.id, "К сожалению, я не знаю слов на букву " + last_letter) bot.polling()
Фрагмент отработки данного кода:

Дополненный код с реализацией механизма проверки того, что пользователь пишет следующее слово с нужной буквы:
import telebot import openai bot = telebot.TeleBot("") # Регистрируется через BOT FATHER в TELEGRAM openai.api_key = "" # Нужно быть зарегистированым в OPEN AI и получить токен. last_letter = None @bot.message_handler(func=lambda message: True) def game(message): global last_letter # Объявляем, что будем использовать глобальную переменную # Если last_letter пустая, значит это первый ход игры, и нужно получить первое слово от пользователя if last_letter is None: last_letter = message.text[-1].lower() bot.send_message(message.chat.id, "Начнем игру! Введите слово, которое начинается с буквы " + last_letter) else: first_letter = message.text[0].lower() if first_letter != last_letter: bot.send_message(message.chat.id, "К сожалению, вы ввели неверное слово. Введите слово, которое начинается с буквы " + last_letter) else: last_letter = message.text[-1].lower() prompt = f"Give me a word that starts with " response = openai.Completion.create( engine="text-davinci-002", prompt=prompt, max_tokens=60, n=1, stop=None, temperature=0.5, ) generated_word = response.choices[0].text.strip() if generated_word and generated_word[0].lower() == last_letter: bot.send_message(message.chat.id, generated_word) last_letter = generated_word[-1].lower() else: bot.send_message(message.chat.id, "К сожалению, я не знаю слов на букву " + last_letter) bot.polling()
