Skrypty, służą do automatycznego zgłaszania ze strony internetowej (pobiera dane z sitemap) do systemu indeksowania wyszukiwarkek Bing i Google, wykorzystując protokół IndexNow i Indexing API. Jest to przydatne w przypadku, gdy chcesz, aby nowe treści na twojej stronie były szybko odkryte i zindeksowane, co może przyspieszyć ich pojawienie się w wynikach wyszukiwania. Z testów wynika że w przeciągu kilku minut cała zawartość na poziomie 10 tysięcy podstron pojawia się w Google.
Co dokładnie robią skrypty?
- Pobieranie pliku sitemap: Skrypt zaczyna od pobrania pliku sitemap.xml, który zazwyczaj zawiera listę wszystkich dostępnych URL-i na stronie internetowej. Plik ten jest używany przez wyszukiwarki do lepszego rozumienia struktury witryny.
- Analiza pliku sitemap: Po pobraniu, skrypt parsuje plik XML, aby wyodrębnić z niego URL-e. Sitemap XML jest standardem i zazwyczaj stosuje określone schematy nazw, które skrypt musi rozpoznać, aby prawidłowo odczytać URL-e.
- Wysyłanie żądania POST: Następnie skrypt zbiera te URL-e i przygotowuje z nich listę (do 10 000 URL-i na żądanie), którą przesyła do systemu IndexNow poprzez żądanie HTTP POST w formacie JSON. Żądanie to jest wysyłane na serwer wyszukiwarki, z którym chcesz się komunikować (np. Bing).
- Przetwarzanie odpowiedzi: Skrypt również sprawdza odpowiedź od serwera wyszukiwarki, co pozwala zobaczyć, czy zgłoszenie URL-i zakończyło się sukcesem, czy też wystąpiły jakieś problemy.
Jak go uruchomić
Aby uruchomić skrypt Pythona, który automatycznie zgłasza URL-e do systemu IndexNow czy Indexing API, potrzebujesz spełnić kilka podstawowych warunków i wykonać następujące kroki:
Wymagania:
Python: Upewnij się, że masz zainstalowanego Pythona na swoim komputerze. Możesz go pobrać i zainstalować z oficjalnej strony Pythona.
Biblioteka Requests: Musisz mieć zainstalowaną bibliotekę requests, którą możesz zainstalować lub zaktualizować za pomocą polecenia pip. Otwórz terminal lub wiersz poleceń i wpisz:
Skrypt pythonie do Indexing API
import requests
import xml.etree.ElementTree as ET
# Konfiguracja
sitemap_url = 'https://www.example.com/sitemap.xml'
search_engine = 'api.indexnow.org'
host_name = "www.example.com"
key = "2342342342523423423423"
# key_location = "https://www.example.com/5e98e8a534564a618fe410f7b37ba664.txt"
def fetch_sitemap(url):
response = requests.get(url)
response.raise_for_status() # Sprawdza, czy zapytanie się powiodło
return response.text
def parse_sitemap(xml_content):
root = ET.fromstring(xml_content)
namespaces = {'ns': 'http://www.sitemaps.org/schemas/sitemap/0.9'} # Dostosuj namespace do twojego sitemap
url_list = [url.find('ns:loc', namespaces).text for url in root.findall('ns:url', namespaces)]
return url_list
def submit_to_indexnow(url_list, search_engine_hostname):
post_url = f'http://{search_engine_hostname}/indexnow'
headers = {'Content-Type': 'application/json; charset=utf-8'}
body = {
"host": host_name,
"key": key,
# "keyLocation": key_location,
"urlList": url_list
}
response = requests.post(post_url, json=body, headers=headers)
return response.status_code, response.text
# Wykonanie funkcji
sitemap_content = fetch_sitemap(sitemap_url)
urls = parse_sitemap(sitemap_content)
status_code, response_text = submit_to_indexnow(urls[:10000], search_engine) # Przesyła maksymalnie pierwsze 10000 URL-i
print(f"Status: {status_code}, Response: {response_text}")
Skrypt pythonie do Google Indexing
from google.oauth2 import service_account
from googleapiclient.discovery import build
import xml.etree.ElementTree as ET
import requests
# Konfiguracja
# Definiujemy zakresy dostępu do API
SCOPES = ['https://www.googleapis.com/auth/indexing']
# Ścieżka do pliku z kluczem usługi
SERVICE_ACCOUNT_FILE = 'indexing-api.json'
# Adres URL sitemap.xml
sitemap_url = 'https://adreswww.pl/sitemap.xml'
def authenticate_with_google():
"""
Uwierzytelnia się w Google API i zwraca zainicjowany serwis indexing.
"""
# Tworzymy obiekt z klucza usługi
credentials = service_account.Credentials.from_service_account_file(
SERVICE_ACCOUNT_FILE, scopes=SCOPES)
# Inicjujemy serwis indexing z zainicjowanymi poświadczeniami
service = build('indexing', 'v3', credentials=credentials)
return service
def fetch_sitemap(url):
"""
Pobiera treść sitemap.xml z podanego adresu URL.
"""
response = requests.get(url)
response.raise_for_status()
return response.text
def parse_sitemap(xml_content):
"""
Wyodrębnia z sitemap.xml listę URL.
"""
root = ET.fromstring(xml_content)
namespaces = {'ns': 'http://www.sitemaps.org/schemas/sitemap/0.9'}
url_list = [url.find('ns:loc', namespaces).text for url in root.findall('ns:url', namespaces)]
return url_list
def submit_urls_to_google_indexing_api(service, url_list):
"""
Przesyła listę URL do API usługi indexing Google.
"""
for url in url_list:
# Tworzymy treść zapytania
body = {
'url': url,
'type': 'URL_UPDATED'
}
# Przesyłamy zapytanie
response = service.urlNotifications().publish(body=body).execute()
print(f"Przesłano {url}: Odpowiedź {response}")
# Główna logika
google_service = authenticate_with_google()
sitemap_content = fetch_sitemap(sitemap_url)
urls = parse_sitemap(sitemap_content)
submit_urls_to_google_indexing_api(google_service, urls)
Problemy jakie mogą wystąpić
- Błąd
HttpError 403: Permission denied. Failed to verify the URL ownership
sygnalizuje, że Google nie widzi Twojej aplikacji (a dokładniej – konta usługi) jako właściciela adresu URL, który próbujesz zgłosić. - W konsoli Cloud włącz Indexing API dla projektu, z którego pochodzi konto usługi.
- Plik
credentials.json
używany w skrypcie musi pochodzić z tego samego konta usługi. - Skrypt powinien uwierzytelniać się przy pomocy OAuth 2.0 service account bez dodatkowych zakresów – biblioteka
googleapiclient
robi to domyślnie. - Od 2024 r. Google Indexing API jest oficjalnie przeznaczone wyłącznie do stron z
JobPosting
alboBroadcastEvent
wVideoObject
. Zgłaszanie innych typów URL nie jest blokowane technicznie, ale narusza wytyczne i może prowadzić do ograniczenia albo błędów. Zobacz w Google Search Central. - Zweryfikuj witrynę w Google Search Console
- Dodaj właściwość („Domena” obejmuje wszystkie protokoły i subdomeny).
- Zakończ weryfikację (DNS TXT lub inną metodą).