--- title: "Как я контрибьютил в Social Mapper" date: 2026-10-10T20:03:56+04:00 draft: false tags: - open-source - python - osint - selenium summary: "Два пулл-реквеста в OSINT-инструмент на 4000 звезд: починил Douban и перевел весь проект на пробелы" --- Разбирал старые аккаунты и наткнулся на свой след в [Social Mapper](https://github.com/Greenwolf/social_mapper). Это OSINT-инструмент Джейкоба Уилкина (Greenwolf): он ищет людей по соцсетям и через распознавание лиц склеивает профили одного человека с разных сайтов в один отчет. Его используют пентестеры и red team, чтобы собрать список сотрудников компании и их страниц. У репозитория больше 4000 звезд и 800 форков. В сентябре 2020 года я прислал туда 20 коммитов в двух пулл-реквестах и до сих пор числюсь третьим по количеству коммитов, после двух аккаунтов самого автора. Расскажу, что там было. ## Douban Все началось с [issue #166](https://github.com/Greenwolf/social_mapper/issues/166). Китайская соцсеть Douban перестала работать: модуль падал с HTTP 418 и было непонятно, залогинился он или нет. Issue висел с апреля, автор ответил, что сайт, похоже, поменялся, но проверить не может, потому что не нашел, где там регистрироваться. Social Mapper работает через Selenium и Firefox, так что для меня это была знакомая территория. Douban поменял заголовок страницы и форму входа, а модуль искал старые. В [PR #193](https://github.com/Greenwolf/social_mapper/pull/193) я: - поправил вход под новую форму и проверку заголовка - добавил понятное сообщение, если страница входа загрузилась не так, как ожидается, вместо молчаливого падения - вынес пути к Firefox и geckodriver в переменные окружения `FIREFOX_BINARY` и `GECKODRIVER`, чтобы не держать их строго в `PATH` - починил несколько ошибок Python 3 с `bytes` и `str` при чтении и записи файлов, которые остались после перехода с Python 2 Самое забавное, что у меня тоже не было аккаунта на Douban, поэтому проверить вход до конца я не мог. Попросил автора issue склонировать мой форк и переключиться на ветку с фиксом. Пока PR ждал ревью, автор запушил пачку своих исправлений и пропустил мой. Извинился и попросил перевыложить. Я разрешил конфликты, через день напомнил о себе, и 9 сентября PR влили. ## Табы и пробелы Пока разбирался в коде, заметил, что `social_mapper.py` написан с отступом в 4 пробела, а остальные модули табами. В Python это не косметика: смешанные отступы ломают код или, что хуже, делают его обманчивым. Завел [issue #195](https://github.com/Greenwolf/social_mapper/issues/195) и сразу прислал [PR #196](https://github.com/Greenwolf/social_mapper/pull/196): - весь проект переведен на 4 пробела, как рекомендует PEP 8 - строковые литералы, которые использовались вместо комментариев, заменены на нормальные комментарии - код отформатирован по PEP 8, лишние импорты удалены - добавлены `.gitignore` и `.editorconfig` Итого 11 файлов, +1657 и −1430 строк. Автор влил его в тот же день, написал, что я, похоже, вошел в раж, и спросил, нет ли у меня идей, как обойти новый rate limit Facebook. А еще добавил меня в список благодарностей в README, где я и вишу до сих пор. ## Что я из этого вынес Чужой открытый проект оказался отличным местом, чтобы потренироваться читать незнакомый код и общаться с мейнтейнером. Маленький точечный фикс, который решает чью-то проблему, принимают охотно. А после него можно предлагать и что-то крупнее, вроде рефакторинга всего проекта. И да, сейчас в моих [Стандартах разработки](/code-style.md) записаны табы вместо пробелов. Спустя 6 лет я поменял мнение, но главное правило осталось прежним: в одном проекте один стиль отступов, и следит за ним инструмент, а не человек. Сейчас проект не поддерживается активно, но автор принимает пулл-реквесты. Если пользуетесь им, используйте только в рамках легальных пентестов и с согласия заказчика.