Вакансия «Backend-разработчик (ВКонтакте для бизнеса)» в Москве, работа в компании «VK» — Хабр Карьера
Требования
Бэкенд разработчик, Старший (Senior) • PHP • Laravel • Symfony • Yii framework • Высоконагруженные системы • Базы данных • ООП • Разработка программного обеспечения
Местоположение и тип занятости
Москва • Полный рабочий день • Можно удаленно
Компания
Место встречи лучших
Описание вакансии
Сейчас мы в поиске backend-разработчиков в команды Маркет и Ликвидность.
Маркет – это полноценная e-commerce площадка внутри социальной сети ВКонтакте, где можно найти любимые товары от крупных и локальных брендов. Наша команда ежедневно совершенствует опыт покупателей и разрабатывает механики для безопасных и комфортных покупок с учетом геолокации, персональных рекомендаций, отзывов и рейтингов.
Команда Ликвидности занимается развитием и увеличением активных бизнес-сообществ в социальной сети ВКонтакте, помогает расти бизнесу и уменьшать операционные расходы за счет алгоритмов продвижения, поиска точек роста ликвидности, умных настроек ленты и поиска. Автораспознавание, рост базы товаров и числа контактов, NPS со стороны бизнеса и покупателей – наша командная задача. Кроме этого, наша команда активно взаимодействует с другими направлениями – Видео, Лентой, Таргетом, поэтому у нас ты найдешь широкий простор для развития и интересных задач.
Стек технологий: KPHP (PHP 7.4), Golang, MongoDB, MeowDB, Kafka, Tarantool.
Тебе предстоит:
- работать с большим объемом данных;
- проектировать и реализовывать серверную часть продукта;
- создавать гибкие API-методы для мобильных приложений и сервисов наших партнеров;
- взаимодействовать с коллегами из других компаний и вместе строить комплексные продуктовые связки из фич;
- участвовать в оценке и реализации продуктовых решений, которыми в течение пары недель начнут пользоваться реальные люди.
Мы ждем от тебя:
- умение собирать требования к задачам и самостоятельно принимать решения при разработке;
- знание элементарных структур данных и алгоритмов;
- знание азов сетевых протоколов передачи данных;
- стремление соблюдать принципы SOLID, когда пишешь код;
- навыки чтения чужого кода, способность коротко задавать вопросы и ясно выражать мысли.
Работа в VK — это:
- возможность создавать продукты и сервисы, которые меняют к лучшему жизнь миллионов пользователей;
- амбициозные задачи, масштабные проекты и возможности для профессионального роста;
- совместные интересы и увлечения: помогаем раскрывать таланты и отлично проводить свободное время;
- работа в команде профессионалов из разных сфер, которые всегда готовы поделиться опытом;
- программа благополучия: заботимся о здоровье и хорошем самочувствии сотрудников.
Мы будем рады твоему отклику и, при обоюдном интересе, предложим условия и проекты, от которых не захочется отказываться.
Смотреть ещё вакансии
Weekend Offer VK
Weekend Offer в VK — шанс попасть в команду профессионалов всего за одни выходные
ВКонтакте — крупнейшая социальная сеть в России и странах СНГ.
Наша миссия — соединять людей, сервисы и компании, создавая простые и удобные инструменты коммуникации.
-
Android
узнать больше о командах - узнать больше о командах
-
BackEnd
узнать больше о командах
(C++)
-
Команда разработки движков
Движки — это специализированные базы данных: ВКонтакте использует их, чтобы хранить всю информацию, которую загружают пользователи на сайт. Сотни петабайт фото и аудио, миллиарды постов, комментариев и сообщений ежедневно, рекламные объявления — это и не только мы бережно размещаем на эффективных и надёжных системах хранения.
-
Мы любим выжимать максимум производительности из своего кода, думаем о свойствах системы в целом и делаем решения, которые легко использовать и масштабировать.
-
- Разрабатывать специализированные структуры данных и алгоритмы.
- Заниматься оптимизацией на системном и прикладном уровне.
- Участвовать в проектировании новых систем.
- Работать над механизмами надёжности и масштабируемости решений.
-
Мы каждый день сталкиваемся со сложными проблемами и постоянно ищем оптимальные решения. Разрабатываем собственные технологии — они учитывают природу данных, с которыми мы работаем. Если вы хотели поработать в сердце высоконагруженной системы, мы сработаемся.
-
- C++ 17/20.
- Make или CMake.
- GCC или Clang.
- Инструменты Unix.
- C++ 17/20.
-
Как проходит Weekend Offer?
-
21 февраля — 10 марта
Первая встреча
После рассмотрения откликов мы пригласим кандидатов с подходящим опытом на первый звонок — он займёт 15–30 минут.
Коротко расскажем о командах и проведём небольшой технический скрининг. Если всё пройдёт успешно, позовём на технический этап в субботу. По времени для встречи будем договариваться в пятницу, 10 марта. -
11 марта
Детальное знакомство
С 10:00 по Москве выступят руководители направлений и команд.
На общей онлайн-встрече вы узнаете про процессы и задачи, которые предстоит решать, и получите ответы на вопросы.
С 11:00 до 19:00 пройдут индивидуальные технические онлайн-собеседования, пообщаемся с вами в заранее назначенное время.
-
12 марта
Финальное собеседование
Вы сможете пообщаться с понравившимися командами, узнать больше о предстоящих вызовах и получить ответы на вопросы. Встречи будут проходить с 11:00 до 18:00.
Отправляйте ваши отклики до 9 марта включительно
Выберите направление
«»» | |
VK.com OpenAPI, OAuth3 и Iframe серверные части приложения OAuth3, документы по адресу: | |
https://python-social-auth.![]() | |
«»» | |
импорт json | |
из hashlib импорта md5 | |
от времени импорта времени | |
из ..exceptions import AuthException, AuthTokenRevoked | |
из ..utils import parse_qs | |
из .base импорта BaseAuth | |
из импорта .oauth BaseOAuth3 | |
класс ВКонтактеOpenAPI(BaseAuth): | |
«»»Бэкенд аутентификации VK.![]() | |
имя = «vk-openapi» | |
ID_KEY = «id» | |
по определению get_user_details (я, ответ): | |
«»»Вернуть данные пользователя из запроса ВКонтакте»»» | |
псевдоним = response.get(«псевдоним») или «» | |
полное имя, имя_имя, фамилия_имя = self.get_user_names( | |
first_name=response.get(«first_name», [«»])[0], | |
last_name=response.![]() | |
) | |
возврат { | |
«имя пользователя»: response[«id»] если len(псевдоним) == 0 иначе псевдоним, | |
«электронная почта»: «», | |
«полное имя»: полное имя, | |
«имя_имя»: имя_имя, | |
«last_name»: фамилия, | |
} | |
def user_data (я, access_token, * args, ** kwargs): | |
вернуть self.![]() | |
деф auth_html(я): | |
«»»Возвращает локальную страницу аутентификации ВКонтакте, не требуется для | |
ВК для аутентификации. | |
«»» | |
ктх = { | |
«VK_APP_ID»: self.setting(«APP_ID»), | |
«VK_COMPLETE_URL»: self.redirect_uri, | |
} | |
local_html = self.setting(«LOCAL_HTML», «vkontakte.html») | |
возврат self.![]() | |
по определению auth_complete(self, *args, **kwargs): | |
«»»Выполняет проверку авторизации в ВКонтакте, возвращает User if | |
удалось»»» | |
session_value = self.strategy.session_get(«vk_app_» + self.setting(«APP_ID»)) | |
, если «id» не в self.data или не в session_value: | |
поднять ValueError(«Аутентификация ВКонтакте не завершена») | |
сопоставление = parse_qs (значение_сеанса) | |
![]() | |
элемент + «=» + сопоставление [элемент] для элемента в [«expire», «mid», «secret», «sid»] | |
) | |
Ключ | , секрет = self.get_key_and_secret() |
хеш = md5((check_str + secret).encode(«utf-8»)).hexdigest() | |
, если хэш != отображение[«sig»] или int(mapping[«expire»]) < time(): | |
поднять ValueError («Ошибка аутентификации VK.com: неверный хэш») | |
kwargs.update({«backend»: self, «response»: self.![]() | |
вернуть self.strategy.authenticate(*args, **kwargs) | |
деф использует_перенаправление (я): | |
«»»VK.com не требует посещения URL сервера для заказа | |
для аутентификации, поэтому методы auth_xxx вызывать не нужно. | |
Их текущая реализация является просто примером»»» | |
возврат Ложь | |
класс VKOAuth3 (BaseOAuth3): | |
«»»Бэкенд аутентификации VKOAuth3″»» | |
имя = «vk-oauth3» | |
ID_KEY = «id» | |
AUTHORIZATION_URL = «https://oauth.![]() | |
ACCESS_TOKEN_URL = «https://oauth.vk.com/access_token» | |
ACCESS_TOKEN_METHOD = «ПОСТ» | |
EXTRA_DATA = [(«id», «id»), («expires_in», «expires»)] | |
по определению get_user_details (я, ответ): | |
«»»Вернуть данные пользователя из аккаунта ВКонтакте»»» | |
полное имя, имя_имя, фамилия_имя = self.get_user_names( | |
first_name=response.get(«first_name»), last_name=response.get(«last_name») | |
) | |
возврат { | |
«имя пользователя»: response.![]() | |
«электронная почта»: response.get(«электронная почта», «»), | |
«полное имя»: полное имя, | |
«имя_имя»: имя_имя, | |
«last_name»: фамилия, | |
} | |
def user_data (я, access_token, * args, ** kwargs): | |
«»»Загружает данные пользователя из службы»»» | |
запрос_данные = [ | |
«имя», | |
«фамилия», | |
«имя экрана», | |
«псевдоним», | |
«фото», | |
] + self.![]() | |
полей = «,».join(set(request_data)) | |
данные = vk_api( | |
себя, | |
«users.get», | |
{ | |
«access_token»: access_token, | |
«поля»: поля, | |
}, | |
) | |
, если данные и data.![]() | |
ошибка = данные[«ошибка»] | |
msg = error.get(«error_msg», «Неизвестная ошибка») | |
, если error.get(«код_ошибки») == 5: | |
поднять AuthTokenRevoked(я, сообщение) | |
иначе: | |
поднять AuthException (я, сообщение) | |
, если данные: | |
данные = data.get(«ответ»)[0] | |
data[«user_photo»] = data.get(«photo») # Обратная совместимость | |
возврат данных или {} | |
класс VKAppOAuth3 (VKOAuth3): | |
«»»Поддержка аутентификации приложений VK.![]() | |
имя = «вк-приложение» | |
по определению auth_complete(self, *args, **kwargs): | |
required_params = («is_app_user», «viewer_id», «access_token», «api_id») | |
, если не все (параметр в self.data для параметра в required_params): | |
возврат Нет | |
auth_key = self.data.get(«auth_key») | |
# Проверить подпись, если она есть | |
Ключ | , секрет = self.![]() |
, если ключ_авторизации: | |
check_key = md5( | |
«_».join([key, self.data.get(«viewer_id»), секрет]).encode(«utf-8») | |
).hexdigest() | |
, если check_key != auth_key: | |
поднять ValueError(«Аутентификация ВКонтакте не удалась: неверный » «ключ авторизации») | |
user_check = self.setting(«РЕЖИМ ПОЛЬЗОВАТЕЛЯ») | |
user_id = self.data.get(«viewer_id») | |
, если user_check не None: | |
user_check = int(user_check) | |
, если user_check == 1: | |
is_user = self.![]() | |
Элиф user_check == 2: | |
is_user = vk_api(self, «isAppUser», {«user_id»: user_id}).get( | |
«ответ», 0 | |
) | |
, если не int(is_user): | |
возврат Нет | |
auth_data = { | |
«авторизация»: сам, | |
«бэкенд»: сам, | |
«запрос»: self.![]() | |
«ответ»: { | |
self.ID_KEY: user_id, | |
}, | |
} | |
auth_data[«ответ»].update( | |
json.loads(auth_data[«запрос»][«api_result»])[«ответ»][0] | |
) | |
возврат self.strategy.authenticate(*args, **auth_data) | |
def vk_api (серверная часть, метод, данные): | |
«»» | |
Вызывает метод OpenAPI ВКонтакте, проверка: | |
https://vk.![]() | |
http://goo.gl/yLcaa | |
«»» | |
# Нам нужно выполнить вызов на стороне сервера, если нет access_token | |
data[«v»] = backend.setting(«API_VERSION», «5.131») | |
, если «access_token» отсутствует в данных: | |
Ключ | , секрет = backend.get_key_and_secret() |
, если «api_id» отсутствует в данных: | |
данные[«api_id»] = ключ | |
данные[«метод»] = метод | |
данные[«формат»] = «json» | |
URL = «https://api.![]() | |
param_list = sorted(list(item + «=» + data[item] для элемента данных)) | |
data[«sig»] = md5((«».join(param_list) + secret).encode(«utf-8»)).hexdigest() | |
иначе: | |
url=»https://api.vk.com/method/» + метод | |
попытка: | |
вернуть backend.get_json(url, params=data) | |
кроме (TypeError, KeyError, OSError, ValueError, IndexError): | |
возврат Нет |
вк-запросы
vk. com — крупнейшая социальная сеть в России.
Требования
- питон (2.7, 3.4, 3.5, 3.6)
ПРИМЕЧАНИЕ. Python 2.7 больше не будет поддерживаться, начиная с версии 2.0.0
Установить
pip install vk-запросы
Использование и функции
Простые запросы
# Возвращает список пользователей api.users.get(users_ids=1) # Возвращает список друзей пользователя с дополнительными полями api.friends.get(user_id=1, fields=['псевдоним', 'город']) # Возвращает список результатов из вашего пользовательского метода API api.execute.YourMethod(**method_params)
Токен пользователя с логином и паролем
Подходит для варианта использования, когда вы запускаете запросы из одного на серверной части из одной из ваших учетных записей
импорт vk_requests API = vk_requests.create_api(app_id=123, логин='Пользователь', пароль='Пароль') api.users.get(user_ids=1) [{'first_name': 'Павел', 'last_name': 'Дуров', 'id': 1}]
Использование токена службы
Токен службы предпочтительнее, так как он не требует учетные данные и запросы oauth, но не все методы могут быть вызваны с сервисным токеном (например, выполнить нельзя)
API = vk_requests.create_api(service_token="{YOUR_APP_SERVICE_TOKEN}") ...
Дополнительные сведения о токене службы.
Использование маркера доступа клиента
Например, когда вы получили токен на стороне клиента (неявный поток) и хотите запросить API на стороне сервера.
Используйте параметр service_token
, как в примере выше.
Токен пользователя с client_secret (прямая авторизация)
Доверенные приложения могут получить неограниченное количество access_token
для доступа к API, передав идентификатор приложения, имя пользователя, пароль и client_secret
— секретный ключ вашего приложения.
API = vk_requests.create_api(app_id=123, логин='Пользователь', пароль='Пароль', client_secret="{ВАШЕ_ПРИЛОЖЕНИЕ_КЛИЕНТ_СЕКРЕТ}") ...
Дополнительная информация о прямой авторизации.
Использование пользовательских параметров
Область действия или версия API
Просто передайте область действия
и/или api_version
параметры, такие как
API = vk_requests.create_api(..., scope=['offline', 'status'], api_version='5.00') api.status.set(text='Привет, мир!')
Параметры HTTP
Чтобы переопределить параметры http запросов (например, параметры ssl),
просто используйте http_params
следующим образом:
API = vk_requests.create_api(http_params={'timeout': 15, 'verify': False})
Использование HTTP-прокси
Чтобы использовать прокси-сервер, просто передайте его в http_params
, например
прокси = { 'http': 'http://10.10.1.10:3128', 'https': 'http://10.10.1.10:1080', } API = vk_requests.create_api(http_params={'прокси': прокси})
Дополнительные сведения см. в документации по запросам
.Включить ведение журнала
Чтобы включить ведение журнала библиотеки в вашем проекте, вы должны сделать следующее:
ведение журнала импорта # Настраиваем базовую конфигурацию ведение журнала.basicConfig( уровень = logging.INFO, format='%(asctime)s %(имя уровня)s [%(имя)s] %(сообщение)s', ) # Чтобы изменить уровень журнала для библиотечного регистратора logging.getLogger('vk-requests').setLevel(logging.DEBUG)
Автоматическое разрешение конфликтов при получении доступа из необычного места
Просто передайте свой номер телефона во время инициализации API. В случае проверки безопасности это будет обработано автоматически, иначе будет запрошен ввод консоли
API = vk_requests.create_api( app_id=123, логин='Пользователь', пароль='Пароль', phone_number='+734567')
Интерактивный сеанс
Интерактивный сеанс позволяет управлять параметрами входа в систему во время выполнения.
Полезно, если
- Требуется аутентификация 2FA
- Требуется CAPTCHA
- Для тестирования
Использование
API = vk_requests.create_api(..., интерактивный=Истина)
Если вы не передадите логин, пароль и app_id вас попросят подсказать, т.е. имея это
API = vk_requests.create_api(app_id=XXX, логин='***', пароль='***', интерактивный=True)
Вам будет предложено ввести только Двухфакторную аутентификацию или капчу код при необходимости
API потоковой передачи
Streaming API позволяет подписаться на события из вк.
ПРИМЕЧАНИЕ. Только для python 3.4 и выше
Установить
pip install vk-запросы [стриминг]
Правила потоковой передачи
из vk_requests.streaming import StreamingAPI streaming_api = StreamingAPI(service_token="{YOUR_SERVICE_TOKEN}") # Добавить новое правило streaming_api.add_rule (значение = 'my_keyword', тег = 'tag1') # Получить все правила правила = streaming_api.get_rules() # Удалить правило по тегу streaming_api.remove_rule (тег = 'тег1')
Потребитель
Streaming API предоставляет удобный интерфейс обработчика на основе сопрограммы (обратный вызов)
асинхронный импорт из vk_requests импортировать StreamingAPI API = StreamingAPI(service_token="{YOUR_SERVICE_TOKEN}") поток = api.get_stream() @stream.consumer @asyncio.coroutine def handle_event (полезная нагрузка): печать (полезная нагрузка) если __name__ == '__main__': поток.потребить()
Официальная документация API
- https://vk.