- type: group
steps:
- type: say
message: ⚠️ Sorry, this doesn't seem to be a LinkedIn profile page.
- type: stop
condition:
- '{{url}} =~ ^(?!https:\/\/www\.linkedin\.com\/in\/[\w\-]+\/?).*$'
- type: js
args: ''
code: |-
const result = (() => {
const selectors = {
name: 'h1',
status: '.text-body-medium.break-words',
location: '.text-body-small.inline.t-black--light.break-words',
contact: 'section.pv-top-card--website a',
about: '#about ~ .display-flex span',
experience: '#experience + div + div',
education: '#education + div + div',
language: '#languages + div + div'
};
const getListContent = (container) => {
if (!container) return null
return Array.from(container.querySelectorAll('.artdeco-list__item'))
.map(item => {
const clone = item.cloneNode(true);
clone.querySelectorAll('.visually-hidden').forEach(el => el.remove());
return clone.textContent
.replace(/\s+/g, ' ')
.replace(/\n\n+/g, '\n')
.trim();
});
};
const result = {
name: document.querySelector(selectors.name)?.textContent.trim(),
url: window.location.href,
status: document.querySelector(selectors.status)?.textContent.trim(),
location: document.querySelector(selectors.location)?.textContent.trim(),
contact: document.querySelector(selectors.contact)?.href || null,
about: document.querySelector(selectors.about)?.textContent.trim(),
experience: getListContent(document.querySelector(selectors.experience)),
education: getListContent(document.querySelector(selectors.education)),
language: getListContent(document.querySelector(selectors.language))
};
return result;
})();
return result;
param: profile
timeout: 15000
- type: say
message: |-
JSON:
{{profile}}
This automation command is created by a community member. HARPA AI team does not audit community commands.
Please review the command carefully and only install if you trust the creator.
All rights reserved © HARPA AI TECHNOLOGIES LLC, 2021 — 2025
Designed and engineered in Finland 🇫🇮