reCAPTCHA — это решение, которое я выбрал для решения этой же проблемы.
И, будучи поклонником Python, вот пример, которому я следовал, чтобы реализовать это решение в Django (ссылка: пример Google codelab):
<сильный>1. Подготовка
Установите и проверьте веб-сервер
Эту кодовую лабораторию можно запустить локально или через оболочку gcloud в Google Cloud Platform. Чтобы начать работу с оболочкой gcloud, перейдите на страницу https://console.cloud.google.com/appengine/start.
Загрузить код
Скопируйте весь код для этой кодлабы:
git clone https://github.com/googlecodelabs/recaptcha-codelab.git
Для Питона:
cd recaptcha-codelab/phase1-python
python server.py
В веб-браузере перейдите по адресу http://localhost:8080, чтобы увидеть пример пользовательского интерфейса без встроенной reCAPTCHA.
<сильный>2. Регистрация в консоли администратора reCAPTCHA
... Мы рекомендуем, если у вас есть время, выполнить и создать свою собственную регистрацию в консоли администратора. Прежде чем использовать reCAPTCHA в разработке или производстве, вам необходимо выполнить этот шаг.
Сначала перейдите на сайт администратора reCAPTCHA.
Выберите «Invisible reCAPTCHA» в качестве типа капчи.
Заполните список доменов, для которых вы хотите показывать капчу. Ключ сайта reCAPTCHA, который вы создадите, будет работать только на этих доменах. Сохраните ключ сайта и секретный ключ для последующих этапов.
<сильный>3. Добавьте невидимую reCAPTCHA во внешний интерфейс — Python
Давайте обновим внешний интерфейс, чтобы вызывать Invisible reCAPTCHA с помощью вашего любимого текстового редактора.
Сначала добавим тег скрипта к элементу html в файле feedback.html.
feedback.html
<html>
<head>
<title>Suggestion page</title>
<script src='https://www.google.com/recaptcha/api.js'></script>
Теперь обновите атрибуты кнопки отправки. Добавьте class='g-recaptcha'
data-sitekey="YOUR SITE KEY"
и добавьте data-callback
.
feedback.html
<button class="g-recaptcha"
data-sitekey="6LfeHx4UAAAAAAKUx5rO5nfKMtc9-syDTdFLftnm"
data-callback="onSubmit">Submit</button>
Полный файл должен быть:
feedback.html
<!DOCTYPE html>
<!DOCTYPE html>
<html>
<head>
<title>Suggestion page</title>
<script src='https://www.google.com/recaptcha/api.js'></script>
<script>
function onSubmit() {
document.getElementById("demo-form").submit();
}
</script>
<style>
body {
font-family: Helvetica, sans-serif;
}
.status-message {
background-color: #5ff;
margin-bottom: 10px;
text-align: center;
}
textarea {
margin: 10px 0;
resize: none;
}
</style>
</head>
<body>
<h3>Give us feedback on our webpage!</h3>
<div class="status-message">%s</div>
<form id="demo-form" action="/feedback" method="POST">
Your comment <br><textarea name="feedback" cols="50" rows="5"></textarea><br>
<!-- Replace this with your site key -->
<button class="g-recaptcha"
data-sitekey="6LfeHx4UAAAAAAKUx5rO5nfKMtc9-syDTdFLftnm"
data-callback="onSubmit">Submit</button>
</form>
</body>
</html>
<сильный>3. Проверка невидимой reCAPTCHA на сервере — Python
В разделе «Регистрация в консоли администратора reCAPTCHA» мы создали новый ключ сайта. В рамках этого процесса был создан секрет сайта. Секрет сайта необходим для проверки решения CAPTCHA. Для целей этой лаборатории кода вы можете использовать предоставленные ключи по умолчанию. Они будут работать только на локальном хосте.
Проверка токена reCAPTCHA выполняется путем отправки запроса POST на https://www.google.com/recaptcha/api/siteverify. Подробности см. в разделе Проверка ответа пользователя.
Чтобы проверить токен reCAPTCHA, давайте обновим сервер. Сначала нам нужно добавить секрет сайта и константы проверки сайта.
server.py
SITE_VERIFY_URL = 'https://www.google.com/recaptcha/api/siteverify'
SITE_SECRET = '6LfeHx4UAAAAAFWXGh_xcL0B8vVcXnhn9q_SnQ1b'
RECAPTCHA_RESPONSE_PARAM = 'g-recaptcha-response'
Затем нам нужно обновить наш обработчик POST, чтобы проверить токен.
server.py
def do_POST(self):
self.set_headers();
post_body = parse_qs(self.rfile.read(int(self.headers['Content-Length'])))
success = False
if RECAPTCHA_RESPONSE_PARAM in post_body:
token = post_body[RECAPTCHA_RESPONSE_PARAM][0]
resp = urllib.urlopen(
SITE_VERIFY_URL, urllib.urlencode(
{'secret': SITE_SECRET, 'response': token}, True)).read()
if json.loads(resp).get("success"):
success = True
if success:
message = 'Thanks for the feedback!'
else:
message = 'There was an error.'
self.wfile.write(open(curdir + sep + 'feedback.html').read() % message)
Окончательный файл должен выглядеть так:
server.py
import json
import urllib
from os import curdir, sep
from urlparse import parse_qs
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
SITE_VERIFY_URL = 'https://www.google.com/recaptcha/api/siteverify'
SITE_SECRET = '6LfeHx4UAAAAAFWXGh_xcL0B8vVcXnhn9q_SnQ1b'
RECAPTCHA_RESPONSE_PARAM = 'g-recaptcha-response'
class Handler(BaseHTTPRequestHandler):
def set_headers(self):
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
def do_GET(self):
self.set_headers();
self.wfile.write(open(curdir + sep + 'feedback.html').read() % '')
def do_POST(self):
self.set_headers();
post_body = parse_qs(self.rfile.read(int(self.headers['Content-Length'])))
success = False
if RECAPTCHA_RESPONSE_PARAM in post_body:
token = post_body[RECAPTCHA_RESPONSE_PARAM][0]
resp = urllib.urlopen(
SITE_VERIFY_URL, urllib.urlencode(
{'secret': SITE_SECRET, 'response': token}, True)).read()
if json.loads(resp).get("success"):
success = True
if success:
message = 'Thanks for the feedback!'
else:
message = 'There was an error.'
self.wfile.write(open(curdir + sep + 'feedback.html').read() % message)
if __name__ == '__main__':
httpd = HTTPServer(('', 8080), Handler)
httpd.serve_forever()
Готово! Теперь перезагрузите сервер и попробуйте. Завершенную версию можно найти в final-python/server.py. Теперь у вас есть базовая интеграция с reCAPTCHA для защиты вашей формы. В фоновом режиме мы проверяем пользователя и иногда показываем запрос reCAPTCHA, чтобы убедиться, что ваш сайт защищен от злоупотреблений. Дополнительную информацию и варианты можно найти на нашем сайте для разработчиков.