python — Хочу сделать отправку постов с валидацией по капче в flask, но при отправке капча перезагружается и не совпадает с введённой в форме
Проще говоря: у меня есть код, который отправляет и сохраняет посты с помощью flask и есть код, который выдаёт капчу. Оба работают по отдельности, не знаю, как сделать, чтобы работали вместе.
Код из туториала по flask:
@bp.route("/create", methods=("GET", "POST")) @auth.login_required def create(): """Create a new post for the current user.""" if flask.request.method == "POST": title = flask.request.form["title"] body = flask.request.form["body"] capcha_value = captcha.get_captcha() user_captcha = flask.request.form["captcha"] error = None print('user_captcha:', user_captcha) print('capcha_value:', capcha_value) if user_captcha != capcha_value: error = 'Wrong captcha, try again.' # Вот эта ошибка постоянно выскакивает. if error is not None: flask. flash(error) else: database = db.get_db() database.execute( "INSERT INTO post (title, body, author_id)" + " VALUES (?, ?, ?)", (title, body, flask.g.user["u_id"])) database.commit() return flask.redirect(flask.url_for("blog.index")) return flask.render_template("blog/create.html")
Код формы:
<div> <img src="{{ url_for('static', filename='captcha.gif') }}"></a> </div> <input name="captcha" value="{{ request.form['captcha'] }}" required><br> <input type="submit" value="Send"> </form>
Код капчи:
import random from PIL import Image, ImageDraw def get_captcha(): my_captcha = Captcha() capcha_value = my_captcha.make_captcha() return capcha_value class Captcha: population = 'abcdefghi0123456789jklmnopqrstuvwxyz' save_folder = __file__.rsplit('/', 1)[0] + '/static/' def __init__(self, img_length=90, img_width=60, max_symb_length=8): self.img_length = img_length self.img_width = img_width self.max_symb_length = max_symb_length def make_captcha(self): k = random.randint(3, self.max_symb_length) random_string = ''.join(random.choices(self.population, k=k)) img = Image.new('RGBA', (self.img_length, self.img_width), (0, 0, 0)) draw = ImageDraw.Draw(img) draw.text( (random.randint(0, self.img_length - self.max_symb_length*6), random.randint(0, self.img_width - 10)), random_string, fill=(38, 38, 38) ) rand_l = lambda: ( random.randint(0, self.img_length),random.randint(0,self.img_width) ) for i in range(0, random.randint(3, 6)): draw.line((rand_l(), rand_l()), fill=(38, 38, 38), width=random.randint(0, 2)) for i in range(0, random.randint(5, 15)): draw.point((rand_l(), rand_l(), rand_l(), rand_l(), rand_l()), fill=(38, 38, 38)) img. save(self.save_folder + 'captcha.gif', 'GIF', transparency=0) return random_string
python — Хочу сделать бота, который будет ввести капчу перед тем как пользователь сможет попасть на канал
Вопрос задан
Изменён 5 месяцев назад
Просмотрен 72 раза
from telebot import TeleBot from pyTelegramBotCAPTCHA import CaptchaManager from datetime import datetime, timedelta bot = TeleBot("Token") captcha_manager = CaptchaManager(bot.get_me().id, default_timeout=90) MAX_TRIES = 3 MAX_WRONG_DIGITS = 2 # Message handler for new chat members @bot.message_handler(content_types=["new_chat_members"]) def new_member(message): for user in message.new_chat_members: captcha_manager.restrict_chat_member(bot, message.chat.id, user.id) captcha_manager.send_random_captcha(bot, message.chat, user, timeout=60) # Callback query handler @bot.callback_query_handler(func=lambda callback: True) def on_callback(callback): captcha_manager.update_captcha(bot, callback) # Handler for correct solved CAPTCHAs @captcha_manager.on_captcha_correct def on_correct(captcha): bot.send_message(captcha.chat.id, "Congrats! You solved the CAPTCHA!") captcha_manager.unrestrict_chat_member(bot, captcha.chat.id, captcha.user.id) captcha_manager.delete_captcha(bot, captcha) # Handler for wrong solved CAPTCHAs @captcha_manager.on_captcha_not_correct def on_not_correct(captcha): if ( captcha.incorrect_digits <= MAX_WRONG_DIGITS and captcha.previous_tries < MAX_TRIES ): captcha_manager.refresh_captcha(bot, captcha) else: bot.kick_chat_member( captcha.chat.id, captcha.user.id, until_date=(datetime.now() + timedelta(hours=1)), ) bot. send_message( captcha.chat.id, f"{captcha.user.first_name} failed solving the CAPTCHA and was kicked!", ) captcha_manager.delete_captcha(bot, captcha) # Handler for timed out CAPTCHAS @captcha_manager.on_captcha_timeout def on_timeout(captcha): bot.kick_chat_member( captcha.chat.id, captcha.user.id, until_date=(datetime.now() + timedelta(hours=1)), ) bot.send_message( captcha.chat.id, f"{captcha.user.first_name} did not solve the CAPTCHA and was kicked!", ) captcha_manager.delete_captcha(bot, captcha) bot.polling()
Есть такой код, но я не уверен, что он будет правильно работать. А еще он не запускается, вот ошибка : partially initialized module ‘telebot.types’ has no attribute ‘User’ (most likely due to a circular import)
- python
- telebot
1
Зарегистрируйтесь или войдите
Регистрация через Google
Регистрация через Facebook
Регистрация через почту
Отправить без регистрации
Почта
Необходима, но никому не показывается
Отправить без регистрации
Почта
Необходима, но никому не показывается
Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки
Как настроить CAPTCHA для форм вашего сайта: Поддержка PinnacleCart
Обзор
PinnacleCart имеет встроенную интеграцию с reCAPTCHA , службой Google CAPTCHA . Вам не нужно возиться с кодом, чтобы заставить это работать.
CAPTCHA используется для подтверждения того, что пользователь на сайте является человеком, а не компьютером. Вы бы узнали наиболее часто используемые CAPTCHA как изображение букв, которые выглядят сильно искаженными. Однако с новой reCAPTCHA значительное количество пользователей теперь могут подтвердить, что они люди, без необходимости разгадывать CAPTCHA. Вместо этого всего одним щелчком мыши они могут подтвердить, что они не роботы. Google называет это No CAPTCHA reCAPTCHA .
Хотя вы можете вставить свой код CAPTCHA на свой сайт, что потребует от вас вставки кода, или вы можете использовать reCAPTCHA. Последнее проще.
Для начала вам необходимо создать учетную запись reCAPTCHA. Перейдите на страницу https://www.google.com/recaptcha/intro/index.html. Нажмите Получить reCAPTCHA в правом верхнем углу.
Если у вас еще нет зарегистрированных сайтов для использования reCAPTCHA API , вам необходимо зарегистрировать новый сайт.
Заполните ярлык , выберите тип reCAPTCHA , введите свои домены , примите Условия использования reCAPTCHA , затем нажмите Регистр .
Разверните Ключи в разделе Добавление reCAPTCHA на ваш сайт . Вам понадобится ключ сайта и секретный ключ для вашей административной области .
В области администрирования перейдите к Настройки > Настройки магазина и щелкните вкладку Настройки безопасности .
В поле Открытый ключ reCAPTCHA введите свой ключ сайта из reCAPTCHA. В Закрытый ключ reCAPTCHA введите секретный ключ из шага выше. Нажмите Сохранить .
Это автоматически добавит CAPTCHA в стандартные формы вашего сайта, такие как Страница регистрации .
Примечание. CAPTCHA, добавленные интеграцией reCAPTCHA, не будут отображаться в пользовательских формах. Например, если вы создали контактную форму на странице «Контакты», reCAPTCHA не будет отображаться там. Вы должны кодировать эти формы с помощью CAPTCHA вручную.
Ссылки на связанные статьи
В настоящее время нет.
Если вы не получили ответа на свой вопрос, обратитесь в службу поддержки Pinnacle Cart. Чтобы отправить заявку, перейдите в раскрывающееся меню Моя учетная запись в правом верхнем углу области администрирования и выберите Поддержка.
Марк является автором этой статьи о решении.
Извините, мы не смогли вам помочь. Помогите нам улучшить эту статью своими отзывами.
Как добавить CAPTCHA в форму
- Руководство пользователя Jotform
- Создание форм
- Как добавить CAPTCHA в форму
Последнее обновление:
Идентификатор сообщения
CAPTCHA требует, чтобы пользователи выполняли простые задания, чтобы помочь защитить ваши формы от спамеров и спам-ботов , которые запрограммированы на атаку веб-сайтов, которые они заполняют тоннами нежелательной информации.
Вы можете добавить CAPTCHA в свою форму, выполнив следующие действия:
- Нажмите кнопку Добавить элемент формы в Конструкторе форм.
- Найдите элемент CAPTCHA в разделе «Основные элементы».
- Перетащите элемент в форму.
В Jotform есть три типа CAPTCHA: hCAPTCHA, reCAPTCHA и JotCAPTCHA. Вы можете изменить тип CAPTCHA на панели свойств элемента .
Что такое hCAPTCHA?
hCAPTCHA — это еще одна форма CAPTCHA, специализирующаяся на глубоком обучении и машинном обучении визуальной области в масштабе, с упором на защиту онлайн-систем от все более изощренных современных угроз. hCAPTCHA — это CAPTCHA по умолчанию для Jotform.
Что такое reCAPTCHA?
reCAPTCHA использует усовершенствованный механизм анализа рисков и адаптивные задачи, чтобы не дать вредоносным ботам совершать оскорбительные действия в ваших формах. С помощью reCAPTCHA вы можете переключиться на использование Google Invisible reCAPTCHA. Invisible reCAPTCHA — это улучшенная система CAPTCHA от Google, которая может отличать людей от ботов без дополнительного ввода пользователя. Google Invisible reCAPTCHA активируется только в том случае, если поведение пользователя в браузере каким-то образом вызывает подозрения.
Чтобы использовать Google Invisible reCAPTCHA, выполните следующие действия:
- На панели свойств Captcha выберите параметр reCAPTCHA .
- Переключите Используйте Google Invisible reCAPTCHA в положение «Вкл.», если вы хотите, чтобы reCAPTCHA была скрыта. Вы также можете включить отображение значка.
Что такое JotCAPTCHA?
JotCAPTCHA — это собственная альтернатива CAPTCHA от Jotform. Если вы хотите использовать простую CAPTCHA, когда пользователи вводят только текст с предоставленного изображения, вы можете переключиться на JotCAPTCHA.
Примечание
Если ваши пользователи ввели правильный JotCAPTCHA, форма должна быть отправлена сразу. Однако, если пользователь ввел неверный JotCAPTCHA, форма перенаправит его на отдельную страницу с reCAPTCHA в качестве вторичной проверки. Они должны выполнить приглашение reCAPTCHA и нажать кнопку отправки на странице.
У нас также есть некоторые расширенные виджеты CAPTCHA, которые вы можете использовать.