Forked from therealsarahw/instagram-like-activity-deleter.js
Last active
May 27, 2025 19:30
-
-
Save braunglasrakete/8a7cad3ecb135470c4b93d7223b0927e to your computer and use it in GitHub Desktop.
Instagram Like Activity Deleter: Automate the deletion of all your Instagram Likes from the 'Your Activity' section. Perfect for quick digital clean-up. For comments, see my other gist.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Instagram Like Removal Script – Enhanced Timing (2025) | |
* based on the comment activity deleter by sbolel, fixed and modified to work for likes as well | |
* important: UI language must be set to English for the script to work | |
* | |
* WARNING: This function directly manipulates the DOM and depends on the current HTML | |
* structure of Instagram's website to work. If Instagram implements changes to the | |
* activity page layout, structure, or functionality, this script may break or cause | |
* unexpected behavior. Use at your own risk and always review code before running it. | |
* | |
* How to use: | |
* 1. Navigate to the Instagram likes page by going to: | |
* https://www.instagram.com/your_activity/interactions/likes | |
* 2. Open the developer console in your web browser: | |
* - Chrome/Firefox: Press Ctrl+Shift+J (Windows/Linux) or Cmd+Option+J (Mac) | |
* - Safari: Enable the Develop menu in Safari's Advanced preferences, then press Cmd+Option+C | |
* 3. Copy and paste this entire script into the console and press Enter to run it. | |
* | |
* to speed up the process, you can run the script simultaneously in two browser windows with one | |
* like activity sorted from newest to oldest and the other from oldest to newest | |
*/ | |
;(async function () { | |
const UNLIKE_BATCH_SIZE = 80 | |
const DELAY_BETWEEN_ACTIONS_MS = 1500 | |
const DELAY_BETWEEN_CHECKBOX_CLICKS_MS = 100 | |
const DELAY_AFTER_SELECT_CLICK_MS = 2000 | |
const DELAY_AFTER_ITEMS_VISIBLE_MS = 2000 | |
const MAX_RETRIES = 60 | |
const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms)) | |
const waitForElement = async (selector, timeout = 30000) => { | |
const startTime = Date.now() | |
while (Date.now() - startTime < timeout) { | |
const element = document.querySelector(selector) | |
if (element) return element | |
await delay(100) | |
} | |
throw new Error(`Element with selector "${selector}" not found within ${timeout}ms`) | |
} | |
const clickElement = async (element) => { | |
if (!element) throw new Error('Element not found') | |
element.scrollIntoView({ behavior: 'smooth', block: 'center' }) | |
element.click() | |
} | |
const waitForSelectButton = async () => { | |
for (let i = 0; i < MAX_RETRIES; i++) { | |
const buttonCount = document.querySelectorAll('[role="button"]')?.length | |
if (buttonCount > 1) return | |
await delay(1000) | |
} | |
throw new Error('Select button not found after maximum retries') | |
} | |
const unlikeSelectedItems = async () => { | |
try { | |
const unlikeButton = [...document.querySelectorAll('span')] | |
.find(el => ['Unlike', 'Gefällt mir nicht mehr'].includes(el.textContent.trim())) | |
if (!unlikeButton) throw new Error('Unlike button not found') | |
await clickElement(unlikeButton) | |
await delay(DELAY_BETWEEN_ACTIONS_MS) | |
const confirmButton = await waitForElement('button[tabindex="0"]') | |
await clickElement(confirmButton) | |
} catch (error) { | |
console.error('Error during like removal:', error.message) | |
} | |
} | |
const scrollAndWaitForMoreItems = async (previousCount) => { | |
window.scrollTo(0, document.body.scrollHeight) | |
for (let i = 0; i < 10; i++) { | |
await delay(1000) | |
const currentCount = document.querySelectorAll('[aria-label="Toggle checkbox"]').length | |
if (currentCount > previousCount) return true | |
} | |
return false | |
} | |
const removeLikes = async () => { | |
try { | |
while (true) { | |
const [, selectButton] = document.querySelectorAll('[role="button"]') | |
if (!selectButton) throw new Error('Select button not found') | |
await clickElement(selectButton) | |
await delay(DELAY_AFTER_SELECT_CLICK_MS) | |
let checkboxes = document.querySelectorAll('[aria-label="Toggle checkbox"]') | |
if (checkboxes.length === 0) { | |
const gotMore = await scrollAndWaitForMoreItems(0) | |
if (!gotMore) { | |
console.log('🚫 No more items to unlike.') | |
break | |
} | |
continue | |
} | |
await delay(DELAY_AFTER_ITEMS_VISIBLE_MS) | |
for (let i = 0; i < Math.min(UNLIKE_BATCH_SIZE, checkboxes.length); i++) { | |
await clickElement(checkboxes[i]) | |
await delay(DELAY_BETWEEN_CHECKBOX_CLICKS_MS) | |
} | |
await delay(DELAY_BETWEEN_ACTIONS_MS) | |
await unlikeSelectedItems() | |
await delay(DELAY_BETWEEN_ACTIONS_MS) | |
await waitForSelectButton() | |
await delay(DELAY_BETWEEN_ACTIONS_MS) | |
} | |
} catch (error) { | |
console.error('Error in removeLikes:', error.message) | |
} | |
} | |
// Start script | |
try { | |
await removeLikes() | |
console.log('✅ All likes removed or none left.') | |
} catch (error) { | |
console.error('Fatal error:', error.message) | |
} | |
})() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment