-
Notifications
You must be signed in to change notification settings - Fork 0
/
contentScript.js
150 lines (130 loc) · 4.5 KB
/
contentScript.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
const profilePageRegex = /https:\/\/\w{1,3}.linkedin.com\/in/
const MAX_COUNT = 50
const FOLLOWING = 'Following'
const FOLLOW = 'Follow'
const ACCEPT = 'Accept'
let intervalId = null
let counter = 0
let acceptButton = null
let profileActionsDivName = 'pvs-profile-actions'
// get user profileId
const getProfileId = () => {
const profileIdElement =
document.getElementById(
"navigation-index-see-all-experiences"
) ??
document.getElementById(
"navigation-index-see-all-recommendations"
) ??
document.getElementById("navigation-index-see-all-companies") ??
document.getElementById("navigation-index-see-all-groups") ??
document.querySelectorAll("[id^=navigation-index-Show-all]")[0]
return profileIdElement?.href?.match(
/fsd_profile%3A([^"|&|?|%]*)/
)[1]
}
// checking for default linkedin follow button
const getFollowStatus = () => {
let followStatus = null
let buttons = document.querySelectorAll(`div.${profileActionsDivName} span`)
if (buttons.length === 0) {
buttons = document.querySelectorAll("div.pv-top-card-v2-ctas span")
if (buttons.length) profileActionsDivName = 'pv-top-card-v2-ctas'
}
buttons.forEach((e) => {
if (e.innerHTML.trim() === FOLLOWING) followStatus = FOLLOWING
if (e.innerHTML.trim() === FOLLOW) followStatus = FOLLOW
if (e.innerHTML.trim() === ACCEPT) acceptButton = e
})
return followStatus
}
// get profile actions div
const getProfileActionsDiv = () => {
return document.getElementsByClassName(profileActionsDivName)[0]
}
// stop the interval and reset counter to zero
const stopInterval = (intervalId) => {
clearInterval(intervalId)
intervalId = null
counter = 0
}
// send request to change follow status
const sendRequest = async (setFollowValue, sessionId, profileId) => {
await fetch(
`https://${window.location.host}/voyager/api/feed/dash/followingStates/urn:li:fsd_followingState:urn:li:fsd_profile:${profileId}`,
{
headers: {
"csrf-token": sessionId,
},
body: `{"patch":{"$set":{"following":${setFollowValue}}}}`,
method: "POST",
}
)
}
const start = () => {
if (profilePageRegex.test(window.location.href)) {
if (intervalId) stopInterval(intervalId)
// wait for the page to fully render
intervalId = setInterval(() => {
try {
const defaultFollow = getFollowStatus()
const profileActionsDiv = getProfileActionsDiv()
const profileId = getProfileId()
counter++
if (counter > MAX_COUNT) stopInterval(intervalId)
if (profileId && profileActionsDiv && defaultFollow) {
stopInterval(intervalId)
updateDocument(profileId, defaultFollow)
}
} catch (e) {
console.error(`LinkedIn Auto Un-Follow: ${e}, ${e.stack}`)
}
}, 100)
}
}
chrome.runtime.onMessage.addListener(function (req) {
if (req.message === "clicked") start()
})
start()
// main method to update document
const updateDocument = (profileId, defaultFollow) => {
let followButtonText, setFollowValue
if (defaultFollow === FOLLOWING) {
followButtonText = 'UnFollow'
setFollowValue = false
} else {
followButtonText = 'Follow'
setFollowValue = true
}
const sessionId = document.cookie.match(/JSESSIONID="([^"]*)/)[1]
if (!document.getElementById("follow-button"))
document
.getElementsByClassName(profileActionsDivName)[0]
.insertAdjacentHTML(
"beforeend",
`<button id="follow-button" class="artdeco-button artdeco-button--2 artdeco-button--secondary ember-view pvs-profile-actions__action"><span class="artdeco-button__text">${followButtonText}</span></button>`
)
const followButton = document.getElementById("follow-button")
const followButtonClick = async (forceUnFollow) => {
try {
setFollowValue = forceUnFollow ? false : setFollowValue
followButton.disabled = true
await sendRequest(setFollowValue, sessionId, profileId)
setFollowValue = !setFollowValue
followButton.disabled = false
followButton.innerText = setFollowValue
? "Follow"
: "UnFollow"
} catch (e) {
console.error(`LinkedIn Auto Un-Follow request error: ${e}, ${e.stack}`)
}
}
followButton.addEventListener("click", () => {
followButtonClick()
})
if (acceptButton) {
acceptButton.addEventListener("click", () => {
followButtonClick(true)
})
}
}