en
Feedback
Записки м̶о̶л̶о̶д̶о̶г̶о̶ вебмастера

Записки м̶о̶л̶о̶д̶о̶г̶о̶ вебмастера

Open in Telegram

Данный канал посвящён моему опыту в контентных проектах. Так сказать амбициозный новичок в вебмастерском деле с минимальным бюджетом. Стартуем? Навигация по каналу - https://telegra.ph/Navigaciya-po-kanalu-08-15

Show more
1 098
Subscribers
No data24 hours
-37 days
-430 days
Posts Archive
А еще сегодня день пофигиста! - Что? - Что?

В комментах под предыдущим постом скинули мне это расширение - https://chromewebstore.google.com/detail/gsc-guardian/aomiehgfjgolamlllgbkjbnfmdmffcch Оно накладывает апы гугла на график в серч консоли, то есть если просто надо посмотреть как себя вёл сайт (один сайт) после и во время апа - нормальный вариант. Но если у вас несколько проектов и надо их сравнивать друг с другом, я все же буду использовать скрипт, который описал выше. Он выводит на один график все проекты, которые туда добавить, но за расширение спасибо, я не знал о нем



    # Добавляем прямоугольники (vrect) для Google Updates
    for upd in GOOGLE_UPDATES:
        if upd['name'] in selected_updates:
            fig.add_vrect(
                x0=upd['start'], x1=upd['end'],
                fillcolor='red', opacity=0.1, layer='below', line_width=0,
                annotation_text=upd['name'],
                annotation_position="top left"
            )

    # Добавляем события (вертикальные линии) для выбранных ev
    for ev in EVENTS:
        if ev['name'] in selected_events:
            date_str = pd.to_datetime(ev['date']).strftime('%Y-%m-%d')
            print(f"Adding event line: {ev['name']} at {date_str}")  # Диагностика
            fig.add_vline(
                x=date_str,
                line_color='blue',
                opacity=1.0,
                line_width=2,
                layer='above'
            )
            fig.add_annotation(
                x=date_str,
                y=1,
                xref='x',
                yref='paper',
                text=ev['name'],
                showarrow=True,
                arrowhead=2,
                ax=0,
                ay=-40,
                font=dict(color='blue', size=12)
            )

    # Настройка осей
    fig.update_layout(
        title="GSC Трафик",
        xaxis_title="Дата",
        yaxis_title="Значение",
        legend_title="Сайты и метрики",
        xaxis=dict(
            tickmode='linear',
            tick0=pd.to_datetime(START_DATE),
            dtick=86400000.0,  # один день (в мс)
            tickformat="%d-%m-%Y",
            rangeslider=dict(visible=True),
        )
    )

    # Если метрик нет => вручную задаём X-ось (иначе range может оказаться [0..1])
    if not selected_metrics:
        print("No metrics selected -> Forcing x-range to START..END")
        fig.update_xaxes(range=[START_DATE, END_DATE])

    # Обработка зума (для Y-оси)
    if relayoutData:
        if "xaxis.range[0]" in relayoutData and "xaxis.range[1]" in relayoutData and selected_metrics:
            x_start = pd.to_datetime(relayoutData["xaxis.range[0]"])
            x_end = pd.to_datetime(relayoutData["xaxis.range[1]"])
            mask = (filtered_df['date'] >= x_start) & (filtered_df['date'] <= x_end)
            zoomed_df = filtered_df[mask]
            if not zoomed_df.empty:
                y_min = zoomed_df[selected_metrics].min().min()
                y_max = zoomed_df[selected_metrics].max().max()
                y_padding = (y_max - y_min) * 0.05
                fig.update_yaxes(range=[y_min - y_padding, y_max + y_padding])

    # Чтобы при переключении чекбоксов не сбрасывался зум или аннотации
    fig.update_layout(uirevision='fixed')

    return fig

if __name__ == '__main__':
    app.run(debug=True)
В данном коде необходимо изменить следующее: Строка 14 - вписать ваши домены, которые нужно вывести на графике Строка 19 - указываем период, за который нужны данные (если проектов много, рекомендую не брать слишком большой период - будет долго подгружать) Строка - 25-46 - тут я вписал апы Гугла - вы можете добавить если что то не указано Строка 48 - тут вписываете события, которые хотите видеть на графике (они будут показаны вертикальной линией, как на скрине выше) Строка 84 - название вашего JSON - файла (который расположен в той же папке, что и сам скрипт) Все - вы почти готовы начинать... Устанавливаем зависимости этой командой
pip install dash plotly pandas google-auth google-auth-oauthlib google-auth-httplib2 google-api-python-client
И запускаем скрипт
python main.py
Когда скрипт запустится вы увидите в терминале, что дашборд доступен по локальному адресу, в моем случае это - http://127.0.0.1:8050 - переходим по этому адресу и работаем с дашбордом Ну и да, новые апы нужно будет добавлять руками уже самостоятельно, а как вы хотели, некоммерческие проекты они такие🤷



def fetch_gsc_data(property_uri, start_date, end_date, creds):
    service = build('searchconsole', 'v1', credentials=creds)
    body = {
        'startDate': start_date,
        'endDate': end_date,
        'dimensions': ['date'],
        'rowLimit': 10000
    }
    response = service.searchanalytics().query(siteUrl=property_uri, body=body).execute()
    rows = response.get('rows', [])
    data = []
    for r in rows:
        d = r['keys'][0]
        data.append({
            'date': d,
            'clicks': r.get('clicks', 0),
            'impressions': r.get('impressions', 0),
            'position': r.get('position', 0)
        })
    df = pd.DataFrame(data)
    df['date'] = pd.to_datetime(df['date'])
    return df

def load_all_data(
    start_date=START_DATE, 
    end_date=END_DATE, 
    sites=SITES, 
    creds_file="Название вашего JSON-файла"
):
    creds = service_account.Credentials.from_service_account_file(
        creds_file,
        scopes=["https://www.googleapis.com/auth/webmasters.readonly"]
    )
    all_df = []
    for s in sites:
        df_s = fetch_gsc_data(s, start_date, end_date, creds)
        df_s['domain'] = s
        all_df.append(df_s)
    big_df = pd.concat(all_df, ignore_index=True)
    return big_df

app = dash.Dash(__name__)
GLOBAL_DF = None  # кешируем загруженные данные

app.layout = html.Div([
    html.H1("GSC Дашборд - Клики, Показы, Позиция"),

    html.Div([
        html.Label("Выберите сайт(-ы):"),
        dcc.Checklist(
            id='site-selector',
            options=[{'label': site, 'value': site} for site in SITES],
            value=SITES,  
            inline=True
        ),
    ]),

    html.Div([
        html.Label("Метрики:"),
        dcc.Checklist(
            id='metric-selector',
            options=[
                {'label': 'Клики', 'value': 'clicks'},
                {'label': 'Показы', 'value': 'impressions'},
                {'label': 'Позиция', 'value': 'position'},
            ],
            # Если тут пусто, у нас нет рядов данных => ось X может стать [0..1]
            value=[],  
            inline=True
        ),
    ]),

    html.Div([
        html.Label("Показать Google Updates:"),
        dcc.Checklist(
            id='updates-toggle',
            options=[{'label': u['name'], 'value': u['name']} for u in GOOGLE_UPDATES],
            value=[],  
            inline=True
        ),
    ]),

    html.Div([
        html.Label("Показать события:"),
        dcc.Checklist(
            id='events-toggle',
            options=[{'label': e['name'], 'value': e['name']} for e in EVENTS],
            value=[],  
            inline=True
        ),
    ]),

    dcc.Graph(id='gsc-graph')
])

@app.callback(
    Output('gsc-graph', 'figure'),
    [
        Input('site-selector', 'value'),
        Input('metric-selector', 'value'),
        Input('updates-toggle', 'value'),
        Input('events-toggle', 'value'),
        Input('gsc-graph', 'relayoutData')
    ]
)
def update_graph(selected_sites, selected_metrics, selected_updates, selected_events, relayoutData):
    global GLOBAL_DF
    if GLOBAL_DF is None:
        GLOBAL_DF = load_all_data()

    print("=== CALLBACK ===")
    print("Selected events: ", selected_events)  # Проверяем в консоли, что выбрано

    fig = go.Figure()

    # Фильтруем общий DF по выбранным доменам
    filtered_df = GLOBAL_DF[GLOBAL_DF['domain'].isin(selected_sites)]

    # Если выбраны метрики, строим линии
    if selected_metrics:
        for site in selected_sites:
            df_site = filtered_df[filtered_df['domain'] == site].sort_values('date')
            for metric in selected_metrics:
                fig.add_trace(go.Scatter(
                    x=df_site['date'],
                    y=df_site[metric],
                    mode='lines',
                    name=f"{site} - {metric}"
                ))

Палю годноту - рабочее решение для сопоставления вашего трафика (показов, кликов, позиций) из Серч консоли с апдейтами Гугла Не прям автоматизированное решение, где вся инфа подгружается автоматом, понадобится провести настройку, но все работает в итоге, без мам пап и всяких платных посредников. Настраиваем свой персональный дашбоард у себя на компе, для чего нужно: 1 - Создать проект в Google Cloud Console Переходим на https://console.cloud.google.com/ Создаем новый проект Переходим в APIs & Services → Library Находим и включаем API: Google Search Console API 2. Создать Service Account Переходим в IAM & Admin → Service Accounts Нажимаем Create Service Account и создаем его Далее создаем и скачаем JSON-файл с ключом (credentials.json) Сохраняем этот файл – он понадобится в корне проекта (в той же папке, где будет основной скрипт) Почту из строки client_email необходимо будет добавить в качестве админа в вашей Серч Консоли (для нужного сайта). Далее в той же папке, где у вас лежит JSON-файл создаем файл с расширением .py, я делаю всегда так - main.py
import os
import json
import pandas as pd
import plotly.graph_objs as go
import dash
from dash import dcc, html
from datetime import datetime
from dash.dependencies import Input, Output

from google.oauth2 import service_account
from googleapiclient.discovery import build

# Ваши константы
SITES = [
    "sc-domain:Ваш домен",
    "sc-domain:Ваш домен",
]

# Даты, за которые берем данные
START_DATE = "2024-01-01"
END_DATE   = "2025-04-12"

# ============================================================
# Обновленный список Google Updates с дополнительными данными
# ============================================================
GOOGLE_UPDATES = [
    {"name": "March 2025 core update", "start": "2025-03-13", "end": "2025-03-26"},
    {"name": "December 2024 spam update", "start": "2024-12-19", "end": "2024-12-26"},
    {"name": "December 2024 core update", "start": "2024-12-12", "end": "2024-12-18"},
    {"name": "November 2024 core update", "start": "2024-11-11", "end": "2024-12-04"},
    {"name": "Ranking is experiencing an ongoing issue (Aug 2024)", "start": "2024-08-15", "end": "2024-08-19"},
    {"name": "August 2024 core update", "start": "2024-08-15", "end": "2024-09-03"},
    {"name": "June 2024 spam update", "start": "2024-06-20", "end": "2024-06-27"},
    {"name": "March 2024 spam update", "start": "2024-03-05", "end": "2024-03-19"},
    {"name": "March 2024 core update", "start": "2024-03-05", "end": "2024-04-19"},
    {"name": "November 2023 reviews update", "start": "2023-11-08", "end": "2023-12-07"},
    {"name": "November 2023 core update", "start": "2023-11-02", "end": "2023-11-27"},
    {"name": "October 2023 core update", "start": "2023-10-05", "end": "2023-10-18"},
    {"name": "Ranking is experiencing an ongoing issue (Oct 2023)", "start": "2023-10-05", "end": "2023-10-31"},
    {"name": "October 2023 spam update", "start": "2023-10-04", "end": "2023-10-19"},
    {"name": "September 2023 helpful content update", "start": "2023-09-14", "end": "2023-09-27"},
    {"name": "August 2023 core update", "start": "2023-08-22", "end": "2023-09-07"},
    {"name": "April 2023 reviews update", "start": "2023-04-12", "end": "2023-04-25"},
    {"name": "March 2023 core update", "start": "2023-03-15", "end": "2023-03-28"},
    {"name": "February 2023 product reviews update", "start": "2023-02-21", "end": "2023-03-07"},
]

# События на сайте
EVENTS = [
    {"name": "Ваше событие",           "date": "2024-02-12"},
    {"name": "Ваше событие",         "date": "2024-02-16"},
    {"name": "Ваше событие",      "date": "2024-02-27"},
    {"name": "Ваше событие",          "date": "2024-03-20"},
    {"name": "Ваше событие",          "date": "2024-03-21"},
]

Когда написал статью на Хабре и ждал хороших комментариев, а тебе накидали минусов

Накипело в очередной раз, с этим Хабром блин... Почему вот так получается - пишешь статью, ну полная хрень, прям откровенно воняет рекламой, публикуешь скрепя сердцем на Хабре - статья попадает в Топ выдачи, проходит мимо едких и говнокомментаторов и все в целом с ней гуд. Она не портит карму аккаунту, и спокойненько сидит себе в топе. Но вот ты взял интересную тему, разобрался в вопросе (не глубоко, вероятно, но все же), потратил неделю в общей сложности на сбор информации, осознание ее у себя в голове - написал статью, потратил пару часов на оформление, чтоб было не так сухо читать. Налетели говнокоммментаторы и убивают карму своими минусами? Думал короче ты Лев Толстой, а на деле... Ну вы поняли. И нет бы еще че нить дельное писали - а то обзываются, говорят нейротекст и тп. Короче Хабр - сука, сложная штука, а аудитория там еще сложнее..

Нашел в интернетах гайд, как настроить у себя на локальном компьютере мощщщщную Нейросеть, чтобы она могла поглощать большие файлы, и не упиралась в лимит строк. Условно, если даешь объемный файл нейросети на анализ в рамках чата, она не сможет обработать больше своего лимита, а вот если настроить через этот гайд - будет есть большие файлы без проблем. Сразу спойлер - на бесплатной версии это особо не помогло. Я скормил ей файд на 1600 строк, она пыхтела, пыхтела.. Пыхтела пыхтела, несколько раз я писал ей продолжай, она продолжала пыхтеть и в конце концов уперлась в ограничение по бесплатным запросам. Результат не было GPT о3 с первого раза смог интерпретировать эти 1600 запросов. Дальше думатйте сами, надо оно вам или нет, но вот гайд по установке такого себе на локаль. работает с Claude 1 - Ставим себе декстопную версию Claude 2 - Ставим Питон (если еще не) 3 - Ставим зависимости, я через VSCode ставил, вот команда
powershell -ExecutionPolicy Bypass -c "pip install uv"
4 - Клонируем себе на комп этот репо (Это MCP сервер, на котором и будут обрабатываться большие файлы) 5 - Авторизуемся в Клоде и включаем там режим разработчика (слева вверху меню - Help - Enable Developer Mode) 6 - Открываем настройки (File - Settings - Developer - Edit Config) 7 - Открываем этот файл claude_desktop_config.json блокнотом или любым другим расширением для работы с файлами) 8 - Прописываем в нем такой код:
{
    "mcpServers": {
        "data_explore": {
            "command": "uv",
            "args": [
                "--directory",
                "C:\\Users\\<your-username>\\Documents\\mcp_servers\\mcp-server-data-exploration\\src\\mcp_server_ds",
                "run",
                "mcp-server-ds"
            ]
        }
    }
}
Вот тут - C:\\Users\\<your-username>\\Documents\\mcp_servers\\mcp-server-data-exploration\\src\\mcp_server_ds Нужно будет поменять путь к вашему серверу (тот который мы клонировали из Гитхаба. Обратите внимание - концовка там такая же как у меня (mcp-server-data-exploration\\src\\mcp_server_ds ), а вот начало, ваша папка И еще тонкость - двойные слеши, без них у меня не работает. После этого сохраняете файл и перезагружаете Клода, долен в диалоговом окне появится молоточек слева внизу, если его нет, попробуйте еще перезагрузить, у меня со второго раза сработало. С этой надстройкой Клод ест только CSV файлы (xls не взял), чтобы он смог прочитать файл с вашего компа, в диалоговом окне присылаете ему путь до файла (с именем файла и разрешением, пример - C:\\file.csv и запросом, что нужно с файлом сделать. Разрешаете ему копаться в вашем компе и все. Пользуйтесь, но есть ощущение что нужен платный Клод... Вот оригинал статьи, смотреть с ВПН -

Нейросети не страшны прогрессу, мы сами его остановим (но это не точно) В общем - возился я давеча с визуализацией в Google Data Studio, нужно было создать агрегированные данные по нескольким источникам, там и формулы и вычисляемые поля, короче все по харду. Сделал, все собрал, все гуд. На следующий день идем допиливать и случайно добавляю дополнительное поле в агрегированные данные (дату) и начинается жесточайший секс с Данныим и мозгом, что не так, где ошибка и почему данные такие кривые. Воевал часов 5 наверное, Чат ГПТ вообще меня уже собрался послать нахрен, я отчаялся и дошел до чата сторонников Google Data Studio, такой телеграмм аналог узкотематичного Stackoverflow. По поиску нашел пару чатов (русский и англоязычный) и изложил свой вопрос максимально подробно (форумное прошлое и неоднократноые рекомендации от специалистов идти поискать в Гугле то что я воспрошаю дают о себе знать) и отправил в русскоязычный сат. Ждем Секунда Бан, нахер... Идем к модератору - так мол и так, что нарушил, что не так? Минут 10 - вас забанили за ваш Ник (у вас там много эмодзи), хорошо что хоть вернули текст, который я составлял. Пробуем еще раз, уже с другого аккаунта, предварительно сообщив об этом модератору... Секунда - Бан. Ладно, понимаю что это какая то неведомая херота, иду к англичанам, перевожу на английский, запуливаю. Надо отдать должное, тут секунд пять сообщение висело, потом снова Бан... Проблему я в итоге нашел сам, через минут сорок еще, а сегодня мне написал модератор - вас за код в сообщении забанили))) Можете вернуться... Так и становятся интровертами, нахер не нужна ваша социализация с такими заскоками... Реально, уже нейросеть оказалась бессильна, идешь к кожаным за советом, и там тебя шлют нахер алгоритмы... Где то не там мы свернули судя по всему. На Stackoverflow не вернусь, не просите...

А была ли у кого-нибудь вот такая неведомая херня, как у меня на сайте (есть стойкое ощущение, что была)? Я довольно давно не
А была ли у кого-нибудь вот такая неведомая херня, как у меня на сайте (есть стойкое ощущение, что была)? Я довольно давно не погружался в классическое малостраничное SEO (сейчас больше по крупным многотысячным проектам, но черт дернул запустить свой небольшой буржуйский сайт. Со всякими приблудами в виде самописных плагинов написанных нейросетью, оптимизацией, добавлением кастомизированной карты на проект и тп штукам, которые радуют глаз старого SEOшника))) Но просчитался, как мне кажется в одном месте (тот самый мем тут не работает, я понимаю что просчитался и даже конкретное место предполагаю, но не уверен на 100% - купил нулевой домен((( Теперь собственно о проекте, нулевой домен, контент на 7 языках, в индексе из 300 страниц пока что попали 65 страниц, остальные повисли в Обнаружено непроиндексировано. Сайт периодически сканю лягушкой, вылезающие мелкие косяки правлю, так что ошибок в красной зоне там практически нет, контент в целом даже проверял через систему сжатия страницы и большинство страниц в пределах допустимых значений. То есть: Сайт молодой (запустился в начале января 2025) Домен молодой (хотя он с какой то историей, на нем в лохматых годах был какой то лендос, но ничего криминального) На сайте 7 языков Сайт регулярно наполняется, обновляется улучшается Из последнего - прикрутил карту на отдельную страницу, с использованием АПИ leaflet И в 25 января сделал переезд на новый хостинг (с ру на европейский) Что насторожило - пару дней назад лягушка обнаружила, что карта сайта (сгенерированная Yoast SEO) закрыта в ноиндекс, проверка через сторонние сервисы не подтвердил это, но лягушка упорно и упорно ставила карте ноиндекс (перебирал плагины, отключал их, проверял на смене темы ничего не решило проблему - упорно в ноиндексе), выключил генерацию карты сайта и подключил через другой плагин - проблема ушла, но вместе с этим косяком в Серч Консоли показы упали почти в ноль... Индекс еще не обновился, но есть подозрения, что просто страницы повылетали из индекса Или это сейчас норма? Че там по трендам в последнее время?

Этот пост для вас если: 1. Вам нужны заявки на свои услуги 2. Вы устали сливать деньги на нерабочие рекламные связки или полу
Этот пост для вас если: 1. Вам нужны заявки на свои услуги 2. Вы устали сливать деньги на нерабочие рекламные связки или получать клиентов только по сарафанке В этом канале я рассказываю как получать заявки из сео выдачи бесплатно, как за 1 день создать свой блог на 10 000 статей, как запустить рекламу в розовой сети и вытаскивать лиды по 30 центов (даже если вы из РФ.) Или как получать заявки с Авито по 70 копеек 🥳 Недавно выпустил в канале обзор на 25 работающих связок, которые дают оооочень дешевые заявки. (от 0 до 2$) Никаких курсов, марафонов, наставничества и т.п. Ваша задача просто выбрать понравившийся вариант, скопировать весь подход и применять для себя любимого. Заявки получаются от 0 до 1$ 😎 Первые связки можно посмотреть в закрепленном сообщении. А ещё там есть бот, который парсит вакансии и присылает их вам совершенно бесплатно (навсегда) Если задумывались над тем, что пора бы уже выстроить очередь из клиентов, то это тот самый знак от вселенной. https://t.me/+TsxaHF5cgucxMTNi #реклама ИНН: 360104857565 Erid: 3apb1QrvkfrvoEKS2LkBcXW8c8pgTfvLCDgmehjYNhxKw

Два раза за неделю прошёл до конца Чат GPT, его последнюю версию + предпоследняя версия, которая 1о-мини, уже предупредила, что запросов осталось немного... Но закончил плагин для сайта, который забирает данные по АПИ у Гугла и показывает их посетителям сайта. Там конечно не все так просто, как я описал, но в целом кастомизированное модальное окно для вывода доп информации, в том числе и из гугла. Это просто взрыв мозга, я бы в жизни это не реализовал без посторонней помощи. Но чего греха таить, опыт тоже дает о себе знать, все же код то я читать научился, но кодить даже и не пытался... Вот прям как батя суп ест, прихлебывает, временами отрывается от ложки, чтобы сказать: "Ух, бля" Вот примерно так и у меня было во время работы с плагином. Короче, давно я не погружался в тему сайтостроения так плотно. Начал с Рунета, и теперь вкатываемся в бурж, причем в несколько локалей!!! А че бы нет? Опыт, как говорится, не пропьешь и не такие проекты на 13 языков переводили...

Оказывается у владельцев тг каналов Партнерка появилась, спасибо за наводку https://t.me/lazywebmaster Какого только говна там нет, и непонятно что из всего этого скам, а что не скам. Полезного для аудитории канала на самом деле маловато, разве что вот прием смс, но я не тестил, чисто рандомно скопировал, показать. Короче, оно живое... Оно развивается и растет... https://t.me/NomerokBot?start=_tgr_CxpoZMkyMTIy