Создание скриптов для BitBurner
Игра позволяет прописывать код во встроенном редакторе Nano, достаточно удобном в целом, но всё же интерфейс которого не самый привычный большинству, и совсем непривычен для новичков. Поэтому многие пользуются редактором VSCode с расширением Bitburner VSCode Integration. Считаю, что это гораздо удобнее, и рекомендую так же отстроить окружение. Для работы транспилятора необходимо также установить NodeJS помоложе (14+), а для Windows - Git, чтобы иметь unix-like терминал и можно было пользоваться всеми преимуществами контроля версий.
https://code.visualstudio.com/download - редактор
https://marketplace.visualstudio.com/items?itemName=bitburne... - расширение
https://nodejs.org/en/ - NodeJS
Чтобы получить автокомплит, проще писать сразу на Typescript. Во-первых, язык помогает избежать многих ошибок, пусть и только в рантайме/на этапе транспиляции в JS. Во-вторых, организации покрупнее перешли или переходят на TS, поэтому для желающих во фронтенд практика TS лишней не будет.
На гитхабе есть множество готовых темплейтов, позволяющих сразу взять и писать скрипты с автодополнением и прочими плюшками. Я предпочитаю лишний раз самому разобраться, поэтому опишу базовую настройку окружения) Все подробности пишу под Windows, т.к. у линуксоидов всё же должны быть базовые навыки работы с терминалом. Будет полезно знакомящимся с экосистемой разработки под JS|TS, не только для BitBurner.
Итак, после установки всех вышеописанных программ мы должны настроить редактор и затем подготовить директорию для работы. Запускаем VS Code, и выбираем дефолтным окружением Git Bash по инструкции: https://code.visualstudio.com/docs/terminal/basics
Периодически настройка меняется, поэтому ссылка на оф. документацию. Я сижу на арче/убунте, поэтому могу ошибаться в нюансах работы на Windows, но, в целом, после выбора bash дефолтным терминалом проблем быть не должно.
Теперь при открытии терминала (ctrl+~ по умолчанию) у вас будет запускаться unix-like терминал. Теперь можно создавать проект :)
Создайте директорию, в которой будете хранить скрипты. Откройте её в VSCode и запустите терминал. Теперь инитим npm-проект командой npm init -y (флаг -y автоматом выберет дефолтные параметры), затем добавим необходимые пакеты:
npm install -D typescript @TypeScript-eslint/eslint-plugin @TypeScript-eslint/parser eslint eslint-config-airbnb-base eslint-plugin-import eslint-config-airbnb-typescript
Эта команда установит нужные библиотеки для разработки скриптов под игру + линтер (лучший друг любого кода). Теперь нужно настроить линтер и Typescript. Для понимания настроек необходимо прочесть документацию:
https://eslint.org/docs/latest/user-guide/configuring/ - линтер
https://www.typescriptlang.org/docs/handbook/tsconfig-json.h... - typescript
Или просто создайте файлы через терминал:
code .eslintrc.js tsconfig.json
И вставьте готовые настройки из песочницы:
Если у вас есть свой любимый конфиг линта, то добавьте в него правило 'import/prefer-default-export': 'off' , т.к. в большинстве случаев ESLint предлагает заменить конструкцию export fn main на export default, и подчёркивает весь код как неверный.
Теперь создадим папки для удобного размещения скриптов:
mkdir {src,build,types}
Эта команда создаст в текущей директории 3 папки. В одной мы будем хранить и прописывать TS файлы с исходным кодом (src от sources - исходники), в build будет готовый js - для синхронизации с игровым сервером, его руками менять не будем. И types - для хранения файла, описывающего API игры, тоже будем менять только при обновлениях игры (если будет меняться api, как в недавнем релизе 2.0.0+).
В tsconfig уже указали эти папки. Так же там есть настройка "paths" - она пригодится в будущем для импортов, т.к. игра не может в относительные пути.
Теперь нам нужно добавить Type Definitions - собственно, описание апи игры, по которому мы получим автокомплит в редакторе, а при изучении его сможем многое полезное позже найти. Итак, как объявлено в tsconfig.json, мы должны создать файл NetscriptDefinitions.d.ts и положить его в папку types, а наполнить мы можем оригинальным описанием от разработчика:
https://github.com/danielyxie/bitburner/blob/dev/src/ScriptE...
ctrl+a, ctrl+c:
https://raw.githubusercontent.com/danielyxie/bitburner/dev/s...
Осталось дело за малым: запустить игру, старт API server и получить токен авторизации:
Нужно включить верхние две опции и скопировать токен авторизации. Не закрывая игру, возвращаемся в VSCode, прожимаем палитру команд (ctrl+shift+p) и вводим BitBurner, выбираем Add Аuth Token и вставляем ранее скопированный токен из игры. И заодно включаем File Watcher, чтобы автоматизировать обновление скриптов в игре.
Теперь нужно настроить пуш в игру файлов из папки build, а не всех папок. Для этого снова открываем настройки, как при выборе терминала, но теперь вводим в поиск scriptRoot, сразу находим нужную опцию и вводим ./build/
Теперь при компиляции (таки скорее транспиляции) TS файлов в JS будет триггериться вотчер расширения, который отправит все файлы в игру и там мы можем сразу запускать их.
Осталось дело за малым: проверить, как оно работает. В папке src создаём файл с понятным названием и расширением .ts (например, hack.ts) и прописываем базовую структуру:
Нам нужно импортировать тайпинги и объявлять асинхронную функцию с именем main, которая принимает в себя как минимум один аргумент ns. Это требование апи игры. Исключение - вспомогательные именованные функции, которые вы будете импортировать как часть своего скрипта, там можно уже называть как угодно. Но если вы хотите запускать скрипт из терминала игры, то его исходник должен соответствовать такой структуре.
Последний этап - компиляция. Мы пишем скрипты в среде Node JS, поэтому нужно в главном файле любого проекта - package.json - указать скрипты для компиляции. Чтобы один раз запустить команду и дальше автоматом компилить TS файлы в JS, в поле scripts нужно добавить команду watch (или любую удобную, например, go) со значением tsc -w:
Теперь в терминале можно выполнить npm run watch и сосредоточиться только на написании кода. Вперёд, за взломом!))
Для желающих погрузиться:
1) попробуйте настроить tsconfig.json так, чтобы импортировать тайпинги NS можно было из '@ns'
подсказка: https://www.typescriptlang.org/docs/handbook/tsconfig-json.h...
2) Создайте скрипты из туториала через данное окружение
Как быстро написать слайдер на JS?
Во многих сайтах и программах уже давным — давно используются такие элементы взаимодейтсвия пользователем, как «Слайдер», по сути это одна большая фотография которую можно переключать с помощью стрелочек или по нажатию на клавиши. Удобно когда на экране мало места, а показать множество фотографий нужно.
Как же создать вот такой слайдер?
Слайдер будет состоять из кусков кода HTML, CSS, JS, писать будем в Codepen.io но это только для удобства, можете перенести к себе на сайт, веб-приложение или в удобное для вас место.
План
1. Пишем структуру
2. Пишем стили
3. Пишем код
4. Заполняем объект
Пишем структуру
Наша структура будет состоять из объекта с классом «slider», внутри которого будет две кнопки для переключения, одна с индификатором «left», другая с «right». По середине будет большая фотография с индификатором «slider_image».
<div class="slider">
<button id="left">
<img src="https://cdn-icons-png.flaticon.com/512/318/318476.png">
</button>
<img id="slider_image" src="">
<button id="right">
<img src="https://cdn-icons-png.flaticon.com/512/318/318476.png">
</button>
</div>
Пишем стили
Обнуляем лишние стили и пишем свои для наших элементов, контейнеров, кнопочек и фотографий.
body{
outline: none;
user-select: none;
font-size: 16px;
}
h1,p{
margin: 0;
padding: 0;
}
p{
margin-bottom: 10px;
}
a{
text-decoration: none;
background-color: rgb(50,50,50);
color: white;
padding: 5px 20px;
}
a:hover{
background-color: rgb(70,70,70);
}
.slider{
background-color: rgb(230,230,230);
height: 350px;
padding: 50px;
display: flex;
justify-content: center;
align-items: center;
}
.slider #slider_image{
background-color: rgb(50,50,50);
height: 400px;
min-width: 400px;
}
.slider button{
width: 70px;
height: 70px;
margin: 30px;
border: none;
border-radius: 100%;
padding: 0;
background: none;
}
.slider button img{
width: 50px;
height: 50px;
}
.slider #left img{
transform: rotate(180deg);
}
.slider button:hover{
opacity: 80%;
cursor: pointer;
}
Пишем скрипт
Для начала создадим объект, внутри которого будет хранить фотографии для слайдера, а именно ссылки на них для вписывания в будущем их в атрибут «src» на главной фотографии с индификатором «slider_image». После ищем все нужные элементы на странице через вставку «document.querySelector» и «document.getElementById». Создаем функции такие как «update()» которые будут отвечать за обновление главной фотографии, дальше будем писать ещё две функции для переключения главной фотографии. При старте страницы нужно вызвать функцию обновления, для подстраивания картинки при старте.
let slider_cfg = {
1: "https://cdn.pixabay.com/photo/2014/11/30/14/11/cat-551554_96...",
2: "https://cdn.pixabay.com/photo/2015/03/27/13/16/maine-coon-69...",
3: "https://cdn.pixabay.com/photo/2021/10/19/10/56/cat-6723256__...",
4: "https://cdn.pixabay.com/photo/2016/03/28/12/35/cat-1285634__...",
5: "https://cdn.pixabay.com/photo/2019/11/08/11/56/cat-4611189__...",
6: "https://cdn.pixabay.com/photo/2021/10/19/10/56/cat-6723256__...",
}
// varibles
let slider_image = document.getElementById('slider_image');
let left = document.getElementById('left');
let right = document.getElementById('right');
let sin = 1; //slider_image_number - sin
let size = Object.keys(slider_cfg).length;
let path = slider_cfg[sin];
// update slide
function update(){
path = slider_cfg[sin];
slider_image.setAttribute("src", path);
}
// toggle slides
left.onclick = function(){
if (sin > 1){
sin = sin - 1;
} else{
sin = 1;
}
update();
}
right.onclick = function(){
if (sin < size){
sin = sin + 1;
} else{
sin = size;
}
update();
}
// start
update();
Заполняем объект
Внутри объекта «slider_cfg», пишем номер картинки от 1 до бесконечности, он сам подстроит и сам определит количество, главное соблюдать индификатор, но можно написать и без индификатора по номеру и просто перебирать их. Ещё легче было бы написать в массиве. После указания номера картинки, после «:» пишем ссылку на картинку в скобочках « ' ' », не забудьте поставить «висячую запятую», то есть как на скриншоте, после каждой записи ставить запятую в конце, даже если запись окончена.
Итог
У нас есть рабочий и очень простенький слайдер для переключения фотографий, которые мы заполняем в объект. Все это работает без сбоев и хорошо.
Ссылка на код: https://codepen.io/Anton-Malezhik/pen/ZEJvbNQ
Удаление видеозаписей из VK скриптами в 2022
Приветствую, друзья!
Заметил на днях, что в VK у меня было добавлено более 1900 видео. И какой только ерунды там не было... Вспомнил, что сейчас могут призвать к ответственности за видео на странице, а перебирать всё вручную не хотелось.
Решил почистить скриптами - пошел искать в интернете. Все найденные скрипты на первых вкладках поисковиков не работали, поэтому (яж программист) стряхнул пыль со знаний JavaScript и поправил их под рабочие.
Проверял работоспособность в день создания поста, но ВК может все поменять в любой момент.
Итак, поехали!
Порядок действий:
1) Открываем на компьютере в Chrome (в других браузерах не пробовал) страницу с видеозаписями VK (Раздел "Мои видео")
2) Открываем DevTools (просто нажимаем F12) и переходим во вкладку консоли (Подчеркнуто синим):
3) Проматываем вниз, чтобы прогрузилось побольше видео (если устанете крутить, то можно будет удалить часть сейчас, а потом повторить итерацию)
4) В самом низу консоли вставляем скрипт и нажимаем enter:
vidCnt = document.body.querySelectorAll('.VideoCard__thumb').length;
for (let i = 0, int = 500; i < vidCnt; i++, int += 500) {
setTimeout( ()=> {
document.body.getElementsByClassName('VideoCard__action VideoCard__action--delete')[i].click();
}, int);
};
5) Идем пить чай/пиво/кумыс и оставляем компьютер наедине со скриптом
После этого скрипт будет вместо вас искать все подгруженные на страницу видео и вызывать события нажатия на крестик удаления (еще и с небольшой задержкой, чтобы ВК не забанил).
Видео удаляются слева направо и сверху вниз (можно промотать страницу вверх и наблюдать прогресс)
6) Если за один прогон скрипта все видео не удалились, то можно после обновления страницы повторять пункты 3 и 4, пока не удалятся все.
Надеюсь, кому-нибудь пригодится!
P.S.: Так как уже не слушаю музыку Вконтакте, то планирую найти время и сделать инструмент для чистки аудиозаписей. Если этот пост зайдёт, то выложу и по аудио.
Как я хотел найти профи на Яндекс.Услугах
Понадобилось создать скрипт заказчику для заполнения веб форм. Решил разместить заказ на Яндекс.Услугах.
Откликнулось 4 человека.
По итогу- 1 мошенник, ему был отправлен небольшой аванс, скрылся, профиль удалил. Жалоба в Яндекс ни к чему не привела, хотя паспорт был проверен и стоял этот статус в профиле. Служба поддержки развела руками, ничего сделать не можем, извините.
Второй с явно завышенной самооценкой при звонке моём, а дозвониться я смог всего-то один раз, поскольку он присылал мне только смс с указанием временных интерваловs, в которые я мог ему звонить и что он не тех поддержка и не обязан отвечать мне по любому звонку моему, так вот он зачитал мне список моих объявлений из Авито!, которые я когда-то публиковал и сказал, что какое я имею отношение к таким заказам, если продаю вещи по списку Авито. Видимо если ты продаешь кота, то скрипты тебе заказывать нельзя ну никак! Также он направил меня в прямом смысле слова читать Коран, я так и не понял зачем и какое это отношение имеет у заказу, равно как и мои объявления частного характера в Авито или ещё где-нибудь.
Третий и четвертый, кто откликнулся на заказ просто слились, сославшись на занятость.
Да, кстати все якобы "исполнители" так стали себя вести после озвученных мною требований к ним следующего содержания:
1. Заключение договора между исполнителем и моим юридическим лицом.
2. Четкое прописывание этапов работы, сроков выполнения их и стоимости. Оплата по факту выполненных работ по этапам. Оплата на карту исполнителя от моего юридического лица.
3. Портфолио исполнителя: какие проекты подобные моему запросу были выполнены, контактные данные заказчика, чтобы я мог связаться с ним(и) и выяснить при желании отзывы реальные.
Естественно никто такого рода информацию мне не предоставил и заключить договор не пожелали.
Мало того, господин рекомендовавший мне обратиться к священному писанию грозит рассказать обо мне в своем блоге т.к. я отыв о нём краткий написал и ему это не понравилось. Правда я не знаю, о чем он хочет там написать. Он оказывается и блог ведёт ещё.
Заказ кстати актуальный, скрипт надо сделать для быстрого заполнения веб формы на портале. Кому интересно и кто реально хочет проявить свой профессионализм- обращайтесь.
Скрипт по идентификации NSFW на клиентской стороне
Здравствуйте)
Наткнулся на такой интересный скрипт js, который блюрит непристойные изображения в клиентской части:
Можно использовать для блокировки в постах без тэга NSFW или вызове модератора (труднее, т.к. нужен единственный уникальный запрос без дублей).
Это же можно провернуть и с GIF-ками, скорее всего, нужно вытягивать только первый кадр (или средний в тайминге)
Спасибо за внимание)
P.S. да простят меня пикабушники))
Скрипт для сворачивания NSFW постов
Так как на Пикабу можно только полностью скрывать NSFW посты, а просто сворачивать нельзя. Я на выходных написал скрипт для этого.
Установка (ПК)
1. Если не установлен Tampermonkey, устанавливаем. (Chrome, Firefox)
2. Переходим по ссылке и нажимаем на "Установить этот скрипт"
3. Разрешаем установку
4. Готово. Теперь все посты с тегом NSFW будут выглядеть так. Если надо подропосмотреть, то нажимаете на "+" и пост разворачивается.
Установка (Android)
На Android установить скрипт получится только в браузер, в приложение никак.
1.Устанавливаем Firefox Nightly
2. Устанавливаем Tampermonkey по этой инструкции (на русском не нашел, переводчик в помощь)
3. Дальше установка не отличается от ПК.
Т.к. в мобильной версии нет кнопки для раскрытия поста, то посмотреть пост полностью можно только перейдя на него.
Заманчивое предложение (нет)
Если у меня раньше и были сомнения, стоит ли идти в веб разработку (или чего другое, связанное со скриптами), то теперь они отпали.
Я.Директ, вы хоть картинки для рекламы не такие страшные подбирайте)