Перейти к содержимому
Zone of Games Forum
0wn3df1x

Вышло Ultimate Steam Enhancer 2.0 — расширение, добавляющее в Steam ссылки на русификаторы, русские магазины-дискаунтеры и прочие полезные для России функции

Рекомендованные сообщения

Очень крутая и удобная штука! Огромное спасибо. Жаль нельзя проверить еще доступность подарка, если в RU сегменте нет игры.
А так, очень информативное и удобное расширение. 

Поделиться сообщением


Ссылка на сообщение

Просто великолепно, низкий поклон за труд!

  • +1 1

Поделиться сообщением


Ссылка на сообщение
6 часов назад, UnfoRGiveN сказал:

Очень крутая и удобная штука! Огромное спасибо. Жаль нельзя проверить еще доступность подарка, если в RU сегменте нет игры.
А так, очень информативное и удобное расширение. 

На предыдущей странице писал, почему в данный момент это нельзя реализовать.

 

Поделиться сообщением


Ссылка на сообщение

@0wn3df1x Добрый день.
Расширение отличное, да вот незадача. Скрипт установлен через adguard. Сейчас в любом браузере крашится на попытке вывести правые блоки с инфой. Предыдущая версия работала отлично и в браузере и в steam.
Планируете ли поддержку adguard в новой версии?
1.png 2.png 3.png 4.png


UPD: В общем закостылил себе исправление, Добавил первой строкой
          var unsafeWindow = typeof unsafeWindow === 'undefined' ? window: unsafeWindow;

Изменено пользователем blazer404

Поделиться сообщением


Ссылка на сообщение
11 минут назад, 0wn3df1x сказал:

На предыдущей странице писал, почему в данный момент это нельзя реализовать.

 

Ага, как раз и писал, что жалко нельзя проверить. Но всё равно, безумно крутой функционал!

Поделиться сообщением


Ссылка на сообщение
27 минут назад, blazer404 сказал:

Скрипт установлен через adguard. Сейчас в любом браузере крашится на попытке вывести правые блоки с инфой. 
1.png 2.png 3.png 4.png

Корень проблемы заключается в различиях между средами выполнения пользовательских скриптов в Tampermonkey (и аналогичных расширениях) и в AdGuard. В вашем логе ошибок ключевой момент - ReferenceError: unsafeWindow is not defined.

Объект unsafeWindow - это специфический API, предоставляемый большинством специализированных менеджеров пользовательских скриптов. Он дает скрипту привилегированный доступ к глобальному объекту window страницы и его переменным. Это необходимо для корректного взаимодействия с функциями и данными, которые использует сам Steam.

Судя по всему, среда выполнения скриптов в AdGuard не предоставляет этот специфический объект unsafeWindow, что и приводит к ошибке. Поскольку скрипт разрабатывался и тестировался в окружении Tampermonkey, где этот API гарантированно есть, возникает данная ошибка совместимости.


1 час назад, blazer404 сказал:

Предыдущая версия работала отлично и в браузере и в steam.

В предыдущих версиях скрипта (например, 1.9.5) большинство модулей работало через прямые API-запросы к серверам Steam (с помощью GM_xmlhttpRequest). Для этого не требовался доступ к контексту самой веб-страницы, и стандартного объекта window было достаточно.

В процессе разработки версии 2.0.0 были добавлены новые, более сложные функции, в частности “Помощник подарков в списке желаемого” (wishlistGiftHelper). Его задача - работать с уже загруженным на странице списком игр. Steam помещает эти данные в глобальную JavaScript-переменную g_rgWishlistData, которая является свойством объекта window самой страницы.

Здесь и возникает ключевая техническая проблема: из-за политики безопасности браузеров пользовательские скрипты выполняются в изолированной среде (песочнице). Простое обращение к window из скрипта дает доступ к window этой песочницы, а не страницы. Поэтому window.g_rgWishlistData возвращало undefined.

Решением этой проблемы стало unsafeWindow. После чего я решил стандартизировать его использование во всех частях скрипта.

52 минуты назад, blazer404 сказал:

UPD: В общем закостылил себе исправление, Добавил первой строкой
          var unsafeWindow = typeof unsafeWindow === 'undefined' ? window: unsafeWindow;

В теории этот полифил должен сработать для части модулей. Он проверяет наличие unsafeWindow и, если его нет, создает локальную переменную с таким же именем, присваивая ей стандартный объект window.

Но есть нюанс. Простое приравнивание unsafeWindow к window не всегда является полноценной заменой. Как уже упоминалось, некоторые модули, типа “Доступность подарков (список желаемого)”, зависят от unsafeWindow для доступа к данным, которые Steam загружает динамически (к глобальному массиву с играми g_rgWishlistData). Из-за изоляции контекстов скриптов, стандартный window может не дать доступа к этим данным. В связи с этим, у меня есть вопрос: После использования того костыля, корректно ли работает функционал помощника подарков на странице списка желаемого? Загружаются ли игры после нажатия “Собрать данные”?

Поделиться сообщением


Ссылка на сообщение

@0wn3df1x Протестировал, что работает/не работает

Скрытый текст

Для страницы игры

Время прохождения (HLTB) — ok

Русификаторы (ZOG) — ok

Время друзей / Глобальные достижения — частично (не работает время друзей — всегда не играли)

Индикатор раннего доступа — ok  

Анализатор цен — ok

Поиск цен Plati.Market  ok

Агрегатор цен (%) — ok

Доступность подарков (страница игры) — ok


Для каталога

Доп. инфо / Фильтры — ok

Скрытие игр — ok

 

Для ленты активности

Доп. инфо в ленте активности — ok

Рулетка Stelicas — вроде ok (открывается, csv не проверял)

 

Для торговой площадки

Продажи предмета — ok

 

Для списка желаемого / Новостей

Наблюдатель (Желаемое/Библиотека) — не работает (отображается, но всегда пусто)

Доступность подарков (список желаемого) — не работает

  • лупа есть
  • Ошибка при сборе данных: Не удалось извлечь AppID …
  • в консоли Minified React error #418, но это как я понимаю ошибка стима

Фильтр новостей — ok

 

Дополнительные настройки

Авто-раскрытие HLTB — ok

Показ инфо об англ. Языке — ok

Авто-загрузка доп. Обзоров — ok

Немного обманул в прошлом сообщении, что прямо все работало в прошлой версии. По сути то, что не работает сейчас, не работало и в прошлой, только добавились краши.

Изменено пользователем blazer404

Поделиться сообщением


Ссылка на сообщение
1 час назад, blazer404 сказал:

@0wn3df1x Протестировал, что работает/не работает

Немного обманул в прошлом сообщении, что прямо все работало в прошлой версии. По сути то, что не работает сейчас, не работало и в прошлой, только добавились краши.

Да, как я и предполагал, за исключением дополнения в виде наблюдателя времени друзей.

Экосистема менеджеров (Tampermonkey, Greasemonkey, Violentmonkey и др.), а также сред выполнения скриптов, встроенных в другие расширения (как в AdGuard), довольно разнообразна. Да, все они служат одной цели, но их внутренние реализации могут существенно отличаться. В основе их работы лежит концепция песочницы - изолированной среды, которая создается из соображений безопасности, чтобы пользовательский скрипт не мог бесконтрольно хозяйничать на странице, например, похищая личные данные. Но строгость этой песочницы и набор инструментов, которые предоставляются скрипту для общения с внешним миром, сильно варьируются. Хотя все они стремятся следовать общему стандарту Greasemonkey API, их реализации отличаются. Tampermonkey, на сегодняшний день, является наиболее функционально полным и стабильным менеджером, который реализует даже самые специфические, но ставшие стандартом де-факто в сообществе, возможности API, такие как unsafeWindow и гибкое управление кросс-доменными запросами.

Другие менеджеры зачастую являются форками (ответвлениями) более старых версий или независимыми разработками, которые догоняют “золотой стандарт” по функциональности с разной скоростью. Иногда это приводит к тому, что в них отсутствуют определённые функции.

Например, некоторое время назад была проблема с работой другого моего скрипта в OrangeMonkey (который использовал наш главадмин SerGEAnt). Она была связана с тем, как расширение обрабатывало разрешения на кросс-доменные запросы и взаимодействие с веб-редактором CKEDITOR, который используется на многих форумах на движке Invasion Board. Скрипту требовался доступ к API редактора, но OrangeMonkey не предоставлял необходимого моста для выхода из “песочницы”, что приводило к ошибке. В то же время в Tampermonkey этой проблемы уже не было, так как его разработчики реализовали более продвинутые механизмы взаимодействия с контекстом страницы. Это классический пример рассинхронизации в разработке, где одно расширение уже адаптировалось под новые веб-технологии, а другое - ещё нет.

AdGuard, конечно, довольно мощнейший инструмент для блокировки контента и защита приватности, но выполнение пользовательских скриптов является его вторичной, хоть и очень полезной, функцией. Поэтому вполне объяснимо, что его песочница может быть более строгой, а среда выполнения не предоставляет некоторые узкоспециализированные, но критически важные для сложных скриптов API, такие как unsafeWindow. Это не столько недостаток, сколько фундаментальное различие в философии разработки: приоритет отдается максимальной безопасности, иногда в ущерб расширенной функциональности пользовательских скриптов.


Теперь давайте пройдёмся по результатам.

1 час назад, blazer404 сказал:

Доступность подарков (список желаемого) — не работает

  • лупа есть
  • Ошибка при сборе данных: Не удалось извлечь AppID …
  • в консоли Minified React error #418, но это как я понимаю ошибка стима

Это как раз то, о чём я писал в предыдущем сообщении. Во время разработки скрипт все еще мог получить список игр из window, но где-то с полторы недели назад Valve немного изменила свой фронтенд. Они всё активнее используют современные фреймворки, которые строят страницу динамически, а данные хранят внутри своей инкапсулированной экосистемы (состояние компонентов). Раньше переменные могли просто объявляться в глобальной области видимости, теперь же они "живут" внутри фреймворка, и доступ к ним снаружи затруднен. В какой-то момент массив с ID игр из списка желаемого (g_rgWishlistData), который раньше был легко доступен, стал инициализироваться таким образом, что его можно прочитать только через прямой доступ к JavaScript-контексту самой страницы.

Именно для этого понадобился unsafeWindow. Он как ключ, который позволяет скрипту, работающему в изолированной песочнице, дотянуться до переменных на основной странице. Костыль (var unsafeWindow = window;) - это хороший фикс для предотвращения падения скрипта от ReferenceError, но он лишь создаёт псевдоним для window песочницы, в которой g_rgWishlistData по-прежнему не существует. AdGuard не предоставляет этот ключ, поэтому скрипт не может найти ID и сообщает об ошибке.

1 час назад, blazer404 сказал:

Время друзей / Глобальные достижения — частично (не работает время друзей — всегда не играли)

Доступность подарков (список желаемого) — не работает

Здесь причина схожа, но связана не столько с доступом к переменным, сколько с изоляцией сессии аутентификации. Ваше тестирование подтверждает, что среда AdGuard, скорее всего, выполняет скрипты в настолько изолированном контексте, что они не имеют полного доступа к вашей браузерной сессии на сайтах Steam.

Для работы этих модулей необходима авторизация. Её отсутствие или изоляция приводят к неработоспособности:

  • Наблюдатель: Его основная задача - отслеживать изменения в вашем списке желаемого и библиотеке. Для этого скрипт обращается к эндпоинту Steam /dynamicstore/userdata/:
    https://store.steampowered.com/dynamicstore/userdata/
    Когда вы авторизованы, сервер Steam отдает специальный JSON-файл, содержащий ID ваших игр из rgWishlist, rgOwnedApps и т.д. (в этом JSON также содержатся ваши настройки персонализации магазина, но нет и не может быть логина, хэша пароля, платёжной информации или токенов аутентификации). Скрипт использует эти ID, чтобы затем сделать отдельные, публичные запросы к API Steam и получить информацию по каждой конкретной игре. Когда скрипт через GM_xmlhttpRequest делает запрос к /userdata/, этот запрос должен содержать ваши аутентификационные данные. Если среда выполнения (AdGuard) не передает их, для сервера Steam этот запрос выглядит как анонимный, и он возвращает пустой ответ. Таким образом, у модуля просто нет исходных данных для работы - он не знает, за какими играми ему нужно следить, и его панель остается пустой.
  • Время друзей: Механизм абсолютно такой же. Чтобы показать, сколько времени ваши друзья провели в игре, скрипт должен сначала узнать, кто ваши друзья. Эта информация находится на персонализированной странице сообщества Steam (friendsthatplay), например:
    https://steamcommunity.com/my/friendsthatplay/1245620
    она генерируется сервером динамически, специально для вашего аккаунта. Для анонимного пользователя или для скрипта, работающего в изолированной сессии без доступа к актуальным данным, такой страницы не существует - Steam просто не вернет нужные данные. Соответственно, без доступа к этой странице скрипт не может извлечь имена друзей и их наигранные часы и делает логичный вывод - “друзья не играли”.
  • Фильтр “Только ваши DLC”: Этот фильтр в каталоге поиска полностью зависит от вашей личной библиотеки. Его механизм прост: при отображении каждого товара скрипт проверяет, является ли он дополнением (DLC). Если да, он определяет ID основной игры (parent_appid) и ищет его в вашем списке rgOwnedApps, полученном из того же /userdata/. Если вы не авторизованы или сессия недоступна, список rgOwnedApps пуст, и фильтр просто не сможет найти ни одного подходящего DLC.
  • Помощники подарков (Gift Helpers): И на странице игры, и в списке желаемого, для корректной работы им необходима точка отсчета - цена и валюта в вашем регионе. Эту информацию Steam предоставляет пользователю через переменные g_strCountryCode и g_rgWalletInfo. Без них скрипт не может запросить локальную цену и выполнить правильную конвертацию для сравнения с ценой друга. Тем не менее, как вы и заметили, помощник на странице игры у вас сработал. Это связано с наличием в этом модуле специального костыля: если скрипт не может определить данные текущего пользователя, он по умолчанию использует данные для российского региона в качестве базовых. Это позволяет функции работать, но сравнение цен может быть неточным, если вы на самом деле находитесь в другом регионе. Для помощника в списке желаемого этот костыль уже не помогает, так как тот модуль при попытке получить ID игр со страницы.

Вот как-то так.

Изменено пользователем 0wn3df1x

Поделиться сообщением


Ссылка на сообщение
13 минут назад, 0wn3df1x сказал:

Вот как-то так.

Спасибо за развернутый ответ. Поживу тогда с костылем. Того, что работает мне с головой хватает
В любом случае благодарю за вашу работу. Скрипт шикарный. )

Поделиться сообщением


Ссылка на сообщение

Все-таки решил поковырять скрипт. В документации API AG указано, что они поддерживают методы GM.

Скрытый текст

 

https://adguard.com/kb/ru/general/extensions/#поддерживаемые-функции-gm

  • GM.info, GM_info
  • GM.setValue, GM_setValue
  • GM.getValue, GM_getValue
  • GM.listValues, GM_listValues
  • GM.deleteValue, GM_deleteValue
  • GM.getResourceUrl, GM_getResourceURL
  • GM.setClipboard, GM_setClipboard
  • GM.xmlHttpRequest, GM_xmlhttpRequest
  • GM.openInTab, GM_openInTab
  • GM.notification
  • unsafeWindow
  • GM_getResourceText
  • GM_addStyle
  • GM_log
  • GM.addElement, GM_addElement

 

 

 Добавил разрешение
// @grant        unsafeWindow

Скрытый текст

fix.png 

 

Что произошло

  • Проблема с крашами прекратилась (присвоение window к unsafeWindow более не нужно)
  • Полностью заработал сбор данных в вишлисте
Скрытый текст

wishlist-data.png

  • не работают «Наблюдатель» и «Время друзей», но тут уже без проброса авторизации ничего не сделать

Поделиться сообщением


Ссылка на сообщение
В 19.06.2025 в 21:49, 0wn3df1x сказал:

В конце адресной строки пишется /?cc=us

Можете пожалуйста добавить в ваше расширение этот скрипт, чтобы больше никогда не видеть "Ой, извините", т.к. даже переадресация на Центр сообщества намного лучше, чем это бесполезное "Ой, извините".

P.S. Возможно ли во всём расширении или хотя бы только в Агрегаторе цен сделать конвертацию рублей в CIS - U.S. Dollar, как это сделано в расширении SteamDB или на сайте hot.game. Просто в СНГ регионе намного удобнее видеть все цены в долларах, чем в рублях.

Поделиться сообщением


Ссылка на сообщение
4 часа назад, 1052 сказал:

Можете пожалуйста добавить в ваше расширение этот скрипт, чтобы больше никогда не видеть "Ой, извините", т.к. даже переадресация на Центр сообщества намного лучше, чем это бесполезное "Ой, извините".

У меня есть идея получше. Вернусь с ней позже.

Поделиться сообщением


Ссылка на сообщение

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Похожие публикации

    • Автор: SerGEAnt

      @0wn3df1x продолжает следить за Steam-играми, в которых появилась русская локализация.
      @0wn3df1x продолжает следить за Steam-играми, в которых появилась русская локализация.
      Список за последние четыре недели:
      Mosa Lina — забавный паззл-платформер с проработанной «физикой». Вышел 17 октября 2023 года, 1622 обзора, 95% положительные.
      Stolen Realm — достаточно популярная партийная изометрическая RPG с простой графикой. Вышла 8 марта 2024 года, 3266 обзоров, 85% положительные.
      Beastieball — пошаговый звериный волейбол. В раннем доступе с 12 ноября 2024 года, 1225 обзоров, 99% положительные.
      Rooftops & Alleys: The Parkour Game — зрелищный симулятор паркура. Покинул ранний доступ 16 июня, 5610 обзоров, 96% положительные.
      MegaFactory Titan — стратегия про развитие фабрики на спутнике Сатурна. В раннем доступе с 23 февраля 2022 года, 124 обзора, 79% положительные.
      The Last Starship — стратегия про управлением звездолетом. В раннем доступе с 15 февраля 2023 года, 598 обзоров, 80% положительные.
      Battle Talent — VR-экшен про битвы на мечах от первого лица.Вышла 1 июня 2023 года, 964 обзора, 76% положительные.
      Herald of Havoc — шутер, отдающий дань первым частям Quake. Вышел 25 июня 2023 года, 212 обзоров, 97% положительные.
      Croakoloco — idle-игра про сбор лягушек. Вышла 6 мая 2024 года, 439 обзоров, 93% положительные.
      Dusk City — хентайная метроидвания. Вышла 25 июля 2024 года, 195 обзоров, 94% положительные.
      Broken Sword: Shadow of the Templars: Reforged — очередное переиздание культового квеста. Вышло 19 сентября 2024 года, 799 обзоров, 97% положительные.
      Heretical — изометрический фэнтезийный рогалик. В раннем доступе с 30 октября 2024 года, 457 обзоров, 94% положительные.
      Gridroad — головоломка про обустройство дорожных развязок. Вышла 10 декабря 2024 года, 330 обзоров, 83% положительные.
      AI2U: With You 'Til The End — адвенчура, в которой вас запирают в квартире с красивыми ИИ-помощницами. Вышла 24 января 2025 года, 628 обзоров, 91% положительные.
      Rocket delivery: Space Wok — бесплатный run & gun. Вышел 24 марта, 134 обзора, 97% положительные.
      Trilogy of the Moon — корейский клон «Рандеву с Незнакомкой». Вышел 10 апреля 2025 года, 148 обзоров, 89% положительные.
      Ninja Ming — хардкорный платформер. Вышел 11 апреля, 103 обзора, 97% положительные.
      Outworld Station — симулятор развития космических станций.В раннем доступе с 22 апреля, 303 обзора, 88% положительные.
    • Автор: SerGEAnt

      Игра вышла сегодня и столкнулась с валом отрицательных отзывов в Steam. Да и пресса оценила свежий проект Remedy так себе.
      Забавная ситуация приключилась с шутером FBC: Firebreak.
      Игра вышла сегодня и столкнулась с валом отрицательных отзывов в Steam. Да и пресса оценила свежий проект Remedy так себе.

      Онлайн у игры соответствующий — 2000 человек в Steam, для мультиплеерной игры результат печальный.

      Самое смешное, что игра вышла в том числе в России, но ее сетевая инфраструктура работает на серверах Amazon, которые наш Роскомнадзор очень любит, кхм, «ограничивать в работе». Все это привело к тому, что и без того плохие отзывы стали еще хуже: российские игроки постарались от души.

      Как итог, игру сняли с продажи в России спустя несколько часов после релиза.



Zone of Games © 2003–2025 | Реклама на сайте.

×