Перейти к содержимому
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

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

    • Автор: 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 | Реклама на сайте.

×