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

0wn3df1x

Технобоги
  • Публикации

    5 579
  • Зарегистрирован

  • Посещение

  • Дней в лидерах

    51

Все публикации пользователя 0wn3df1x

  1. Сделал отдельный скрипт. В Ultimate Steam Enhancer встраивать не буду, так как этот скрипт работает вообще на всех сайтах (@match *://*/*), что является излишним для U.S.E. С российского айпи не получается воспроизвести. С американского айпи тоже. Со среднеазиатского воспроизводится на Gamersbase, т.е. при айпи той же Средней Азии он присылает долларовую цену вместо рублёвой. Скрипт изначально ожидает, что цены, получаемые из сторонних магазинов указаны в рублях (RUB). Когда пользователь переключает режим отображения в доллары (USD), скрипт берет числовое значение цены (которое он считает рублями) и конвертирует его в доллары. Это приводит к результатам, как на скриншоте. Я подшаманю GamersBase и SteamPay, чтобы они могли работать с долларовым приходом. Всё остальное по мере выявления. Каждый магазин - это отдельный модуль. Поэтому к каждому нужен свой подход, если с ним случается ошибка.
  2. Релиз Little Nightmares 3 состоится 10 октября

    Bandai Namco и этим всё сказано. Более отбитого и оторванного от реальности издателя в плане региональных цен нужно ещё поискать, хотя это, в принципе, общая хворь большинства японских компаний - им плевать на региональные цены, рекомендации Valve и общемировые нормы. Видимо, многовековая изоляция на острове даёт о себе знать - они до сих пор не в курсе, что за его пределами существует мир с другими экономическими реалиями. Little Nightmares 3 - просто очередной пример этого дебилизма. Рекомендованная Valve цена для России, обновлённая после всех кризисов, падения рубля и санкционных катков, - 1300 рублей. Что мы видим тут? 2849 рублей. Наценка в 119%. Самое смешное, что с таким прайсом Россия улетает на 23-е место по дороговизне. Игра ДЕШЕВЛЕ в Австралии, Катаре, Саудовской Аравии, ОАЭ и даже в самой Японии. Как это объяснить? Может, им там голову напекло, или коллективный разум поражён радиацией после американских бомб из сороковых? Но не стоит думать, что это какая-то вендетта за Курилы. Эти уникумы умудрились нагадить по всему миру. В Казахстане ценник ещё выше. А венец этого маразма - цена для Южной Азии. Этот регион среднестатистически соперничает с Россией за звание самого выгодного региона в мире, а тут ему выставили цену выше, чем в США. Какие ещё нужны доказательства, что в головах отдела, отвечающего за региональные цены в Bandai Namco, плещется вода из Фукусимы? Хотя есть ли этот отдел вообще? Или на его месте стоит какой-то поехавший генератор случайных чисел? Вообще, иногда складывается впечатление, что японские издатели устанавливают региональные цены по результатам землетрясения.
  3. Distraint 1-2

    DISTRAINT Жанр: Adventure, Horror Платформы: PC Разработчик: Jesse Makkonen Издатель: Jesse Makkonen Дата выхода: 21 октября 2015 Прогресс перевода: Готов.
  4. Хуже. Я руками пишу код, который эти списки и украшательства генерирует. У меня там целый конвейер собран. Сначала может идти какая-нибудь тяжелая аналитика на Python, где с помощью разных библиотек перевариваются массивы данных. На выходе получается огромный html отчет со сводными таблицами и статистикой. Потом в дело вступает юзерскрипт на JavaScript, который работает как плагин для этого конкретного форума. Он добавляет в интерфейс форума кнопку для загрузки внешнего файла. После загрузки тот html файл преобразует сделанный отчёт в форумный формат. Так что да, всё руками, но не в том смысле. Вместо того чтобы один раз руками оформить пост, я руками пишу (и потом постоянно допиливаю) код, который делает это за меня. Это способ лениться эффективно.
  5. Всего шестеро. У меня это со времён, когда ещё ЖЖ был популярен.
  6. Справа в агрегаторе цен есть пользовательский список исключений: Помимо добавления по слову через +, есть функция импорт и экспорта списка исключений (стрелочка ниже). В описании функционала я оставил список рекомендуемых исключений (можно импортировать). онлайн,оффлайн,dlc,аккаунт,ps4,xbox,digi361,ibloodrue,mangarded,siparisapp,multimarket,trustytop,cyber steam shop,boostgame,cloud-gaming.store,promarket88,offline,-seyter-,paul fox,sirdjinn,аренда,4ilgames,keks12,damhubmarket,nt-store,ps5,@mediasoft,dofamine game,hactier,alz0n,top-games,solo29,nerd shop,1gamestore,tobeclosertoyou Пользователь может вносить отдельные слова или названия продавцов — они будут отфильтрованы. В рекомендуемых исключениях уже внесена часть продавцов, которые занимаются продажей аккаунтов.
  7. Ultimate Steam Enhancer обновился до версии 2.1.1 — это обновление сфокусировано на добавлении новых опций для кастомизации и улучшении существующих модулей на основе отзывов.
  8. Deep Sleep Trilogy

    Все темы, которые я создаю и в которых стоит “Перевод в процессе” создаются в связи с наличием русификатора в интернете и отсутствием в базе у нас. Создание темы означает, что сведения о русификаторе были отправлены главному администратору для изучения.
  9. In Stars And Time

    In Stars And Time Жанр: RPG Платформы: PC Разработчик: insertdisc5 Издатель: Armor Games Studios Дата выхода: 20 ноября 2023 Движок: RPG Maker У игры 3532 отзыва, 97% из которых положительные. Игра занимает 36-е место среди самых популярных игр 2023-го года без русского языка.
  10. Steam

    В четверг начнётся очередная летняя распродажа. Я в очередной раз буду напоминать про моё второе расширение. Правда оно сейчас стало ещё лучше для распродаж, особенно если пользователь из российского региона.
  11. Steam

    Без понятия, т.к. это связано не с клиентом, а с разработкой.
  12. Конечно, можно пробовать экстраполировать логику личного брокерского счета на всю национальную экономику, но есть большой нюанс. Государственная пенсионная система - это не совокупность индивидуальных вкладов. Ее задача (по крайней мере у нашего государства) - предоставить страховое покрытие всем, включая тех, кто не мог или не хотел копить: домохозяек и безработных (даже включая тунеядцев) людей с низкой зарплатой и тех, кто всю жизнь работал в чёрную, инвалидов, тех, кто совершил финансовые ошибки или просто оказался в трудной жизненной ситуации. Это механизм снижения общенационального риска смертности от нищеты в старости, а не инструмент для приумножения капитала каждого. Нельзя построить систему социального страхования для 140 миллионов человек по правилам личного инвестиционного портфеля. Они и думают. И приходят к выводу, что в рамках текущей демографической и экономической структуры единственными способами сбалансировать солидарную систему являются: а) Резкое повышение налогов/взносов (что ударит по экономике и по работодателю, а с ним и по работнику). б) Снижение реального размера пенсий (что ударит по родителям и дедам). в) Повышение пенсионного возраста. Правительство выбрало третий, наиболее политически болезненный для него, но структурно неизбежный путь. Советская экономика была командной, а не рыночной. Бесплатное жилье, медицина и образование финансировались не эффективностью, а директивным распределением ресурсов, в первую очередь от экспорта сырья. Эта модель была невоспроизводима в рыночных условиях и рухнула под собственным весом. Нельзя применять методы плановой экономики к капиталистической, это разные операционные системы. Сегодняшний демографический кризис - это глобальная проблема развитых стран, а не уникальная российская особенность. Это можно обернуть в вопрос: “Где гарантии, что это не повторится?”. Ответ заключается в эволюции институтов. Именно после катастроф, последовавших за перестройкой, в России были созданы современные механизмы защиты: Агентство по страхованию вкладов (АСВ): страхует банковские депозиты (до 1,4 млн руб.) и, что важно, сбережения в НПФ и на ИИС (до 2,8 млн руб.). Жесткое регулирование со стороны Центробанка: сегодняшние требования к банкам и НПФ несравнимо строже, чем 30 лет назад. Риск никогда не равен нулю, но ситуация не идентична 90-м, поскольку после 90-х и из-за 90-х была создана целая архитектура финансовой безопасности, которой тогда просто не существовало. Идея о том, что можно решить проблему дефицита СФР (напомню, его покрытие требует более 4 трлн рублей ежегодно), просто потряс» олигархов или урезав зарплаты чиновникам - это популярный, но, к сожалению, популистский миф, поскольку несопоставимы. Да, профицит бюджета до СВО был, но он направлялся в суверенный фонд (ФНБ) - ту самую кубышку на черный день, которая сейчас и позволяет экономике функционировать в условиях беспрецедентного санкционного давления. Что до “Великой депрессии”: Рузвельт преодолел кризис не тем, что “отобрал деньги у капиталистов”, а путем гигантских государственных расходов и программ (Новый курс), которые создали рабочие места, инфраструктуру и спрос в экономике. То есть, государство не отбирало, а наоборот, активно вливало деньги в систему. В общем, претензии понятны, но политические претензии и экономические законы - это две стороны разных медалей. Ваше видение мира предполагает существование идеального, справедливого и всемогущего государства, которое решает все проблемы граждан, не требуя от них ничего взамен. А реальность состоит из компромиссов и системных ограничений. В этой реальности у гражданина есть выбор: Обидеться и требовать от несовершенного государства невозможного, и в итоге остаться с минимальной социальной пенсией. Признать, что государственная пенсия - это лишь базовый уровень защиты от нищеты, и начать самостоятельно формировать свой капитал, используя те инструменты (ИИС, ПДС), которые то же самое государство предлагает, пытаясь переложить часть ответственности на плечи граждан. Вопрос не в том, является ли государство хорошим или плохим. Вопрос в том, какую личную стратегию человек выбирает для обеспечения собственного будущего в тех условиях, которые существуют на самом деле. P.S. Касательно “Нового курса” Рузвельта. Эта тема мне близка со времён университета, люблю её постоянно рассказывать (как старый дед).
  13. Steam

    Значит хитроумные хакеры никогда к аккаунту не пробивались. Метод с API один из самых тонких. Именно из-за его реализации (в прошлом) в Steam была добавлена необходимость подтверждать создание ключа через Guard.
  14. В коде скрипта, почти в самом начале, через ctrl+f найдите: statusElement.textContent = 'Шаг 2/3: Проверка страницы...'; const gamePageUrl = `https://store.steampowered.com/app/${appId}/?cc=us&l=russian`; Там замените cc=us на cc=az или любой другой желаемый регион. Настройку добавлю в следующей версии. Не понял вопрос. Добавить возможность отобразить главную или любую страницу магазина в режиме инкогнито по кнопке? Возможность открывать любую страницу по кнопке добавлю в следующей версии, но там будет нюанс: Главная страница откроется, страница какого-нибудь жанра типа рогалик тоже, страница активности пользователя — нет (но оно понятно, инкогнито же), страница поиска по каталогу не будет работать полноценно, потому что в стандартном режиме там включена автоматическая прокрутка на следующие странице. При автоматической прокрутке, как и в других динамических элементах, используются оригинальные данные аккаунта. Т.е. если после перезагрузки первый набор игр будет в долларах, то при скролле — загрузятся данные для аккаунта и они будут в рублях, с ограничениями и прочим. Заставить их работать в этом режиме технически невозможно из-за того, как устроен сам процесс обхода и как работают браузерные расширения. Когда мы заходим на заблокированную страницу, браузер сначала загружает ее как обычно. В этот момент расширения SteamDB и Augmented Steam видят знакомый адрес, срабатывают и добавляют на страницу свои элементы. Затем в дело вступает Ultimate Steam Enhancer. Он определяет, что страница заблокирована, и выполняет свой трюк: получает код незаблокированной страницы и полностью заменяет им содержимое текущей вкладки. В этот момент происходит ключевое событие: вся первоначальная страница (включая все элементы, добавленные SteamDB и Augmented Steam) безвозвратно уничтожается. Для браузера мы не перешли на новую страницу - адрес в строке остался прежним. Поэтому у расширений нет сигнала и триггера, чтобы запуститься повторно. Они уже отработали один раз при первоначальной загрузке и не знают, что содержимое страницы было полностью подменено скриптом. Это ограничение является важной частью системы безопасности браузера. Если бы один скрипт мог заставить другое, совершенно независимое расширение, выполнять свой код - это открыло бы путь для вредоносных действий. Поэтому все расширения и скрипты работают в своих изолированных “песочницах” и не могут командовать друг другом. Таким образом, “виртуальный режим инкогнито” - это эффективный, но радикальный метод, который создает новую, чистую страницу, на которой могут работать только функции самого Ultimate Steam Enhancer, запущенные уже после подмены контента. Это является неизбежным компромиссом для обхода ограничений таким способом.. Не понимаю, о чём речь. Если и видел такое, то не помню, где именно. Возможно. В качестве временного решения можно использовать пипетку какого-нибудь Ublock, чтобы избавиться от надоедливого элемента.
  15. Steam

    SMS - это доказательство того, что одна из линий обороны аккаунта в виде привязки к телефону отработала штатно. Злоумышленник, зная логин или привязанный телефон, зашел на страницу восстановления Steam и нажал “Я не помню пароль”. Система Steam, как и положено, отправила код подтверждения на единственный известный ей и доверенный канал связи - телефон. На этом для атакующего все и закончилось, потому что кода у него нет. Наиболее вероятный сценарий - это автоматизированная атака, известная как credential stuffing (атака с подстановкой учетных данных). Т.е. у злоумышленников есть логин или телефон. Смысл этой автоматизированной атаки в том, чтобы провести массовую разведку боем и найти слабые звенья в огромном списке. Цели на этом этапе очень просты: Бот выясняет: а существует ли вообще такой аккаунт в Steam? Если система инициирует отправку SMS, значит, логин или телефон верный и аккаунт активен. Аккаунт теперь в их базе помечен как живой и ценный для будущих атак. Бот не пытается обойти SMS-защиту. Он ищет тех, у кого ее нет. Из миллиона проверенных аккаунтов найдутся тысячи, где: Телефон не привязан, а привязана только старая, давно взломанная почта. Пароль от почты совпадает с утекшим паролем от какого-нибудь форума. Вообще не включена двухфакторная аутентификация. Создание фундамента для фишинга. Иногда эта атака - первый шаг. Человек получает SMS, начинает волноваться. А через час ему на почту приходит поддельное письмо “от поддержки Steam” с темой “Замечена подозрительная активность, срочно защитите аккаунт!”. В панике человек может щелкнуть на фишинговую ссылку и сам отдаст все данные. Проще говоря, злоумышленники действуют как рыболов с огромной сетью. Они не охотятся за конкретной рыбой, а просто закидывают сеть и смотрят, кто в нее попадется. Но вообще, инструкции по гигиене известны: Сложный пароль. На разных аккаунтах — разный. Сложнее всего должна быть защита на электронной почте. Должен быть включен Steam Guard. Могу добавить ещё: Всегда стоит проверить Api-ключ Steam. Это важный и неочевидный шаг, о котором многие не знают. Продвинутые мошенники, получив кратковременный доступ к аккаунту, могут сгенерировать специальный ключ разработчика (Web API Key). Этот ключ позволяет им манипулировать обменами, даже не заходя в аккаунт. Они могут отменять реальные трейды и мгновенно подсовывать поддельные с аккаунта-клона. Проверяется тут: https://steamcommunity.com/dev/apikey Если человек не разработчик и не пользуется сервисами, которые требуют API ключ, то поле ключа должно быть у него пустым. Если там что-то есть - нужно немедленно нажать кнопку “Отозвать мой ключ Steam Web API”. Ибо эта скрытая угроза не исчезает после смены пароля.
  16. Расчеты были бы верны для частного пенсионного фонда или личного брокерского счета, но они не имеют ничего общего с государственным пенсионным обеспечением. Фундаментальная ошибка заключается в предположении, что уплачиваемые работодателем взносы - это деньги, которые откладываются на персональный счет работника, где они накапливаются и инвестируются. Это не так. Принцип солидарной системы заключается в “договоре поколений”: работающее сегодня поколение своими взносами финансирует выплаты текущим пенсионерам. Деньги, перечисленные бухгалтером в Социальный фонд России (СФР) в этом месяце, немедленно идут на выплату пенсий родителям, бабушкам и дедушкам, а не ложатся в сейф с нашим именем, чтобы ждать нас 30 лет. Никакого “тела вклада”, на которое могли бы начисляться проценты, в этой системе для индивида не существует. Следовательно, вся математическая модель, приводящая к накоплению 6 миллионов рублей, рушится, поскольку она описывает не ту систему. Он считает доходность на капитал, которого нет. Государственная система - это не инвестиционный фонд, а механизм социального страхования, работающий по принципу “из кассы на выплаты”. На эту систему влияют несколько ключевых экономических факторов. Во-первых, демография. Эффективность солидарной системы напрямую зависит от соотношения числа работающих к числу пенсионеров. Это коэффициент демографической нагрузки. В России, как и в большинстве развитых стран, этот коэффициент неуклонно растет: рождаемость снизилась, а продолжительность жизни увеличилась. Это означает, что на каждого пенсионера приходится все меньше работающих граждан. Если в прошлом веке условные 5-7 работников обеспечивали одного пенсионера, то сейчас это соотношение приближается к двум к одному, а в перспективе может стать еще хуже. Именно это стало причиной повышения пенсионного возраста - в противном случае для сохранения баланса системы пришлось бы либо резко повышать налоги, либо снижать реальный размер пенсий. Во-вторых, реальная экономика и инфляция. 5% годовых при инфляции в 7% - это отрицательная доходность. За 30 лет покупательная способность гипотетических 6 миллионов рублей сокращается в несколько раз. Государство же, в свою очередь, обязано проводить индексацию пенсий, защищая их от обесценивания. Эта индексация - колоссальная нагрузка на бюджет. Откуда берутся деньги на индексацию? Из взносов нового, более высокооплачиваемого поколения работников или из общих доходов бюджета (НДС, налога на прибыль и т.д.). С 2025 года была возобновлена индексация пенсий работающим пенсионерам, что является дополнительной нагрузкой на бюджет СФР. В-третьих, актуарный дефицит. Система в ее нынешнем виде уже является дефицитной. Объем собираемых пенсионных взносов не покрывает всех обязательств. Разница покрывается трансфертом из федерального бюджета, который в 2025 году составит более 4 трлн рублей. То есть, даже тех 22% (а не 30%, остальные ~8% идут на медицинское и социальное страхование), что отчисляются в СФР, уже не хватает. Государство доплачивает пенсионерам из других источников, по сути, субсидируя систему. Зарабатывать на пенсиях в таких условиях у государства не получится. Вся система построена на так называемых пенсионных коэффициентах (баллах). Уплаченные за вас взносы конвертируются в условные баллы, стоимость которых ежегодно устанавливается правительством. Будущая пенсия (P) рассчитывается по формуле: P=ИПК*СПК+ФВ где ИПК - это сумма накопленных баллов, СПК - стоимость одного балла на момент выхода на пенсию, а ФВ - фиксированная выплата. В этой формуле нет накопленных миллионов. Размер пенсии зависит от трудового вклада относительно других участников системы и от общего экономического состояния страны. Даже существовавшая до 2014 года накопительная часть пенсии (те самые 6%, которые шли на личные счета) была заморожена именно из-за дефицита солидарной системы. Эти деньги не пропали, они остались на счетах граждан и управляются НПФ или ВЭБ. РФ, но новые поступления туда прекратились, а все взносы были направлены на выплаты текущим пенсионерам. Государство в этом плане выполняет социальную функцию, администрируя сложный механизм межпоколенческой передачи средств. Этот механизм - страховка от голодной смерти в старости, а не инвестиционный инструмент. Желание получать в старости высокий доход абсолютно нормально, но для этого существуют другие, рыночные инструменты: Программа долгосрочных сбережений (ПДС) и индивидуальные инвестиционные счета (ИИС), требующие личной финансовой дисциплины.
  17. Календарь выхода интересных проектов в Steam

    Появилась дата выхода / состоялся перенос: Luto 23.07.2025 22.07.2025 Horror, Psychological Horror, Walking Simulator, Story Rich, Dark, Cinematic Grounded 2 July 2025 30.07.2025 Action, Adventure, RPG, Exploration, Sandbox, Third Person Ctrl Alt Deal Q3 2025 July 2025 Strategy, Simulation, Puzzle, Turn-Based Strategy, Board Game, Card Game Wildwood Down 2025 08.08.2025 Point & Click, Comedy, Adventure, Puzzle, 2.5D, Casual Deathground 2025 Q3 2025 Horror, Survival Horror, Dinosaurs, PvE, Hunting, Stealth The Legend of Heroes: Trails beyond the Horizon 2025 January 2026 RPG, Action, Adventure, JRPG, Action RPG, Party-Based RPG Mariachi Legends To be announced Q2 2026 Metroidvania, Pixel Graphics, Indie, Action-Adventure, Combat, Action Super Meat Boy 3D Coming soon 2026 Action, Precision Platformer, Platformer, Difficult, 3D Platformer, 3D Marathon 24.09.2025 To be announced Extraction Shooter, Shooter, PvP, Multiplayer, Sci-fi, Action Oceanhorn: Chronos Dungeon Q2 2025 Coming soon Action, Adventure, Retro, Pixel Graphics, RPG, Co-op
  18. Списки изменений (Чейнджлоги) Актуальный функционал (Версия 2.1.5) В связи с увеличением объёма и для удобства последующих обновлений, полное описание всех функций было перенесено на GitHub Pages. Посмотреть полное описание функций на GitHub Pages
  19. И тут возникает парадокс. Если разработчик отметил “Субтитры” или “Озвучку”, но забыл или не счел нужным поставить галочку “Интерфейс”, то с точки зрения Steam игра не считается переведенной. Она просто не попадет в выборку при поиске по русскому языку. Вчера я мельком упоминал, как работает система языков в Steam и как это влияет на каталог. Сегодня хочу остановиться на этом подробнее. Начну с повторения вчерашнего. Изначально Valve задумывала систему языковых отметок вполне логично: В игре переведено только меню? Ставится галочка «Интерфейс». Есть переведенные диалоги? Добавляется галочка на «Субтитры». Присутствует полная озвучка? Отмечается и она. В реальности разработчики и издатели часто действуют по принципу “лишь бы было”. Они могут отметить все три пункта для русского языка, даже если по факту переведено лишь меню. Или, наоборот, указать поддержку всех языков мира в игре, где текста нет в принципе, — просто для формального увеличения охвата аудитории в магазине. В результате этого хаоса сложилась статистическая закономерность: галочка “Интерфейс” стала самым частым и, как следствие, самым надежным (хоть и неидеальным) признаком наличия хоть какого-то перевода. В результате этого сам Steam при поиске по каталогу с фильтром по языкам ориентируется в первую очередь именно на нее. И тут возникает парадокс. Если разработчик отметил “Субтитры” или “Озвучку”, но забыл или не счел нужным поставить галочку “Интерфейс”, то с точки зрения Steam игра не считается переведенной. Она просто не попадет в выборку при поиске по русскому языку. К примеру, возьмём игру JaDa Fishin'. На странице игры мы можем видеть, что в ней есть русская озвучка: Мы вбиваем название игры в поиске по каталогу и видим игру: А теперь снимаем галочку с английского языка (чтобы видеть игры, где ТОЧНО есть русский перевод) и видим: Таким образом, как вы можете видеть, “потерянные” для фильтров проекты действительно существуют. В связи с этим я решил собрать и показать игры, в которых отмечены русские субтитры и/или озвучка, но не отмечен интерфейс. По сути, это те самые “невидимые” локализации. Полный список всех найденных игр вы можете найти таблице: Google Таблица с полными данными Дополнительный анализ Издатели, чаще всего забывающие про галочку "Интерфейс": Moonbit: 7 игр Team Spikkeee: 6 игр Larsonsoft: 5 игр Spikkeee: 5 игр SomSmolGeims: 5 игр Nightdive Studios: 4 игры Volens Nolens Games: 4 игры NS: 4 игры 659 Records (PTY) LTD: 3 игры Leef 6010: 2 игры Nicholas Rizzo: 2 игры Humongous Entertainment: 2 игры K Bros Games: 2 игры Narko Games: 2 игры Watercolor Games: 2 игры Разработчики, чаще всего забывающие про галочку "Интерфейс": Team Spikkeee: 10 игр Moonbit: 7 игр SomSmolGeims: 5 игр Sonic-Alpha: 4 игры Larsonsoft: 4 игры Volens Nolens Games: 3 игры 659 Records (PTY) LTD: 3 игры Leef 6010: 2 игры Nicholas Rizzo: 2 игры Humongous Entertainment: 2 игры K Bros Games: 2 игры Narko Games: 2 игры Watercolor Games: 2 игры Sheer Studios: 2 игры Carrot Studios: 2 игры Выводы Проанализировав данные, можно сделать несколько наблюдений. Чаще всего "потерянными" оказываются игры от небольших инди-издателей и независимых разработчиков. Вероятно, это связано с недостатком опыта или внимания при заполнении страницы в Steam. Иногда в эту категорию попадают и старые игры от крупных компаний (например, Ubisoft), где при переносе в Steam информация о локализации могла быть указана не полностью. Так или иначе, проблема существует, и из-за неё целевая аудитория не видит полной картины доступных на русском языке игр. Десятки проектов с субтитрами, а иногда и заявленной полной озвучкой, остаются “невидимками” для поиска в Steam. Единственный надежный способ не упустить интересную игру — проверять страницу в магазине, не полагаясь исключительно на фильтры.
  20. The Heart of Darkness

    The Heart of Darkness Метки: Ролевая игра, Для одного игрока, Инди, Аниме, Японская ролевая игра Разработчик: BigWednesday Издатель: Kagura Games Серия: Kagura Games Дата выхода: 16.04.2022 Отзывы Steam: 259 отзывов, 86% положительных
  21. Да, как я и предполагал, за исключением дополнения в виде наблюдателя времени друзей. Экосистема менеджеров (Tampermonkey, Greasemonkey, Violentmonkey и др.), а также сред выполнения скриптов, встроенных в другие расширения (как в AdGuard), довольно разнообразна. Да, все они служат одной цели, но их внутренние реализации могут существенно отличаться. В основе их работы лежит концепция песочницы - изолированной среды, которая создается из соображений безопасности, чтобы пользовательский скрипт не мог бесконтрольно хозяйничать на странице, например, похищая личные данные. Но строгость этой песочницы и набор инструментов, которые предоставляются скрипту для общения с внешним миром, сильно варьируются. Хотя все они стремятся следовать общему стандарту Greasemonkey API, их реализации отличаются. Tampermonkey, на сегодняшний день, является наиболее функционально полным и стабильным менеджером, который реализует даже самые специфические, но ставшие стандартом де-факто в сообществе, возможности API, такие как unsafeWindow и гибкое управление кросс-доменными запросами. Другие менеджеры зачастую являются форками (ответвлениями) более старых версий или независимыми разработками, которые догоняют “золотой стандарт” по функциональности с разной скоростью. Иногда это приводит к тому, что в них отсутствуют определённые функции. Например, некоторое время назад была проблема с работой другого моего скрипта в OrangeMonkey (который использовал наш главадмин SerGEAnt). Она была связана с тем, как расширение обрабатывало разрешения на кросс-доменные запросы и взаимодействие с веб-редактором CKEDITOR, который используется на многих форумах на движке Invasion Board. Скрипту требовался доступ к API редактора, но OrangeMonkey не предоставлял необходимого моста для выхода из “песочницы”, что приводило к ошибке. В то же время в Tampermonkey этой проблемы уже не было, так как его разработчики реализовали более продвинутые механизмы взаимодействия с контекстом страницы. Это классический пример рассинхронизации в разработке, где одно расширение уже адаптировалось под новые веб-технологии, а другое - ещё нет. AdGuard, конечно, довольно мощнейший инструмент для блокировки контента и защита приватности, но выполнение пользовательских скриптов является его вторичной, хоть и очень полезной, функцией. Поэтому вполне объяснимо, что его песочница может быть более строгой, а среда выполнения не предоставляет некоторые узкоспециализированные, но критически важные для сложных скриптов API, такие как unsafeWindow. Это не столько недостаток, сколько фундаментальное различие в философии разработки: приоритет отдается максимальной безопасности, иногда в ущерб расширенной функциональности пользовательских скриптов. Теперь давайте пройдёмся по результатам. Это как раз то, о чём я писал в предыдущем сообщении. Во время разработки скрипт все еще мог получить список игр из window, но где-то с полторы недели назад Valve немного изменила свой фронтенд. Они всё активнее используют современные фреймворки, которые строят страницу динамически, а данные хранят внутри своей инкапсулированной экосистемы (состояние компонентов). Раньше переменные могли просто объявляться в глобальной области видимости, теперь же они "живут" внутри фреймворка, и доступ к ним снаружи затруднен. В какой-то момент массив с ID игр из списка желаемого (g_rgWishlistData), который раньше был легко доступен, стал инициализироваться таким образом, что его можно прочитать только через прямой доступ к JavaScript-контексту самой страницы. Именно для этого понадобился unsafeWindow. Он как ключ, который позволяет скрипту, работающему в изолированной песочнице, дотянуться до переменных на основной странице. Костыль (var unsafeWindow = window;) - это хороший фикс для предотвращения падения скрипта от ReferenceError, но он лишь создаёт псевдоним для window песочницы, в которой g_rgWishlistData по-прежнему не существует. AdGuard не предоставляет этот ключ, поэтому скрипт не может найти ID и сообщает об ошибке. Здесь причина схожа, но связана не столько с доступом к переменным, сколько с изоляцией сессии аутентификации. Ваше тестирование подтверждает, что среда 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 игр со страницы. Вот как-то так.
  22. Корень проблемы заключается в различиях между средами выполнения пользовательских скриптов в Tampermonkey (и аналогичных расширениях) и в AdGuard. В вашем логе ошибок ключевой момент - ReferenceError: unsafeWindow is not defined. Объект unsafeWindow - это специфический API, предоставляемый большинством специализированных менеджеров пользовательских скриптов. Он дает скрипту привилегированный доступ к глобальному объекту window страницы и его переменным. Это необходимо для корректного взаимодействия с функциями и данными, которые использует сам Steam. Судя по всему, среда выполнения скриптов в AdGuard не предоставляет этот специфический объект unsafeWindow, что и приводит к ошибке. Поскольку скрипт разрабатывался и тестировался в окружении Tampermonkey, где этот API гарантированно есть, возникает данная ошибка совместимости. В предыдущих версиях скрипта (например, 1.9.5) большинство модулей работало через прямые API-запросы к серверам Steam (с помощью GM_xmlhttpRequest). Для этого не требовался доступ к контексту самой веб-страницы, и стандартного объекта window было достаточно. В процессе разработки версии 2.0.0 были добавлены новые, более сложные функции, в частности “Помощник подарков в списке желаемого” (wishlistGiftHelper). Его задача - работать с уже загруженным на странице списком игр. Steam помещает эти данные в глобальную JavaScript-переменную g_rgWishlistData, которая является свойством объекта window самой страницы. Здесь и возникает ключевая техническая проблема: из-за политики безопасности браузеров пользовательские скрипты выполняются в изолированной среде (песочнице). Простое обращение к window из скрипта дает доступ к window этой песочницы, а не страницы. Поэтому window.g_rgWishlistData возвращало undefined. Решением этой проблемы стало unsafeWindow. После чего я решил стандартизировать его использование во всех частях скрипта. В теории этот полифил должен сработать для части модулей. Он проверяет наличие unsafeWindow и, если его нет, создает локальную переменную с таким же именем, присваивая ей стандартный объект window. Но есть нюанс. Простое приравнивание unsafeWindow к window не всегда является полноценной заменой. Как уже упоминалось, некоторые модули, типа “Доступность подарков (список желаемого)”, зависят от unsafeWindow для доступа к данным, которые Steam загружает динамически (к глобальному массиву с играми g_rgWishlistData). Из-за изоляции контекстов скриптов, стандартный window может не дать доступа к этим данным. В связи с этим, у меня есть вопрос: После использования того костыля, корректно ли работает функционал помощника подарков на странице списка желаемого? Загружаются ли игры после нажатия “Собрать данные”?
  23. В клиент Steam это имплементировать невозможно физически. Это может быть реализуемо только на каком-нибудь независимом от Valve, стороннем open-source клиенте типа миллениума. Но это может быть актуально для тех, кто оригинальным клиентом не пользуется вообще. Я лично использую клиент только для запуска игр. Для сёрфинга магазина и прочего, имхо, клиент не подходит. Во вторник PermPresident задавал подобный вопрос, он звучал так: Процитирую мой ответ от вторника: С помощью скрипта возможность дарения недоступных игр проверить не получится. Функция “доступность подарков” предназначена для проверки возможности дарения игр, которые продаются в обоих регионах. Она использует общедоступные цены и правило Steam о процентной разнице. В случае недоступных игр цена в недоступном регионе является технической и видна только на стороне издателей/разработчиков, а также для серверов Steam, обычный пользователь получить её не может. Информация о том, может ли недоступная игра быть подарена в какой-то регион, может быть получена только методом тыка: Даритель из другого региона, где игра доступна, добавляет её себе в корзину. Он нажимает “Купить в подарок” и выбирает из списка друзей получателя. После выбора получателя он переходит к следующему шагу оформления подарка. Именно в этот момент его клиент Steam отправляет запрос на серверы Steam для инициализации транзакции. Этот запрос содержит информацию о корзине дарителя и аккаунте получателя. Сервер Steam на своей стороне проверяет регионы, сравнивает техническую цену в недоступном регионе с ценой в регионе дарителя и, если разница превышает ± 10%, возвращает клиенту дарителя ошибку с кодом 72. После этого даритель видит то самое сообщение: “ Подарок невозможно отправить, так как цена в регионе получателя значительно отличается от вашей цены”. Если проверка проходит успешно, его перебрасывает на следующий этап. Почему это нельзя автоматизировать в скрипте для проверки возможности дарения в другой регион? Как можно понять из написанного выше (а ещё из файла checkout.js), вся логика проверки скрыта на сервере. Браузер не запрашивает “техническую цену”. Он просто отправляет запрос “Можно ли подарить ЭТОТ товар ЭТОМУ пользователю?” на серверный эндпоинт /checkout/inittransaction/. Сервер отвечает не ценой, а лишь кодом результата: success: 1 (успех) или кодом ошибки, например, purchaseresultdetail: 72. А стало быть скрипт не может получить доступ к этой технической цене, потому что Steam её не показывает. Мы также не можем заранее симулировать этот запрос для всех игр в списке желаемого друга, так как для этого потребовалось бы от добавлять каждую игру в корзину по одной и инициировать подарочную транзакцию, что быстро приведёт к блокировке, т.к. эндпоинт inittransaction имеет жёсткие встроенные ограничения на количество транзакций, результатом будет ошибка 53: “За последние несколько часов вы пытались совершить слишком много покупок”. Добавление всех игр сразу не пройдёт, потому что помимо ошибки 72 есть ошибка 2 - “На счете недостаточно средств”. И так далее. И в продолжение ответа на: Учитывая написанное выше, может появиться вопрос: Если техническая цена недоступна, каким образом функционируют сервисы, которые отправляют подарки? Ответ давал в декабре 2024-го. Как устроены магазины, которые дарят гифты в регионы, где игра недоступна: У этих магазинов есть множество аккаунтов почти всех регионов Steam. Они через массовые автоматизированные запросы выясняют, в каком регионе техническая цена укладывается в 10%-е рамки недоступного региона. После чего шлют подарок из укладывающегося в рамки региона. Именно поэтому некоторые люди попадают в замешательство. К примеру: Некоторые думают, что все подарки присылаются из какого-нибудь казахского региона. Они конвертируют цену из тенге и там получается, скажем, 100 рублей. А продавцы, предлагающие гифты, продают за 400 рублей. У людей возникает вопрос: неужели накрутка в 4 раза? Почему так дорого, если при конвертации 100 рублей? А ответ как раз в 10%. Значит техническая рублёвая цены находится где-то в границах 10% от тех 400 рублей. Работает и в обратную сторону. Люди видят, что в Казахстане цена 2000 рублей, а продавцы предлагают за 1000. Значит, что техническая рублёвая цена находится в районе 1000 и есть регион, где цена укладывается в рамки 10%. P.S. У меня есть подозрение, что владельцы магазинов гифтов имеют доступ к некой централизованной системе, где концентрируются данные о возможности дарения игр из одного региона в другой. Ибо для получения этой информации требуются колоссальные ресурсы (как в плане финансов, так и в плане аккаунтов), я сомневаюсь, что у продавцов поголовно есть доступ к подобной махине в виде огромной ботосетке для проверке дарения. Скорее всего есть какой-то закрытый клуб для своих или оптовиков, но я в их круги не вхож, не слышал.
Zone of Games © 2003–2025 | Реклама на сайте.

×