Проблема
Иногда нужно отправить большое количество страниц сайта на переобход в Яндекс Вебмастере. Чтобы роботы этой поисковой системы обошли страницы в приоритетном порядке и они были быстрее проиндексированы. Но квота на переобход может быть меньше той, что нам нужна. Например, нам нужно отправить на переобход 300 страниц, а квота (в день) 200.
Решение
Скрипт на python, который:
- Берёт из файла urls.csv url-ы (адреса страниц), отправляет их по очереди на переобход в Яндекс Вебмастер с помощью API Яндекс Вебмастера. Столько раз (урлов), сколько дневной лимит (указывается в переменной limit).
- Удаляет отправленные url-ы из файла urls.csv
- Запускается каждый день с помощью планировщика задач Windows.
- Если все url-ы отправлены на переобход (файл urls.csv пуст), отправляется оповещение в телеграм-бота, что все url-ы отправлены.
Входные данные для скрипта
OAuth токен, переменная token.
Инструкция по получению здесь https://yandex.ru/dev/direct/doc/start/token.html.
Токен и chat id телеграм
Шаг 1: Создание бота
- Найдите BotFather в Telegram. Откройте Telegram и найдите пользователя
@BotFather
. - Создайте нового бота. Отправьте команду
/newbot
в чат с BotFather. - Следуйте инструкциям BotFather:
- Вас попросят выбрать имя для бота.
- Затем вас попросят выбрать уникальное имя пользователя для бота, которое должно заканчиваться на «bot» (например,
myawesomebot
).
- Получите токен API. После создания бота BotFather предоставит вам токен API, который выглядит примерно так:
123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11
.
Шаг 2: Найдите chat_id
- Отправьте сообщение вашему боту. Найдите вашего бота в Telegram с помощью имени пользователя, которое вы выбрали, и отправьте ему любое сообщение.
- Получите chat_id. Введите следующий URL в браузере, заменив
TOKEN
на токен вашего бота:
https://api.telegram.org/bot/getUpdates
В ответе API найдите объект chat
, который будет содержать id
— это ваш chat_id.
Пример получения chat_id:
Если ваш токен API выглядит так: 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11
, то URL для получения обновлений будет:
https://api.telegram.org/bot123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11/getUpdates
В ответе будет что-то вроде:
{
"ok": true,
"result": [
{
"update_id": 123456789,
"message": {
"message_id": 1,
"from": {
"id": 987654321,
"is_bot": false,
"first_name": "YourName",
"username": "yourusername",
"language_code": "en"
},
"chat": {
"id": 987654321, # Это ваш chat_id
"first_name": "YourName",
"username": "yourusername",
"type": "private"
},
"date": 1638380671,
"text": "Hello"
}
}
]
}
Ваш chat_id — это значение id
в объекте chat
.
HOST_ID
Сайт из Яндекс Вебмастера в формате https:site.ru:443
LIMIT
Нужно указать дневной лимит указанный в Яндекс Вебмастере (см. скриншот выше)
Автоматизация
- Откройте Планировщик заданий.
- Нажмите «Создать простую задачу…» в правой панели.
- Задайте имя и описание задачи.
- Выберите «Ежедневно» для частоты выполнения.
- Установите время и интервал в 1 день.
- Создайте в папке проекта файл с расширением .bat. Пропишите в нем места расположения python и скрипта (см. комментарии в примере файла):
::Изменение текущего рабочего каталога, для избежания ошибок с ненайденным файлом urls.csv
cd /d C:\Users\victorem\!python_scripts\add_feeds
::Запуск скрипта, 1 - где расположен установленный python, 2 - где расположен скрипт
C:\Users\victorem\AppData\Local\Programs\Python\Python310\python.exe C:\Users\victorem\!python_scripts\add_feeds\to_indexing_one_domain.py
:: Для отладки. Оставляет консоль открытой, если есть ошибки - смотрим в консоли.
::pause
- В поле «Программа или сценарий» пропишите полный путь до файла .bat
- Завершите создание задачи.
Скрипт
import csv
import requests
# Замените на ваш OAuth токен
token = ""
headers = {"Authorization": f"OAuth {token}"}
# Telegram Bot конфигурация
telegram_bot_token = "ваш_токен_бота"
telegram_chat_id = "ваш_chat_id"
# Получить ID пользователя
user_url = "https://api.webmaster.yandex.net/v4/user"
user_response = requests.get(user_url, headers=headers)
user_id = user_response.json()["user_id"]
# Конфигурация
API_URL = f"https://api.webmaster.yandex.net/v4/user/{user_id}/hosts/{{host_id}}/recrawl/queue/"
HOST_ID = "ваш_host_id" # Замените на ваш HOST_ID
LIMIT = 10 # Количество URL, обрабатываемых за один запуск скрипта
def read_urls(file_path):
"""
Читает URL из файла CSV и возвращает их в виде списка.
"""
with open(file_path, mode='r', newline='', encoding='utf-8') as file:
reader = csv.reader(file)
urls = [row[0] for row in reader]
return urls
def write_urls(file_path, urls):
"""
Записывает список URL в файл CSV, перезаписывая существующие данные.
"""
with open(file_path, mode='w', newline='', encoding='utf-8') as file:
writer = csv.writer(file)
for url in urls:
writer.writerow([url])
def send_url_to_recrawl(url):
"""
Отправляет URL на переобход в Яндекс Вебмастер.
Возвращает True, если запрос был успешным, иначе False.
"""
headers = {
"Authorization": f"OAuth {token}",
"Content-Type": "application/json"
}
data = {
"url": url
}
response = requests.post(API_URL.format(host_id=HOST_ID), json=data, headers=headers)
return response.status_code == 200
def send_telegram_message(message):
"""
Отправляет сообщение в Telegram с использованием Bot API.
"""
send_text = f"https://api.telegram.org/bot{telegram_bot_token}/sendMessage?chat_id={telegram_chat_id}&text={message}"
response = requests.get(send_text)
return response.json()
def main():
"""
Основная функция, выполняющая следующие действия:
1. Чтение URL из файла urls.csv.
2. Проверка на пустой список URL. Если пуст, отправка сообщения в Telegram.
3. Отправка URL на переобход в Яндекс Вебмастер, ограничивая количество до значения LIMIT.
4. Обновление файла urls.csv с оставшимися URL.
"""
urls = read_urls('urls.csv')
if not urls:
# Если список URL пуст, отправляем сообщение в Telegram и завершаем выполнение.
send_telegram_message(f"Все URL {HOST_ID} обработаны.")
return
for _ in range(min(LIMIT, len(urls))):
url = urls.pop(0) # Берем первый URL из списка и удаляем его
send_url_to_recrawl(url) # Отправляем URL на переобход
# Перезаписываем файл urls.csv оставшимися URL
write_urls('urls.csv', urls)
if __name__ == "__main__":
main() # Запуск основной функции