50 lines
6.1 KiB
Markdown
50 lines
6.1 KiB
Markdown
---
|
||
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 лет я поменял мнение, но главное правило осталось прежним: в одном проекте один стиль отступов, и следит за ним инструмент, а не человек.
|
||
|
||
Сейчас проект не поддерживается активно, но автор принимает пулл-реквесты. Если пользуетесь им, используйте только в рамках легальных пентестов и с согласия заказчика.
|