IT POLICE
Open in Telegram
637
Subscribers
No data24 hours
No data7 days
+630 days
Posts Archive
637
📖 Как зарождалась Флибуста?
• История начинается с Максима Мошкова, который был системным администратором в научно-исследовательском институте и очень любил читать книги. Вот только читал он много, а книг было меньше, чем хотелось бы. Тогда он с коллегами установили http-сервер и разместили на нём веб-сайт института Стеклова. Ну а затем там же появились личные страницы сотрудников. На своей странице Максим начал публиковать личную коллекцию текстовых файлов с книгами. Так, 1 ноября 1994 года, на свет появилась Библиотека Максима Мошкова.
• Посетители появились почти сразу, по 5-15 человек в сутки. Стоит отметить, что в тот момент времени весь новорождённый Рунет насчитывал порядка сотни веб-сайтов, и на них обычным делом были каталоги со ссылками на все известные владельцам страницы. Уже к весне 1995 года число заходов в сутки могло достигать сотни — библиотека Мошкова стала одним из топовых сайтов раннего Рунета. В 1998 году библиотека была перенесена на новую страничку с сохраняющимся поныне адресом lib.ru. Однако в 2004 году у Максима Мошкова начались проблемы с "пиратсвом", против него начали подавать иски по защите авторских прав. С середины 2000-х годов сайт перестал активно пополняться, оставшись реликтом романтичной эпохи раннего Рунета с характерным дизайном Веб 1.0.
• Однако аудитория Рунета в те годы стремительно росла, соответственно, росло число желающих добыть книги в электронной форме бесплатно. Параллельно с этим издательства развернули борьбу против книжного электронного пиратства. Библиотека Максима Мошкова оказалась заморожена. В сети бурлили дискуссии вокруг авторского права, и очень популярной, особенно в среде компьютерщиков и анонимусов, было мнение о том, что аморальное воровство — это копирайт, а не защита копирайта, ибо «любая информация должна быть свободной».
• И вот, 10 июня 2007 года возникла открыто и явно пиратская библиотека под названием «Либрусек». Её создал эмигрировавший в Эквадор российский программист Илья Ларин, и на сайте ехидно сообщалось, что он лежит на эквадорских серверах в оффшорном дата-центре, работает в рамках эквадорского законодательства, крайне либерального по вопросам об авторском праве.
• Основой для коллекции стали 62 тысячи книг в формате fb2. В полном соответствии с тенденциями Веб 2.0 всем желающим была предоставлена возможность заливать на сайт свои файлы — которые, впрочем, со временем стали проходить модерацию, чтобы сайт не оказался погребён под спамом и вандализмом.
• К 2009 году суточная посещаемость сайта превысила 100 000, однако в это же время Либрусек стал склоняться к отказу от изначальной непримиримости по вопросу об авторском праве. Он заключил договор с интернет-издательством электронных книг Литрес, публикуемые там книги перешли в ограниченный доступ. В последующие годы сайт старался легализоваться и перейти на официальный платный доступ для пользователей, и периодически подвергался блокировке РКН за размещение запрещённых материалов. В 2012 году, в его базах имелось более 226 тысяч книг на 374 гб, но во второй половине 2010-х годов Либрусек окончательно ушёл из топов и ныне влачит не очень заметное существование.
• В 2009 году, при «первых звоночках», от Либрусека отпочковалась группа непримиримых литературных пиратов, которые создали аналог под названием Флибуста. В декларации по поводу сецессии они объявили себя «наглыми и жадными пиратами», желающими, чтобы «люди читали хорошо и много». Возглавил их оставшийся покамест неизвестным программист с ником Stiver, известный среди активных пользователей сайта как Капитан. Логотипом вместо пирата стала шхуна на волнах из страниц книги, а политикой осталась всё та же непримиримость по вопросам копирайта на книги при попутном отказе от размещения рекламы.
• С середины десятых годов, впрочем, под напором российских правообладателей, сайт покинул исходный адрес и ушёл в более глубокие места сети — оставшись при этом крупнейшей онлайн-библиотекой на русском языке. Ну а что будет с ней теперь, после смерти создателя и главадмина — покажет лишь время.
➡️ Источник.
637
Вакансия / Python / AI
Требуется python backend специалист в компанию, которая занимается информационными продуктами для прекрасного пола. Помимо питона нужен опыт взаимодействия с различными ИИ решениями, так как основная обязанность - это внедрение таких решений в продукты компании. Ничего сложного.
Это не реклама, я сам к ним закидывал резюме, но до собеса не дошло, так как ушел в другой проект. А необходимость в питонисте у них осталась. Гео: Москва, удаленка возможна, зп как договоритесь.
Основные требования:
- Опыт разработки на Python от 2 лет.
- Знание и опыт работы с библиотеками для машинного обучения и AI: TensorFlow, Keras, PyTorch, scikit-learn.
- Опыт работы с SQL и NoSQL базами данных (PostgreSQL, MongoDB, Redis).
- Владение ORM, предпочтительно SQLAlchemy.
- Опыт работы с очередями задач и брокерами сообщений (Celery, RabbitMQ, Apache Kafka).
- Понимание принципов асинхронного программирования, работа с потоками и процессами.
- Умение разрабатывать REST API, опыт работы с публичными и частными API.
- Опыт работы с системами контроля версий (Git).
- Базовые знания работы с облачными сервисами (Google Cloud,).
- Опыт работы с контейнеризацией (Docker).
По всем вопросам писать Василисе: @bolotva (это не рекрутер). Можете писать "от Тёмы", если что.
637
💾 NotPixelMiner был обновлен
- В файле templates.py можно указать границы используемого шаблона (id пикселей левого верхнего и правого нижнего углов) и цветовую палитру.
По умолчанию используется шаблон с пикчи.
637
Автоматический майнер Not Pixel
Написал простенького бота для майнинга Not Pixel, пока еще не поздно. У него простейшая логика, закрашивает рандомные пиксели рандомным цветом. Приглашаю на тесты. Пожелания приветствуются, но не уверен, что буду их исполнять. 🫠
💾 GitHub
637
BLUM API v2
В 4 часа утра, без объявления войны, посыпались сообщения, что скрипт-автоклеймер для мини игры BLUM перестал работать. Решил посмотреть, что там опять наделали эти разработчики, и почему мешают жить честным пиратам кодерам, и у меня есть для вас новости. Хорошие они или плохие - зависит от угла вашей точки зрения.
1. Проект частично перешел на API второй версии. И вообще это хорошие новости, значит там что-то пилится, а не просто гоняется воздух на ютуб.
2. В новой версии API подумали о безопасности. Теперь результаты игры передаются на сервер в зашифрованном виде, и эксплуатация долгоживущей дыры больше невозможна. Плохое тут то, что мой скрипт теперь бесполезен. А хорошее, что продукт развивается, и в купе с различными слухами и обещаниями это может означать, что в ближайшем будущем пользователи получат что-то большее, чем просто цифры на дисплеях.
До сих пор не понимаю, как можно быть настолько кривожопыми, разрабатывая типа инновационный продукт. Я, кстати, давно пришел к выводу, что раз разрабы забили на столько большой болт на безопасность, значит будет очередной хомяк или что похуже. Возможно был не прав, посмотрим.
Теперь немного технических подробностей.
1. Для получения id игры теперь используется этот url: "пиратов кодеров- немного печалит.
Хотя получить доступ к алгоритму шифрования и ключу, который использовался для шифрования данных, всё еще возможно, например проанализировав код игры, если есть доступ к исходникам или документации API. Поэтому в ближайшее время нужно чекать github, на случай слива. А пока ждемс информации от умных людей.
https://game-domain.blum.codes/api/v2/game/play"
2. Для отправки результатов url: "https://game-domain.blum.codes/api/v2/game/claim"
Полезная нагрузка с результатами теперь выглядит так:
{"payload":"tKFApZf46aMZzT3WTYWhGBOlbNEwX6U46wAZwdKxZkquxtKbLV09Yl4z5ut1sgP/WyAOvuxDhOyl6pYpAYYucVFfAbdalHeB9JKf6N9MEvOp47uUeYYnZAeJ4IQpc007Gbs5opoIWizaZqLfv7fbsco4v93Fj1hKdX5dgIYxw1zFpCEJPnlMGV33uAFy0LhgD+x0MeAmm6eXPhEJT9RpOk+BNJLAL9tDl9psxvL8+L5RtJ9jEHtN1bAKlSJ1ES0GTSD3bORv42GvpNL77+rbtU/Kt4a4g0AU6wKJ6WU89l9jGpRMKA9VUpV1NraCUbwgLnvnRtKmCYzx+JrZel2H2ntJADkunthkq8GpxkxmQ86AzXvQHI1UgAJU7xDII7Y2XaCt8/Agw2HXaGAX8fE0Ra86jHbtY9Zo/jR8AIALitox/7O2WeAM7e+gQxdCRO9ocyAPQmnW+BzCq2FZPAn8gNsD7fe/dSu0APRl5HAXI8cia0sLGrFnl76sIr0BfULWz49BSd0AFCx/JmtvAAl/JALul/8/YwqQlrKb2AtRAczTYY9b+wBa71AR4Ue2lxYYmFDNJDMytRAqD18+1RxaA2C0Q6PdPivnABGmb2BLBOBQnDioe8PS/HI/OpV0AskF2RDOk87MPqJsBm7udK6wsk1uJePBbaGA0GNWfvmOR0c="}
Очевидно, эта строка закодирована с использованием Base64. Этот метод преобразует бинарные данные в строку, состоящую из символов, которые можно передавать в текстовом виде. Однако это не является шифрованием, а только способом представления данных.
Конечно же, я попытался декодировать строку из Base64, но она выглядит как набор случайных символов, то есть — это зашифрованный с помощью алгоритмов AES (симметричное шифрование) или RSA (асимметричное шифрование) контент, который без правильного ключа шифрования прочитать невозможно. Только не пытайтесь декодировать именно эту строку, я её слегка изменил, чтобы Смеркис не забанил мой аккаунт.
Итого: не прошло и года, как разработчики начали использовать хоть какие-то методы защиты для предотвращения подделки данных. Как обычных юзеров, нас это радует. Как благородных 637
Вакансия/Python/офис/Москва
Требуется условный джун+ для работы над бэкенд сервисами агрегатора. Не удалёнка, не галера, зп индивидуально по результатам собеса.
Минимальные требования:
- уверенный Python 3 с пониманием SOLID, KISS, DRY
- Понимание работы сетей и протоколов, умение работать с публичными и непубличными API
- Опыт датамайнинга (скрейпинг + парсинг), в т.ч. динамических страниц
- Опыт работы с реляционными и нереляционными базами
- Git
- Linux
- опыт коммерческой разработки НЕ ВАЖЕН!
- возраст НЕ ВАЖЕН!
- GitHub ВАЖЕН!!! (Чуваки и чувихи, которые не ведут GitHub, верю что вы крутые, но нет).
Будет плюсом всё сразу или что-то из этого:
- знание Flask или FastAPI
- Unittests, Pytests
- MongoDB + pymongo и тд
- Asyncio, Multiprocessing, Threading
- Брокеры сообщений и очереди задач
- Docker, Docker Compose
- CI/CD
- Понимание инструментария облачной инфраструктуры Yandex Cloud
Офис: Москва, Звенигородское шоссе (метро 1905 года).
Интересующимся писать сюда: @itodmen
Обязательно прикладывайте информацию о себе или резюме, и ссылки на GitHub (если считаете, что он у вас не идеальный, ничего страшного, не профессора ищем).
637
Еще один подход к обновляемой аутентификации
Не так давно у Notcoin появился новый проект с короткой дистанцией листинга: Not Pixel
Конечно же, захотелось посмотреть, что у этой команды с безопасностью, и можно ли проект автоматизировать.
Не особо вникал, что там за правила игры, поэтому могу в чем-то ошибиться, но на сколько понял, необходимо на огромном поле закрашивать пиксели, и чем дольше проживет твой пиксель, тем выше вознаграждение, на которое можно будет претендовать.
Под капотом выглядит это так:
- На url
https://notpx.app/api/v1/repaint/start просто летят пост-запросы с нагрузкой в виде ID нужного пикселя и цветом, в который он должен быть выкрашен, например: {"pixelId":1,"newColor":"#BE0039"}
ID пикселей может быть от 1 до 1000000. На начальном этапе есть 5 пойнтов для закрашивания пикселей и восстанавливается каждый в течение 10 минут.
В общем, выглядит как изи-пизи. Но есть одно НО. В заголовках запроса для закрашивания пикселя используется обновляемый токен аутентификации типа initData с URL-кодированными данными:
id: you_tg_id first_name: uName last_name: (у меня пусто) username: tg_username language_code: ru (у меня русский) is_premium: true (пользователь имеет премиум-статус) allows_write_to_pm: true (разрешено писать в личные сообщения) chat_instance: -2531900605131333967 chat_type: sender (тип чата - отправитель) auth_date: 1727609643 (время аутентификации в формате Unix timestamp) hash: 1c97d665e6a779046d8cd27e5fc72a157ac647a619147f02072ab6fa49f492d4 (хэш для проверки данных)Соответственно, именно в хэше и есть камень преткновения. На сколько я могу судить, хэш генерирует клиент, но что именно шифруется и по какому алгоритму, с каким ключом, понять невозможно. Может быть крутые js-профессора смогут разобрать клиент на молекулы и найти ключ с алгоритмом? Хотя, учитывая распространенную практику обфускации кода, вариант маловероятен. Могу предположить, что шифруется именно временная метка, по которой на стороне сервера определяется, не просрочен ли токен. А вот какой срок действия каждого токена я еще не выяснил. Было бы классно, если бы он был не меньше 24 часов. В таком случае, не слишком запарно было бы иногда обновлять его руками в запущенном скрипте. Но похоже эти ребята, в отличие от всяких хомяков и BLUM, к своей работе относятся серьезно. За что могу их только похвалить. Но может у вас есть еще какие-то мысли?
637
Перевод поста с официального канала Хомяка о защите их приложения от читеров. По моему, полное гонево. Большинство скриптов, написанных под пивко, эту защиту легко преодолели. 🏴☠
🛡 ЗАЩИТА ХОМЯКА 🛡
👿 Мы забанили более 2,3 миллиона читеров — этого хватило бы, чтобы заполнить весь Рим!
🏴☠️ Интересно, как мы их поймали? Ну, вот пример: один человек подключил более 400 аккаунтов к одному адресу Binance , а другой пригласил почти 2000 «друзей», и все они были отмечены нашей античит-системой.
🤖 Мы анализировали поведение пользователей в течение нескольких месяцев до TGE. Мы видели аккаунты, которые входили в систему в одно и то же время каждый день и нажимали на один и тот же пиксель.
📈 Мы изъяли у этих мошенников 6,8 млрд токенов. 50% были распределены среди честных игроков , еще 50% будут сожжены.
🐹 Мошенникам не место в нашем сообществе. Они автоматизируют свои продажи с помощью программного обеспечения, чтобы получить преимущество над обычными игроками. Мы заботимся о наших игроках и участниках рынка, особенно о долгосрочных держателях , и хотим защитить их.
637
+1
Хомякам раздали токены. Как и ожидалось, это какие-то слёзы, с учетом цены на премаркете в 0.01$
Сказочно разбогатеть на пятиминутном скрипте опять не удалось)) Тем, кто тапал вручную, соболезнования.
UPD: на вывод из этих копеек дадут только 10% от суммы. Чтобы когда-нибудь разблокировать остальное, "сообществу" хомячьих, по всей видимости, придётся тапать дальше. Гениальное разводилово.
Вывод: все эти т.н. веб3 проекты нужно скамить самим, чтобы не было обидно за бесцельно потраченные месяцы. Учитесь кодить.
637
Купил средство от похмелья. Увидел и что-то прям захотелось.
Товарищи зумеры, только не говорите, что бумажные книги— это кринж.
637
Кто сколько заработал в рублях? Коллективный иск выкатим хомяку, если ожидания не оправдает))
Если сравнивать с пикчей, мой доход в районе 80 млн. рублей должен быть 😁
637
Обновляемая токен-аутентификация
Это ☝️ система аутентификации с двумя типами токенов. И как говорит джаваскриптизёр на моей работе: "это дрочево сейчас best practice". Так оно и есть, штукенция хорошо портит жизнь всяким автоматизаторам. Даже пресловутый BLUM её использует, и в комментариях постоянно попадаются вопросы на эту тему. Поэтому немного теории.
Типы используемых токенов:
Access Token (токен доступа): Этот токен используется для доступа к защищенным ресурсам и имеет короткий срок действия.
Refresh Token (токен обновления): Этот токен используется для получения нового access token, когда срок действия текущего истекает. Refresh token имеет более длительный срок действия и используется для поддержания сессии пользователя без необходимости повторной аутентификации.
Такой подход позволяет повысить безопасность, так как access token имеет ограниченный срок действия, а refresh token можно использовать для получения нового access token без необходимости повторного ввода учетных данных пользователя.
Ну и как же получить новую пару токенов на примере BLUM?
Для начала потребуется поймать refresh token в запросе от легального клиента (как это делать мы уже тут много раз обсуждали). Ну а дальше подрубать к программе, которая что-то у вас автоматизирует, функцию по автоматической обработке ошибки авторизации. Т.е. когда токен просрочен, программа должна послать запрос на получение новой пары, и дальше использовать уже её. Примерно так:
import requests
url = 'https://user-domain.blum.codes/api/v1/auth/refresh'
refresh_token = "NjleHAiOjE3MjYxNzGFC0quGFGPRiyv..."
headers = {
'Content-Type': 'application/json',
'Sec-Ch-Ua': '"Chromium";v="125", "Not.A/Brand";v="24"',
'Accept': 'application/json, text/plain, */*',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.6422.60 Safari/537.36',
'Sec-Ch-Ua-Platform': '"Windows"',
'Origin': 'https://telegram.blum.codes',
'Sec-Fetch-Site': 'same-site',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Dest': 'empty',
'Referer': 'https://telegram.blum.codes/',
'Accept-Language': 'en-US,en;q=0.9',
'Priority': 'u=1, i'
}
payload = {"refresh":refresh_token}
def get_tokens(url: str, headers: dict, data: dict) -> dict | int:
response = requests.post(url, headers=headers, json=data)
if response.status_code == 200:
result = response.json()
return result
return response.status_code
if __name__ == "__main__":
print(get_tokens(url, headers, payload))
Кстати, сейчас пишу API с полного нуля для проекта, в котором работаю (на FastAPI) и тоже подрубил аутентификацию, но пока классическую, с одним токеном. Однако после первых тестов, в самое ближайшее время, тоже внедрю обновляемую, чтобы хулиганы типа нас не баловались.637
Ребята и девчата, всем привет.
К сожалению сейчас немало времени уходит на разработку бэка для хороших людей (работодателя). Пилить контент пока не очень получается, приношу мегасорян.
По поводу автоклеймера мини игры в BLUM все вопросы видел, только что его почти полностью переписал. Вроде работает корректно и стало более юзерфрендли. Теперь с ним можно разобраться без бубна и алкоголя.
💾 GitHub BLUM_autoclaimer
637
На днях делал тестовое задание для второго в моей жизни собеса на должность разраба. Нужно было переписать OSINT приложение для сбора контактов телеграм по геолокации. А сегодня функцию "люди рядом", которую и эксплуатирует приложение, уже отключили.
Понятно, с чем это связано. И очень жаль, что европейская "свобода" убивает настоящую. Дурову желаю поскорее развалить все обвинения, покинуть свободную Францию и продолжить развивать telegram.
А по сути задания, если кому интересно, необходимо было вырезать весь графический интерфейс, весь мусор, прикрутить MongoDB, и взаимодействие через терминал. Так же написать докер файл и документацию.
Задание мне понравилось и выполнил его я в течение дня.
Результат тут.
Краткий предварительный итог по моим трём собесам:
1— ❌
2— ✔️
3— ✔️
Распыляться не хочется, поэтому резюме больше никуда не закидывал. Сейчас присмотримся друг к другу в этих местах, а там уже посмотрим, что и где буду пилить. Хочется хардкора какого-нибудь)
#FREEDUROV
637
По моему это была финальная версия бота. Он тригерился, если кнопка становилась активной (просто пиксель в нужной области становился нужного цвета).
import pyautogui
import keyboard
import time
work = False
index = 0
points = [(0, 0) for _ in range(2)]
points_color = [(0, 0, 0) for _ in range(2)]
def change_clicker():
global work
work = not work
if work:
print('\nКликер включен!')
else:
print('\nКликер выключен!')
def mouse_posotion():
global points
global index
x, y = pyautogui.position()
points[index] = (x, y)
screenshot = pyautogui.screenshot()
color = screenshot.getpixel((x, y))
points_color[index] = color
print(f'''Координаты точки: X: {x}, Y: {y}, color: {color}.''', end='\r')
index += 1
if index > 1:
index = 0
def clicker():
pyautogui.moveTo(points[0])
screenshot = pyautogui.screenshot()
color = screenshot.getpixel(points[0])
if color == points_color[0]:
pyautogui.click()
pyautogui.moveTo(points[1])
screenshot = pyautogui.screenshot()
color = screenshot.getpixel(points[1])
if color == points_color[1]:
pyautogui.click()
time.sleep(2)
pyautogui.press('f5')
pyautogui.scroll(200)
def main():
keyboard.add_hotkey('`', change_clicker)
keyboard.add_hotkey('=', mouse_posotion)
try:
while True:
if work:
clicker()
time.sleep(0.001)
except KeyboardInterrupt:
print('\nВыход из программы')
if __name__ == '__main__':
main()
Вывод: даже такие простые вещи могут делать вещи))637
Сегодня вспомнил, что мой дурацкий бот-автокликер должен же был что-то заработать во втором сезоне NFTmining.
Перешел в дискорд проекта, там как обычно кормят завтраками, но таблица тех, кого наградят, присутствует. Начал изучать, и не нашел себя. Пролистал еще несколько раз и оказалось, что я в топе лидеров по наградам.
Такого я, конечно, не ожидал. Приятно. Со дня на день должны насыпать кучку разных токенов.
Итого:
Написание бота ~ 10 минут.
Работа бота в десктоп режиме (пришлось выделить отдельный ноут, для взаимодействия бота с браузером) ~ несколько дней.
Электроэнергия ~ 0. Ноут работал с потухшим монитором, подзаряжал его несколько раз всего, поэтому траты электроэнергии несущественны.
Доход ~ несколько десятков тысяч рублей (уточню после дропа).
И да, можно было качнуть несколько аккаунтов, но проекту и создателям не верил вообще, заморачиваться не стал.
637
Сходил вчера на боевой собес в нормальную IT компанию на должность разраба. Случилось всё, чего боялся.
- Троил, как с большого бодуна.
- Обильно применял в речи несусветный бред, называл атомарность в требованиях ACID молекулярностью, и всё в этом духе.
- Нормальная речь вышла из чата, появились какие-то англицизмы, там где не надо.
- А в простом тестовом задании построил замок "If" и применил неработающий метод.
Не скажу, что понравилось чувствовать себя тупым, но сам собес понравился. Особенно когда техлид слушал ерунду с каменным лицом, сразу виден опыт общения с разными кандидатами. Длилось собеседование ровно час.
Безусловно, никаких иллюзий по поводу вакансии я не питаю, хотя официально меня в путешествие еще не отправили. И безмерно признателен за приглашение, которое кинул один хороший человек из чата этого канала. Мы тут познакомились больше года назад вообще на теме поездки в Тайланд. Сорян, что я не показал высший пилотаж)
Вывод: базу забывать нельзя, мозги на кодварс и литкод разминать необходимо, учиться, учиться, и еще раз учиться!
Задачка из собеседования: необходимо написать функцию, которая принимает список из не менее чем двух интов и возвращает одну из трёх строк, в зависимости от того, как отсортирован список. Если по возрастанию, одну строку, по убыванию- другую, не отсортирован- третью. Минимальная сложность алгоритма приветствуется.
637
Это сам хомяк (Эдуард Гуринович).
Запомните и никогда не давайте ему денег. Хотя он уже и не попросит))
