Как я создал бота для добавления контактов в LinkedIn – и действительно получил несколько интервью с ним

kak ya sozdal bota dlya dobavleniya kontaktov v linkedin –?v=1656573262

Ю.К. Сугги

На LinkedIn есть раздел под названием «Люди, которых вы можете знать». Это под Моя сеть табл.

0*ТАОБ-11БмЕжХС-1б

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

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

1*OlQUSAu7j9W1waNDevacKg

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

Я просто подумал, что может быть полезно иметь много связей в 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 это можно сделать несколькими способами.

Обычно я это делаю следующим образом:

  • Щелкните правой кнопкой мыши в любом месте страницы.
  • Затем нажмите Осмотреть из появившегося меню.
1*RnSqub0Ljw3asxj5hi-UBg
  • Когда вы щелкните его, должно появиться окно, подобное ниже.
1*EdFB6fMXV9FLv9x-TQZFRw
  • Затем нажмите кнопку консоль вкладку там, чтобы показать консоль JavaScript.
  • После того, как вы щелкните на консоль на вкладке вы должны увидеть консоль JavaScript.
1*ExR9I9a7O6yfk4-5JB3Dxg

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

Например, введите следующий код на консоли и нажмите Enter.

selected = document.querySelector('body');

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

В Chrome и Firefox существует сокращение для:

selected = document.querySelector('body');

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

selected = $('body');

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

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

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

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

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

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

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

Сначала войдите в LinkedIn. Затем перейдите на вкладку Моя сеть. Сейчас это (июль 2018).

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

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

1*QNH8JeKcFlNNcSRDlJ7k3g

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

1*1s3975-NyQ4UEE4_RjGmvg

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

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

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

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

1*mFx3ou-b4BjE9iTQz00sCw

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

<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>

По сути это элемент кнопки, атрибут которого, Имя-контроль данныхесть «пригласить».

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

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

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

Это означает, что выберите все элементы кнопки, имя элемента управления данными – «пригласить».

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

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

1*gkmjHPk7wCgX5BsoXIWb9w
Таким образом, вы можете убедиться, что выбраны правильные элементы.

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

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

Затем вы можете нажать его с помощью этого:

toClick.click();

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

1*mGV1IV56IA17NFDx6JfAEA
Окно подтверждения, которое появляется при нажатии одной из кнопок подключить кнопки

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

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

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

Вот как бы это я сделал.

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

Вы должны найти код, который выглядит так:

1*EgTc1y_-qQXvC_UcJw2UGQ

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

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

1*XnIgeADO5OUKj3YFlQ1ePw

Выбрав эти 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');}

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

  1. Добавляем людей действительно быстро с этим, поэтому будет трудно знать, что происходит, когда вы запускаете этот код.
  2. Мы не отслеживаем, сколько людей мы прибавили.
  3. Мы это предполагаем 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();

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

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

С этими изменениями, когда я запускаю этот код, он выглядит так:

Шаг 4: Сделайте дальнейшие улучшения!

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

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

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

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

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

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

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

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

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

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

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

1*u7fIRKAxBAk8rJTFeqyrXw

Чему я научился по этому опыту

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

Вынос №1

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

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

Поэтому после этого опыта я изменил свой подход к более целенаправленному.

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

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

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

Вынос №2

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

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

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

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

Вынос №3

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

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

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

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

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

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

Ладно, это все для этой статьи.

Это должно быть веселой статьей, но я обычно пишу о более серьезных вещах.

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

Не стесняйтесь проверять их. Все они здесь на Medium.

Кроме того, как всегда, если у вас возникли вопросы по этому или чему-то другому, пожалуйста, дайте мне знать в комментариях ниже или в Instagram или Twitter (@ykdojo на обоих).

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *