// ==UserScript==
// @name FanPass Btn
// @version 1.3
// @description Adds button to redirect OnlyFans,Fansly,Candfans to Coomer with enhancement
// @namespace https://greasyfork.org/en/users/1333430
// @match https://onlyfans.com/*
// @match https://coomer.su/*
// @match https://fansly.com/*
// @match https://candfans.jp/*
// @grant GM_openInTab
// ==/UserScript==
(function () {
"use strict";
// Function to handle redirection
function redirect(username, service) {
const coomerUrl = `https://coomer.su/${service}/user/${username}`;
GM_openInTab(coomerUrl, { active: true });
}
function createRedirectButton(username, service) {
const button = document.createElement("button");
button.innerHTML = `<img src="https://coomer.su/favicon.ico" style="width: 24px; height: 24px; display: block; margin: auto;">`;
button.className = "redirect-button";
button.addEventListener("click", () => redirect(username, service));
document.body.appendChild(button);
}
// Add styles for the button and main content adjustment
const style = document.createElement("style");
style.textContent = `
.redirect-button {
position: fixed;
top: 20px;
right: 20px;
z-index: 9999;
border: none;
border-radius: 50%;
background-color: rgba(105, 105, 105, 0.7);
width: 50px;
height: 50px;
padding: 10px;
box-sizing: border-box;
cursor: pointer;
}
.shifted.content-wrapper.full-width {
width: 100% !important;
margin-left: 0 !important;
}
.post-card {
border-radius: 10px !important;
overflow: hidden;
}
.post-card__image-container {
overflow: visible;
}
.post-card__image {
transition: transform 0.3s ease, box-shadow 0.3s ease;
}
.post-card__image-container:hover .post-card__image {
transform: scale(1.1);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
}
.post-card.post-card--preview {
transform: scale(1.2);
margin: 20px;
transition: transform 0.3s ease, box-shadow 0.3s ease;
backface-visibility: hidden;
perspective: 1000px;
}
.post-card.post-card--preview:hover {
transform: scale(1.3);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
}
.ad-banner, .ad-container, .banner, .advertisement {
display: none !important;
}
.post__nav-links {
position: sticky;
top: 50%;
display: flex;
justify-content: space-between;
align-items: center;
width: 100%;
z-index: 1000;
transform: translateY(-50%);
}
.post__nav-item {
flex: 1;
text-align: center;
font-size: 130%;
}
.post__nav-item.subtitle {
font-size: 130%;
position: absolute;
left: 20%;
}
.post__nav-item a {
text-decoration: none;
color: inherit;
font-size: 130%;
}
.post__nav-item.previous {
position: absolute;
left: 20%;
}
.post__nav-item.next {
position: absolute;
right: 20%;
}
.glow {
animation: glow 1.5s infinite alternate;
}
@keyframes glow {
0% {
text-shadow: 0 0 5px #fff, 0 0 10px #fff, 0 0 15px #fff, 0 0 20px #ff00ff, 0 0 25px #ff00ff, 0 0 30px #ff00ff, 0 0 35px #ff00ff;
}
50% {
text-shadow: 0 0 10px #fff, 0 0 15px #fff, 0 0 20px #fff, 0 0 25px #ff00ff, 0 0 30px #ff00ff, 0 0 35px #ff00ff, 0 0 40px #ff00ff;
}
100% {
text-shadow: 0 0 15px #fff, 0 0 25px #fff, 0 0 35px #fff, 0 0 45px #ff00ff, 0 0 55px #ff00ff, 0 0 65px #ff00ff, 0 0 75px #ff00ff;
}
}
`;
document.head.appendChild(style);
function closeSidebar() {
setTimeout(() => {
const sidebar = document.querySelector(".global-sidebar");
const closeButton = document.querySelector(
".global-sidebar .close-sidebar"
);
if (sidebar && sidebar.classList.contains("expanded") && closeButton) {
closeButton.click();
}
setTimeout(() => {
removeHeader();
}, 100);
}, 1000);
}
function removeHeader() {
const header = document.querySelector(".header.sidebar-retracted");
if (header) {
header.remove();
} else {
const observer = new MutationObserver(() => {
const header = document.querySelector(".header.sidebar-retracted");
if (header) {
header.remove();
observer.disconnect();
}
});
observer.observe(document.body, { childList: true, subtree: true });
}
}
function removeMatrixBanner() {
const matrixBanner = document.querySelector(
'a[href="https://coomer.su/matrix"]'
);
if (matrixBanner) {
matrixBanner.remove();
}
}
function moveNavElement() {
const navElements = document.querySelectorAll(".post__nav-links");
const postBodyElement = document.querySelector(".post__body");
navElements.forEach((navElement) => {
const previousItem =
navElement.querySelector(".post__nav-link.prev") ||
navElement.querySelector(".post__nav-item.subtitle");
if (previousItem) {
previousItem.innerHTML = "←";
previousItem.parentElement.classList.add("previous", "glow");
}
const nextItem = navElement.querySelector(".post__nav-link.next");
if (nextItem) {
nextItem.innerHTML = "→";
nextItem.parentElement.classList.add("next", "glow");
}
});
}
function runScript() {
if (window.location.href.includes("onlyfans.com")) {
const profileMatch = window.location.href.match(
/https:\/\/onlyfans.com\/([^/]+)/
);
if (profileMatch) {
const username = profileMatch[1];
createRedirectButton(username, "onlyfans");
}
}
if (window.location.href.includes("fansly.com")) {
(async () => {
let userID = null;
const profileMatch = window.location.href.match(
/https:\/\/fansly.com\/([^/]+)/
);
if (profileMatch) {
const userName = profileMatch[1];
if (userName) {
const res = await fetch(
`https://apiv3.fansly.com/api/v1/account?usernames=${userName}&ngsw-bypass=true`
);
const data = await res.json();
userID = data?.response?.[0]?.id ?? null;
}
if (userID) {
createRedirectButton(userID, "fansly");
}
}
})();
}
if (window.location.href.includes("candfans.jp")) {
const processedUserIds = new Set();
const observer = new MutationObserver(() => {
document.querySelectorAll("img[data-src]").forEach((imgElement) => {
const userID = imgElement
.getAttribute("data-src")
?.match(/user\/(\d+)\//)?.[1];
if (userID && !processedUserIds.has(userID)) {
createRedirectButton(userID, "candfans");
processedUserIds.add(userID);
}
});
});
observer.observe(document.body, { childList: true, subtree: true });
}
if (window.location.href.includes("coomer.su")) {
removeMatrixBanner();
if (
window.location.href.includes("coomer.su/onlyfans/user") ||
window.location.href.includes("coomer.su/fansly/user") ||
window.location.href.includes("coomer.su/candfans/user")
) {
closeSidebar();
const mainContent = document.querySelector(".shifted.content-wrapper");
if (mainContent) {
mainContent.classList.add("full-width");
}
const imageContainers = document.querySelectorAll(
".post-card.post-card--preview"
);
imageContainers.forEach((container) => {
container.style.transform = "scale(1.2)";
container.style.margin = "20px";
container.style.transition =
"transform 0.3s ease, box-shadow 0.3s ease";
container.style.backfaceVisibility = "hidden";
container.style.perspective = "1000px";
container.addEventListener("mouseover", () => {
container.style.transform = "scale(1.3)";
container.style.boxShadow = "0 4px 8px rgba(0, 0, 0, 0.2)";
});
container.addEventListener("mouseout", () => {
container.style.transform = "scale(1.2)";
container.style.boxShadow = "none";
});
});
}
}
const links = document.querySelectorAll("a.image-link");
links.forEach((link) => {
link.addEventListener("click", (event) => {
event.preventDefault();
window.open(link.href, "_blank");
});
});
moveNavElement();
}
// Debounce function to limit the rate at which a function can fire.
function debounce(func, wait) {
let timeout;
return function (...args) {
clearTimeout(timeout);
timeout = setTimeout(() => func.apply(this, args), wait);
};
}
// Initial script run
document.addEventListener("DOMContentLoaded", runScript);
window.addEventListener("load", runScript);
// Observe URL changes
let lastUrl = location.href;
const observer = new MutationObserver(
debounce(() => {
const currentUrl = location.href;
if (currentUrl !== lastUrl) {
lastUrl = currentUrl;
runScript();
}
}, 500)
);
observer.observe(document, { subtree: true, childList: true });
})();