И получил несколько интервью по этому поводу!

В LinkedIn есть раздел под названием Люди, которых вы можете знать. Он находится на вкладке Моя сеть.

Это страница, которая предлагает людей, с которыми вы, возможно, захотите связаться.

Вы можете нажимать кнопки Подключиться, чтобы отправлять запросы на подключение людям из этого списка.

Я нашел эту страницу несколько лет назад и начал случайным образом добавлять туда людей. Я просто нажимал кнопку подключения для каждого человека, которого находил на этой странице.

Я просто подумал, что было бы полезно иметь много контактов в LinkedIn, чтобы получить работу, которую я хотел бы получить, например, стажировку инженера-программиста.

Но через некоторое время стало немного неудобно нажимать эти кнопки подключения вручную. Итак, я решил сделать бота, который будет нажимать кнопки за меня.

В этой статье рассказывается о том, как я создал этого бота, что в результате произошло и чему я научился.

Как я сделал бота

Инструменты, которые я использовал

Я сделал этого простого бота для добавления случайных людей в LinkedIn с помощью JavaScript и Greasemonkey.

Greasemonkey - это надстройка Firefox, которая помогает управлять пользовательским кодом JavaScript. Он позволяет вам настроить так, чтобы определенный набор кода запускался автоматически при открытии определенного URL-адреса.

Вы также можете хранить некоторые данные в Greasemonkey. Я использовал эту функцию, чтобы отслеживать количество людей, которых я добавил с помощью этого бота. Таким образом, я мог постоянно отслеживать это число, даже когда закрывал браузер или обновлял страницу.

Код, который я использовал

К сожалению, я не сохранил код, который использовал для создания своего бота, после того, как использовал его. Я сделаю все возможное, чтобы воссоздать его как можно точнее для этого произведения.

Изначально для создания этого фрагмента кода я использовал Google Chrome. Позже я переключился на Firefox, чтобы использовать Greasemonkey, о котором я упоминал ранее. Изначально я выбрал Chrome, потому что привык к нему.

А теперь давайте рассмотрим, как я бы сегодня создал этот код. Чтобы не усложнять, я покажу вам только основные функции этого бота: добавление людей. Я пропущу часть об использовании Greasemonkey для постоянного хранения данных.

(Пожалуйста, дайте мне знать в комментариях, если вы хотите, чтобы я осветил эту часть в отдельной статье).

Шаг 0: основы JavaScript

Если вы не знакомы с JavaScript, давайте быстро рассмотрим некоторые основы JavaScript.

Здесь мы собираемся использовать Google Chrome, но вы можете использовать любой браузер, который захотите.

Сначала откройте любой веб-сайт, например Google.com, а затем откройте там консоль JavaScript браузера. В Google Chrome это можно сделать несколькими способами. Вот как я обычно это делаю:

  • Щелкните правой кнопкой мыши в любом месте страницы.
  • Затем нажмите Проверить во всплывающем меню.

При щелчке по нему должно появиться такое окно:

Затем перейдите на вкладку Консоль, чтобы открыть консоль JavaScript:

Здесь вы можете ввести любой код JavaScript, чтобы проверить его. Вы можете использовать введенный код для взаимодействия со страницей, открытой в вашем браузере.

Например, попробуйте ввести следующий код в консоли и нажать клавишу ВВОД.

selected = document.querySelector('body');

Это выбирает тег body на странице, открытой в браузере. Затем он присваивает его новой переменной с именем selected.

В Chrome и Firefox для этого есть сокращение:

selected = document.querySelector('body');

Вместо этого вы можете просто написать это:

selected = $('body');

Этот код эквивалентен предыдущему.

Я собираюсь использовать это сокращенное обозначение со знаком доллара на протяжении всей статьи - просто чтобы код был коротким и простым.

Если вас не интересует код, который я собираюсь вам показать, можете перейти к концу, где я расскажу о том, что произошло, и о том, что я узнал из этого опыта.

Теперь давайте рассмотрим код нашего бота.

Шаг 1. Найдите целевой элемент

Во-первых, вам нужно написать фрагмент кода, который находит кнопки, которые вы хотите нажать.

Сначала войдите в LinkedIn. Затем перейдите на вкладку Моя сеть. В настоящее время он находится по адресу https://www.linkedin.com/mynetwork/ (июль 2018 г.).

Вы должны найти там раздел Люди, которых вы можете знать.

Затем в Chrome щелкните правой кнопкой мыши кнопку «Подключиться» у одного из рекомендованных там людей. Затем нажмите Проверить.

Элемент, на который вы только что нажали, будет выделен в окне разработчика.

Это HTML-код, выделенный синим цветом:

<span aria-hidden=”true”>Connect</span>

Это вкладка промежуток, на которой отображается текст: Подключить. На самом деле мы хотим нажать не на этот элемент, а на его родительский элемент, кнопку.

Вы можете найти его прямо над выбранным нами элементом span.

Давайте рассмотрим этот элемент кнопки:

<button data-control-name=”invite” class=”button-secondary-small” data-ember-action=”” data-ember-action-1596=”1596" data-is-animating-click=”true”>
 <span aria-hidden=”true”>Connect</span>
 <span class=”visually-hidden”>
 Invite Azul Pinochet Barros to connect
 </span>
</button>

Здесь много всего, но это важная часть:

<button data-control-name=”invite” ...>
 <span aria-hidden=”true”>Connect</span>
 ...
</button>

По сути, это элемент кнопки, атрибут data-control-name которого равен invite.

В нашем скрипте все, что нам нужно сделать, это выбрать такие элементы и щелкнуть по ним.

Вы можете выбрать эти элементы с помощью этого фрагмента кода:

selected = $(“button[data-control-name=invite]”);

Это читается так: Выберите все элементы кнопки, у которых data-control-name равно invite.

ПРИМЕЧАНИЕ. Похоже, на веб-сайте LinkedIn используется jQuery. Таким образом, приведенная выше нотация на самом деле является селектором jQuery, не вспомогательной функцией, определенной Chrome. Как ни странно, их поведение немного отличается.

В любом случае, как только вы запустите этот код в консоли Chrome, вы увидите, что были выбраны правильные элементы.

Теперь, используя этот фрагмент кода - selected = $("button[data-control-name=invite]"); ваш браузер находит несколько элементов кнопки и помещает их в массив. Чтобы выбрать первый, вы можете просто выбрать первый элемент в этом массиве, например:

toClick = $("button[data-control-name=invite]")[0];

Затем вы можете щелкнуть по нему так:

toClick.click();

Если это произойдет, вы должны увидеть всплывающее окно подтверждения.

Шаг 2: Прохождение нескольких целевых элементов

Следующий шаг - перебрать несколько целевых элементов, чтобы мы могли добавить несколько человек.

Поэкспериментировав, я понял, что есть более простой способ выбрать несколько кнопок и перебрать их, чем тот, который я показал ранее.

Во-первых, используйте Inspect Element, чтобы еще немного проанализировать структуру этой страницы. Вы должны увидеть, что люди, которых вы, возможно, знаете , представляют собой просто неупорядоченный список.

Вы должны найти такой код:

Родительский элемент - это элемент ul (неупорядоченный список). Его дочерние элементы - это элементы li (элемент списка).

Каждый элемент li представляет каждую из карточек людей, которых вы можете знать, которые вы видите на экране.

Выбирая эти li элементы вместо прямого выбора кнопок, на самом деле становится проще работать с несколькими людьми.

Вы можете выбрать этот ul элемент, родительский для li элементов, следующим образом:

ul = $('ul.mn-pymk-list__cards')[0];

Здесь говорится: «выберите элемент ul с классом ul.mn-pymk-list__cards». Нам нужно добавить [0] в конце, потому что исходный результат - это массив, содержащий единственный элемент.

Вы можете выбрать первый элемент li (карточка первого лица) под элементом ul следующим образом:

firstLi = ul.querySelector('li');

Нам не нужно добавлять [0] в конце этого оператора, потому что функция querySelector() возвращает только один элемент.

Затем из firstLi вы можете выбрать кнопку, которую нам нужно нажать, например:

buttonToClick = firstLi.querySelector("button[data-control-name=invite]");

После нажатия этой кнопки с buttonToClick.click() мы должны удалить этот элемент li, чтобы мы могли перейти к следующему элементу li (карточке следующего человека). Мы можем сделать это так:

ul.removeChild(firstLi);

Собрав их все вместе и поместив все в цикл while, вы получите что-то вроде этого:

ul = $('ul.mn-pymk-list__cards')[0];
firstLi = ul.querySelector('li');
while(firstLi){ // do this while firstLi still exists.
  buttonToClick = firstLi.querySelector("button[data-control-name=invite]");
  ul.removeChild(firstLi);
  firstLi = ul.querySelector('li');
}

Этот код должен работать, но в нем есть несколько проблем.

  • Мы добавляем людей с его помощью очень быстро, поэтому будет сложно понять, что происходит, когда вы запустите этот код.
  • Мы не отслеживаем, сколько людей мы добавили.
  • Мы предполагаем, что buttonToClick всегда является правильной кнопкой, которую нужно нажимать. Иногда на этой кнопке отображается текст «Пригласить» вместо «Подключиться». Мы не хотим нажимать слишком много кнопок «Пригласить».

Шаг 3. Уточните наш код

Я исправил все проблемы, о которых упоминал выше, и собрал относительно простой фрагмент кода.

Это также здесь на Gist. Возможно, там легче читать.

// this function allows us to stop our code for |ms| milliseconds.
function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}
// I've put our main code into this function.
async function addPeople() {
  ul = $('ul.mn-pymk-list__cards')[0];
  firstLi = ul.querySelector('li');
  count = 0; // this is the count of how many people you've added
  while(firstLi && count < 100){ // stop after adding 100 people
    buttonToClick = firstLi.querySelector("button[data-control-name=invite]");
    // make sure that this button contains the text "Connect"
    if (buttonToClick.innerText.includes("Connect")){
      buttonToClick.click();
      count += 1;
      console.log("I have added " + count + " people so far.");
    }
    ul.removeChild(firstLi);
    await sleep(1000); // stop this function for 1 second here.
    firstLi = ul.querySelector('li');
  }
}
addPeople();

Если вы внимательно изучите этот код, вы, вероятно, заметите пару изменений, которые я внес:

  • Я поместил наш код в функцию async под названием addPeople(). В этой функции каждый раз, когда мы добавляем кого-то, мы останавливаемся на секунду с функцией sleep(). Подробнее об этом шаблоне здесь.
  • Я добавил count переменную, чтобы отслеживать, сколько людей мы добавили.
  • Я добавил это выражение if: if (buttonToClick.innerText.includes("Connect"){...}. Таким образом, мы можем убедиться, что кнопка, которую мы нажимаем, содержит в себе слово «Подключиться».

Когда я запускаю исправленный код, он выглядит так:

Шаг 4. Внесите дальнейшие улучшения!

Помимо того, что я показал выше, у меня было еще несколько функций, когда я фактически использовал своего бота, чтобы добавить группу людей в LinkedIn.

Прежде всего, я использовал Greasemonkey, о котором упоминал ранее, чтобы отслеживать общее количество добавленных людей.

Кроме того, чтобы не быть обнаруженным LinkedIn как бот, я добавил несколько вещей:

  • Я произвел случайный порядок, в котором добавлял людей.
  • Я произвольно выбрал время ожидания каждый раз, когда добавляю нового человека.

Я оставлю все это в качестве упражнений для вас, если вы заинтересованы в их решении!

Что случилось

Со своим скриптом я добавил 2000+ подключений. Затем, если я правильно помню, около 400 из них добавили меня.

В результате я перешел от 300 подключений к 700+ за неделю или около того!

Затем LinkedIn запретил мне добавлять людей. Я не знал, что меня могут забанить! Я немного испугался, но примерно через пару месяцев запрет сняли.

Что еще более важно, я смог получить несколько интервью от этих 400+ новых знакомых. Одно из интервью было с компанией Palantir.

Вот скриншот сообщения, которое я получил от них:

Что я узнал из этого опыта

В то время я думал, что то, что я делаю, было довольно глупо, но в итоге я многому научился.

Вывод # 1

Во-первых, я понял, что LinkedIn действительно работает для получения работы. В конце концов, я смог пройти несколько собеседований со своим ботом.

Затем, через некоторое время, я также понял, что добавление тысяч случайных людей было не самым эффективным способом использования LinkedIn. При таком подходе вы добавляете много ненужных людей.

Итак, я изменил свой подход на более сфокусированный.

С моим новым подходом я бы добавил рекрутеров только тех компаний, в которых хотел бы работать. Тогда я отправлял сообщения только тем людям, которые добавили меня.

Это оказалось гораздо более целенаправленной и эффективной стратегией для LinkedIn. Благодаря этой стратегии я смог пройти еще несколько собеседований с несколькими технологическими компаниями, включая Yelp и Xamarin. На этот раз мне не пришлось добавлять тысячи новых подключений, чтобы добиться результата!

ПРИМЕЧАНИЕ: я больше говорю о стратегии в этой статье, на всякий случай, если вам это интересно.

Вывод # 2

Развлечение - лучший способ отточить свои навыки программирования!

Благодаря этому конкретному проекту я смог отточить свои навыки JavaScript. Я узнал, в том числе:

  • Как установить временной интервал между выполнениями функций
  • Как выбрать определенные элементы HTML с помощью JavaScript
  • Как хранить данные локально с Greasemonkey

Я узнал эти вещи в рамках этого проекта, и мне совсем не хотелось учиться, потому что это было так весело!

Вывод # 3

Из этого опыта я понял, что иногда стоит сделать что-нибудь странное. Не бойтесь быть немного озорным и предприимчивым, если у вас есть к этому склонность!

Даже после этого небольшого эксперимента я продолжал делать странные вещи для развлечения.

Например, когда я стажировался в Microsoft, я провел небольшой эксперимент, в котором «украл» кучу паролей сотрудников. Я сделал это, отправив фишинговое письмо. Предполагалось, что это будет огромная розыгрыш призов, таких как ноутбуки Xbox и Surface. Это был мой проект на хакатоне!

Я также завел канал на YouTube для обучения программированию и в конце концов решил поработать над ним на постоянной основе и бросить свою постоянную работу инженера-программиста.

Возможно, все это показалось другим людям немного странным. Но каждый раз, когда я проходил через каждый из этих опытов, я узнавал что-то новое и получал массу удовольствия на этом пути. Я бы сказал, что последний сделал мою карьеру.

Так что не бойтесь попробовать что-нибудь странное просто для удовольствия! По пути вы можете узнать что-то ценное.

Спасибо, что прочитали эту статью!