Kuala

Рейтинг
16
Регистрация
14.01.2025
Genius Ideaing #:

выложите пожалуйста этот скриптик на Пайтон...

я его перепишу на ПэХаПэ...

очень нужно... 

Так а смысл какой. но если ты так хочешь

import json
import time
import logging
from datetime import datetime
from google.oauth2 import service_account
from google.auth.transport.requests import AuthorizedSession
import os

class GoogleIndexingAPI:
    def __init__(self, service_account_file: str, urls_file: str, log_file: str = 'indexing.log'):
        self.service_account_file = service_account_file
        self.urls_file = urls_file
        
        
        logging.basicConfig(
            filename=log_file,
            level=logging.INFO,
            format='[%(asctime)s] [%(levelname)s] %(message)s',
            datefmt='%Y-%m-%d %H:%M:%S'
        )
        self.logger = logging.getLogger(__name__)
        
        
        console_handler = logging.StreamHandler()
        console_handler.setLevel(logging.INFO)
        formatter = logging.Formatter('[%(asctime)s] [%(levelname)s] %(message)s')
        console_handler.setFormatter(formatter)
        self.logger.addHandler(console_handler)

    def get_authenticated_session(self):
        try:
            credentials = service_account.Credentials.from_service_account_file(
                self.service_account_file,
                scopes=['https://www.googleapis.com/auth/indexing']
            )
            
            session = AuthorizedSession(credentials)
            self.logger.info(f"Successfully authenticated with service account")
            return session
            
        except Exception as e:
            self.logger.error(f"Authentication failed: {str(e)}")
            return None

    def submit_url(self, session, url: str):
        api_url = 'https://indexing.googleapis.com/v3/urlNotifications:publish'
        
        data = {
            'url': url,
            'type': 'URL_UPDATED'
        }
        
        try:
            self.logger.info(f"Submitting URL to index: {url}")
            response = session.post(api_url, json=data)
            
            if response.status_code == 200:
                response_data = response.json()
                if ('urlNotificationMetadata' in response_data and
                    'url' in response_data['urlNotificationMetadata'] and
                    response_data['urlNotificationMetadata']['url'] == url):
                    self.logger.info(f"Successfully submitted URL: {url}")
                    return True
                else:
                    self.logger.warning(f"URL mismatch in response for: {url}")
                    return False
            else:
                self.logger.error(f"Failed to submit URL {url}. Status code: {response.status_code}")
                self.logger.error(f"Response: {response.text}")
                return False
                
        except Exception as e:
            self.logger.error(f"Error submitting URL {url}: {str(e)}")
            return False

    def process_urls(self):
        if not os.path.exists(self.urls_file):
            self.logger.error(f"URLs file not found: {self.urls_file}")
            return
            
        session = self.get_authenticated_session()
        if not session:
            return
            
        try:
            with open(self.urls_file, 'r') as f:
                urls = [line.strip() for line in f if line.strip()]
                
            self.logger.info(f"Found {len(urls)} URLs to process")
            
            successful_urls = []
            failed_urls = []
            
            for url in urls:
                if self.submit_url(session, url):
                    successful_urls.append(url)
                else:
                    failed_urls.append(url)
                time.sleep(1)  
            
            
            if failed_urls:
                failed_file = 'failed_urls.txt'
                with open(failed_file, 'w') as f:
                    for url in failed_urls:
                        f.write(f"{url}\n")
                self.logger.info(f"Failed URLs written to {failed_file}")
            
            self.logger.info(f"Processing complete. Success: {len(successful_urls)}, Failed: {len(failed_urls)}")
            
        except Exception as e:
            self.logger.error(f"Error processing URLs: {str(e)}")

if __name__ == "__main__":
    # Configuration
    SERVICE_ACCOUNT_FILE = "service-account.json"  # путь к файлу джсон
    URLS_FILE = "urls.txt"  # файл с урлами страним
    LOG_FILE = "indexing.log"  # лог файл
    
    indexer = GoogleIndexingAPI(SERVICE_ACCOUNT_FILE, URLS_FILE, LOG_FILE)
    indexer.process_urls()

У меня свой скрипт на Python, который берет ссылки из URL и отправляет в Indexing API. Я делал скрипт, который при обновлении страницы слал запрос. Толку — 0. Может, он в очередь добавляет где-то себе, но точно не моментально запускает Google-бота. А все эти скрипты отличаются лишь языком, а запросы у всех одни :)

Djezzy #:

Так мне не нужно отключать карту сайта, мне нужно изменить адрес страницы.

Спроси в поддержке у них. Так проще всего

Vladimir SEO #:

это почему же ?


у меня в теме для вариативного товара который варьируется по цветам. Можно только 1 фото выбрать для вариации...

Vladimir SEO #:
нет - это разные товары, но стоит их делать разными в плане страниц только при условии что есть частота у запросов по цветам

Да я бы засунул это в одну карточку товара, но тогда не получится пользователю все показать. Думаю для пф будет лучше. Так как есть видео везде + фотки

Антоний Казанский #:

Лучше - nazvanie-tovara. В название файла вставлять транзакцию и топонимы не нужно.

Файлы какие? pdf, картинки, архивы?

Я так понимаю, что картинки.

картинки

Все они — плюс-минус SEO-оптимизированные. Еще зависит от того, как ты настроишь. Я использую Yoast SEO — его с головой хватает. А по поводу тем: https://themeforest.net/category/wordpress/blog-magazine(не реклама) — выбирай, не хочу :) Все на твой вкус и цвет.
P.s Revision тема зацепила новый дизайн у нее так еще и оптимизированная по загрузке😀
И еще вопрос. Нужно ли придумывать для каждой карточки разное название? Или можно просто цвет в конце добавлять и получится "Шкура искусственная и цвет". И например если есть светло серый цвет и просто серый, темно серый и так несколько штук. Как их разделять? 
Genius Ideaing #:

ПС Яндекс метит страницы как дубли а точнее маловостребованные и малополезные (МПК) по самому пессимистичному сценарию...

так что под эту идиотскую ПС вы вряд ли сможете держать все не сильно разные товарные страницы в индексе одновременно как уникальные ....

в Гугле все будет норм.. 

я в гугле:)

Vladimir SEO #:
удалите их )

спасибо большое. Сам почему то не увидел)

Всего: 93