diff --git a/base/indexnow.py b/base/indexnow.py new file mode 100644 index 0000000..4b4832a --- /dev/null +++ b/base/indexnow.py @@ -0,0 +1,9 @@ +import hashlib +from base64 import urlsafe_b64encode + +from django.conf import settings +from django.utils.crypto import pbkdf2 + + +def get_key(): + return settings.INDEXNOW_KEY diff --git a/base/views.py b/base/views.py index 91ea44a..dc4fea3 100644 --- a/base/views.py +++ b/base/views.py @@ -1,3 +1,14 @@ -from django.shortcuts import render +from django.conf import settings +from django.http import Http404, HttpResponse +from django.utils.crypto import constant_time_compare +from django.views import View +from base.indexnow import get_key + + +class KeyView(View): + def get(self, request, key): + if not constant_time_compare(key, get_key()): + raise Http404() + + return HttpResponse(key) -# Create your views here. diff --git a/base/wagtail_hooks.py b/base/wagtail_hooks.py new file mode 100644 index 0000000..135e5e2 --- /dev/null +++ b/base/wagtail_hooks.py @@ -0,0 +1,25 @@ +from django.conf import settings +from wagtail import hooks +from wagtail.models import Page +from urllib.parse import urlparse +from base.indexnow import get_key +import requests + + +@hooks.register('after_publish_page') +def after_publish_page(request, page): + page_url = page.full_url + # avoid if the host is localhost (development) + print("preparing to notify") + if urlparse(page_url).hostname == "localhost": + print("not notifying indexnow for localhost" + get_key() + ", page url: " + page_url) + return + session = requests.Session() + session.post( + "https://api.indexnow.org/indexnow", + json={ + "host": urlparse(page_url).hostname, + "urlList": [page_url], + "key": get_key(), + }, + ).raise_for_status() diff --git a/iamkonstantin_web/settings/base.py b/iamkonstantin_web/settings/base.py index c8b27dc..be1a823 100644 --- a/iamkonstantin_web/settings/base.py +++ b/iamkonstantin_web/settings/base.py @@ -212,4 +212,6 @@ TAILWIND_APP_NAME = 'theme' INTERNAL_IPS = [ "127.0.0.1", -] \ No newline at end of file +] + +INDEXNOW_KEY = '6207353506374e99ae67c41edb8df2e0' \ No newline at end of file diff --git a/iamkonstantin_web/urls.py b/iamkonstantin_web/urls.py index 6816377..1a7982a 100644 --- a/iamkonstantin_web/urls.py +++ b/iamkonstantin_web/urls.py @@ -10,6 +10,7 @@ from wagtail.documents import urls as wagtaildocs_urls from blog.feeds import RssBlogFeed from search import views as search_views from wagtail.contrib.sitemaps.views import sitemap +from base.views import KeyView urlpatterns = [ path("django-admin/", admin.site.urls), @@ -18,7 +19,8 @@ urlpatterns = [ path("search/", search_views.search, name="search"), path("blog/feed/", RssBlogFeed(), name="blog_feed"), path('sitemap.xml', sitemap), - path('robots.txt', TemplateView.as_view(template_name="robots.txt", content_type="text/plain")) + path('robots.txt', TemplateView.as_view(template_name="robots.txt", content_type="text/plain")), + path('.txt', KeyView.as_view()) ] if settings.DEBUG: