MyHeritage Profile Helper

Открывает возможность переходить на деревья, сайты и профили людей из поиска, а также отсылать личные сообщения без платной подписки

安裝腳本?
作者推薦腳本

您可能也會喜歡 Geni Profile Helper

安裝腳本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         MyHeritage Profile Helper
// @namespace    nikku
// @license      MIT
// @version      1.4
// @description  Открывает возможность переходить на деревья, сайты и профили людей из поиска, а также отсылать личные сообщения без платной подписки
// @author       nikku
// @match        https://www.myheritage.am/research*
// @match        https://www.myheritage.am/site-*
// @match        https://www.myheritage.am/profile-*
// @match        https://www.myheritage.am/dna/*
// @match        https://www.myheritage.am/discovery-hub/*
// @match        https://www.myheritage.at/research*
// @match        https://www.myheritage.at/site-*
// @match        https://www.myheritage.at/profile-*
// @match        https://www.myheritage.at/dna/*
// @match        https://www.myheritage.at/discovery-hub/*
// @match        https://www.myheritage.cat/research*
// @match        https://www.myheritage.cat/site-*
// @match        https://www.myheritage.cat/profile-*
// @match        https://www.myheritage.cat/dna/*
// @match        https://www.myheritage.cat/discovery-hub/*
// @match        https://www.myheritage.cn/research*
// @match        https://www.myheritage.cn/site-*
// @match        https://www.myheritage.cn/profile-*
// @match        https://www.myheritage.cn/dna/*
// @match        https://www.myheritage.cn/discovery-hub/*
// @match        https://www.myheritage.co.il/research*
// @match        https://www.myheritage.co.il/site-*
// @match        https://www.myheritage.co.il/profile-*
// @match        https://www.myheritage.co.il/dna/*
// @match        https://www.myheritage.co.il/discovery-hub/*
// @match        https://www.myheritage.co.in/research*
// @match        https://www.myheritage.co.in/site-*
// @match        https://www.myheritage.co.in/profile-*
// @match        https://www.myheritage.co.in/dna/*
// @match        https://www.myheritage.co.in/discovery-hub/*
// @match        https://www.myheritage.co.kr/research*
// @match        https://www.myheritage.co.kr/site-*
// @match        https://www.myheritage.co.kr/profile-*
// @match        https://www.myheritage.co.kr/dna/*
// @match        https://www.myheritage.co.kr/discovery-hub/*
// @match        https://www.myheritage.com.br/research*
// @match        https://www.myheritage.com.br/site-*
// @match        https://www.myheritage.com.br/profile-*
// @match        https://www.myheritage.com.br/dna/*
// @match        https://www.myheritage.com.br/discovery-hub/*
// @match        https://www.myheritage.com.hr/research*
// @match        https://www.myheritage.com.hr/site-*
// @match        https://www.myheritage.com.hr/profile-*
// @match        https://www.myheritage.com.hr/dna/*
// @match        https://www.myheritage.com.hr/discovery-hub/*
// @match        https://www.myheritage.com.pt/research*
// @match        https://www.myheritage.com.pt/site-*
// @match        https://www.myheritage.com.pt/profile-*
// @match        https://www.myheritage.com.pt/dna/*
// @match        https://www.myheritage.com.pt/discovery-hub/*
// @match        https://www.myheritage.com.tr/research*
// @match        https://www.myheritage.com.tr/site-*
// @match        https://www.myheritage.com.tr/profile-*
// @match        https://www.myheritage.com.tr/dna/*
// @match        https://www.myheritage.com.tr/discovery-hub/*
// @match        https://www.myheritage.com.ua/research*
// @match        https://www.myheritage.com.ua/site-*
// @match        https://www.myheritage.com.ua/profile-*
// @match        https://www.myheritage.com.ua/dna/*
// @match        https://www.myheritage.com.ua/discovery-hub/*
// @match        https://www.myheritage.com/research*
// @match        https://www.myheritage.com/site-*
// @match        https://www.myheritage.com/profile-*
// @match        https://www.myheritage.com/dna/*
// @match        https://www.myheritage.com/discovery-hub/*
// @match        https://www.myheritage.cz/research*
// @match        https://www.myheritage.cz/site-*
// @match        https://www.myheritage.cz/profile-*
// @match        https://www.myheritage.cz/dna/*
// @match        https://www.myheritage.cz/discovery-hub/*
// @match        https://www.myheritage.de/research*
// @match        https://www.myheritage.de/site-*
// @match        https://www.myheritage.de/profile-*
// @match        https://www.myheritage.de/dna/*
// @match        https://www.myheritage.de/discovery-hub/*
// @match        https://www.myheritage.dk/research*
// @match        https://www.myheritage.dk/site-*
// @match        https://www.myheritage.dk/profile-*
// @match        https://www.myheritage.dk/dna/*
// @match        https://www.myheritage.dk/discovery-hub/*
// @match        https://www.myheritage.ee/research*
// @match        https://www.myheritage.ee/site-*
// @match        https://www.myheritage.ee/profile-*
// @match        https://www.myheritage.ee/dna/*
// @match        https://www.myheritage.ee/discovery-hub/*
// @match        https://www.myheritage.es/research*
// @match        https://www.myheritage.es/site-*
// @match        https://www.myheritage.es/profile-*
// @match        https://www.myheritage.es/dna/*
// @match        https://www.myheritage.es/discovery-hub/*
// @match        https://www.myheritage.fi/research*
// @match        https://www.myheritage.fi/site-*
// @match        https://www.myheritage.fi/profile-*
// @match        https://www.myheritage.fi/dna/*
// @match        https://www.myheritage.fi/discovery-hub/*
// @match        https://www.myheritage.fr/research*
// @match        https://www.myheritage.fr/site-*
// @match        https://www.myheritage.fr/profile-*
// @match        https://www.myheritage.fr/dna/*
// @match        https://www.myheritage.fr/discovery-hub/*
// @match        https://www.myheritage.gr/research*
// @match        https://www.myheritage.gr/site-*
// @match        https://www.myheritage.gr/profile-*
// @match        https://www.myheritage.gr/dna/*
// @match        https://www.myheritage.gr/discovery-hub/*
// @match        https://www.myheritage.hu/research*
// @match        https://www.myheritage.hu/site-*
// @match        https://www.myheritage.hu/profile-*
// @match        https://www.myheritage.hu/dna/*
// @match        https://www.myheritage.hu/discovery-hub/*
// @match        https://www.myheritage.it/research*
// @match        https://www.myheritage.it/site-*
// @match        https://www.myheritage.it/profile-*
// @match        https://www.myheritage.it/dna/*
// @match        https://www.myheritage.it/discovery-hub/*
// @match        https://www.myheritage.jp/research*
// @match        https://www.myheritage.jp/site-*
// @match        https://www.myheritage.jp/profile-*
// @match        https://www.myheritage.jp/dna/*
// @match        https://www.myheritage.jp/discovery-hub/*
// @match        https://www.myheritage.lt/research*
// @match        https://www.myheritage.lt/site-*
// @match        https://www.myheritage.lt/profile-*
// @match        https://www.myheritage.lt/dna/*
// @match        https://www.myheritage.lt/discovery-hub/*
// @match        https://www.myheritage.lv/research*
// @match        https://www.myheritage.lv/site-*
// @match        https://www.myheritage.lv/profile-*
// @match        https://www.myheritage.lv/dna/*
// @match        https://www.myheritage.lv/discovery-hub/*
// @match        https://www.myheritage.mk/research*
// @match        https://www.myheritage.mk/site-*
// @match        https://www.myheritage.mk/profile-*
// @match        https://www.myheritage.mk/dna/*
// @match        https://www.myheritage.mk/discovery-hub/*
// @match        https://www.myheritage.nl/research*
// @match        https://www.myheritage.nl/site-*
// @match        https://www.myheritage.nl/profile-*
// @match        https://www.myheritage.nl/dna/*
// @match        https://www.myheritage.nl/discovery-hub/*
// @match        https://www.myheritage.no/research*
// @match        https://www.myheritage.no/site-*
// @match        https://www.myheritage.no/profile-*
// @match        https://www.myheritage.no/dna/*
// @match        https://www.myheritage.no/discovery-hub/*
// @match        https://www.myheritage.pl/research*
// @match        https://www.myheritage.pl/site-*
// @match        https://www.myheritage.pl/profile-*
// @match        https://www.myheritage.pl/dna/*
// @match        https://www.myheritage.pl/discovery-hub/*
// @match        https://www.myheritage.ro/research*
// @match        https://www.myheritage.ro/site-*
// @match        https://www.myheritage.ro/profile-*
// @match        https://www.myheritage.ro/dna/*
// @match        https://www.myheritage.ro/discovery-hub/*
// @match        https://www.myheritage.rs/research*
// @match        https://www.myheritage.rs/site-*
// @match        https://www.myheritage.rs/profile-*
// @match        https://www.myheritage.rs/dna/*
// @match        https://www.myheritage.rs/discovery-hub/*
// @match        https://www.myheritage.se/research*
// @match        https://www.myheritage.se/site-*
// @match        https://www.myheritage.se/profile-*
// @match        https://www.myheritage.se/dna/*
// @match        https://www.myheritage.se/discovery-hub/*
// @match        https://www.myheritage.si/research*
// @match        https://www.myheritage.si/site-*
// @match        https://www.myheritage.si/profile-*
// @match        https://www.myheritage.si/dna/*
// @match        https://www.myheritage.si/discovery-hub/*
// @match        https://www.myheritage.sk/research*
// @match        https://www.myheritage.sk/site-*
// @match        https://www.myheritage.sk/profile-*
// @match        https://www.myheritage.sk/dna/*
// @match        https://www.myheritage.sk/discovery-hub/*
// @match        https://www.myheritage.tw/research*
// @match        https://www.myheritage.tw/site-*
// @match        https://www.myheritage.tw/profile-*
// @match        https://www.myheritage.tw/dna/*
// @match        https://www.myheritage.tw/discovery-hub/*
// @exclude      https://www.myheritage.*/site-family-tree-*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=myheritage.com
// @run-at       document-end
// @grant        unsafeWindow
// @grant        GM_addStyle
// ==/UserScript==

function personId(item) {
    return item[1] * 1000000 + parseInt(item[2]);
}

function createUrl(coll, item, name, link) {
    switch (coll) {
        case '1':
            return '/profile-' + item[0] + '-' + personId(item) + '/profile';
        case '2':
            return '/site-' + item[0] + '/site';
        case '3':
            return '/profile-' + item[0] + '/profile';
        default:
            return link;
    }
}

function processSearchData(data) {
    data.forEach(function(rec) {
        var coll = rec.record.collection.id.split('-')[1];
        var item = rec.record.id.split('-')[2].split('_');
        var name = rec.record.name;
        var link = rec.user_info.link;
        var newUrl = createUrl(coll, item, name, link);

        if (link != newUrl) {
            rec.user_info.link = newUrl;
            rec.record.name = '✨ ' + rec.record.name;
            if (coll == '1') {
                var parts = rec.record.collection.name.split(',');
                if (parts.length > 1) {
                    var tree = '<b><a onclick="event.stopPropagation();" href="/site-family-tree-' + item[0] + '/tree?rootIndivudalID=' + personId(item) + '&familyTreeID=' + item[1] + '">🌳 Древо</a></b>';
                    var website = '<span class="sub"><b><a onclick="event.stopPropagation();" href="/site-' + item[0] + '/site">' + parts[0] + '</a></b></span>';
                    var admin = parts[1].replace(/(.*) (\S+ \S+)/, '$1 <b>$2</b>').replace('администрирует', 'адм.');
                    rec.record.collection.name = tree + website + ',' + admin;
                }
            }
        }

        if (coll == '40000') {
            rec.record.collection.name = '🌀 ' + rec.record.collection.name;
        }

        if (coll == '40001') {
            rec.record.collection.name = '🌱 ' + rec.record.collection.name;
        }
    });
}

function processMatchData(data) {
    data.forEach(function(rec) {
        var fields = rec.record.display_fields;
        if (fields && fields.length) {
            fields.forEach(function(item) {
                if (item.value.includes('/paywall')) {
                    item.value = item.value.replaceAll(/href="[^"]+-i-(\d+)-\d+-(\d+)[^"]+"/gi, 'href="/profile-$1-$2/profile"');
                }
            });
        }
    });
}

function messageUrl(memberId) {
    return window.location.origin + '/inbox/compose/recipient/' + memberId + '/type/1?reason=153';
}

function messageHtml(memberId) {
    return '<a href="' + messageUrl(memberId) + '" ' +
        'class="mh_button button_component allow_hover shape_rounded hierarchy_secondary">' +
        '<span class="button_content size_small">✨ Разблокировать личные сообщения</span></a>';
}

function buttonHtml(href, text) {
    return '<a href="' + href + '"><button type="submit" ' +
        'class="mh_button variant_festive hierarchy_secondary rounded size_small">' +
        '<span class="mh_button_content">' + text + '</span></button></a>';
}

function addDnaButtons(node) {
    node.querySelectorAll('.buttons_container > a:nth-child(2)').forEach(function (link) {
        var pediHref = link.href.replace(/&kitId.*/, '');
        var treeHref = pediHref.replace(/(.*)pedigree-tree-(\d+)-(\d+)(.*)/, '$1site-family-tree-$2$4&rootIndividualID=$3');
        link.insertAdjacentHTML('afterend', buttonHtml(treeHref, '✨ Семейное древо'));
        link.insertAdjacentHTML('afterend', buttonHtml(pediHref, '✨ Вид по родословной'));
    });
}

function openMsgForm(args, withTopic) {
    var msgUrl = '/messaging-center/all/compose/user-';
    var homeUrl = unsafeWindow.navigationBarApp.clientData.homePageUrl;
    var targetURL = msgUrl + args[0];
    var lang;

    if (homeUrl) {
        lang = homeUrl.split('?');
    }

    if (withTopic && args[1]) {
        targetURL += '/' + args[1];
    }

    if (lang[1]) {
        targetURL += '?' + lang[1];
    }

    window.open(targetURL);
}

(function(open) {
    XMLHttpRequest.prototype.open = function() {
        var isSearch = arguments[1].includes('search_in_historical_records');
        var isMatch = arguments[1].includes('matches_for_person_fetch_entries');
        if (isSearch || isMatch) {
            this.addEventListener('load', function() {
                var json = JSON.parse(this.responseText);
                var res = isSearch ? json.data.search_query_upload.response.results : json.data.individual.matches;

                if (res.data && res.data.length) {
                    isSearch ? processSearchData(res.data) : processMatchData(res.data);
                    Object.defineProperty(this, 'responseText', {writable: true});
                    this.responseText = JSON.stringify(json);
                }
            }, false);
        }

        open.apply(this, arguments);
    };
})(XMLHttpRequest.prototype.open);

(function() {
    'use strict';

    var cssCode = [
        '.main_ctas .mh_button { display: block; width: 100%; white-space: normal; transition: none; }',
        '.main_ctas .hierarchy_secondary, .person_profile_page .hierarchy_secondary { border-color: #ccc !important; color: #2385c4 !important; background-color: #fcfcfc !important; }',
        '.main_ctas .hierarchy_secondary:hover, .person_profile_page .hierarchy_secondary:hover { background-color: #fff5f4 !important; text-decoration: none !important; }',
        '.main_ctas .primary_separator { display: none; }',
        '.contact_site_creator_cta { margin-top: 16px; }',
        '.site-creator .profile_details_layout { background: #fff; border-radius: 100px; }',
        '.profile_page_top { position: relative; }',
        '.profile_page_top .mh_button { position: absolute; top: 0; left: 0; right: 0; width: fit-content; margin: 0 auto; }',
    ].join('\n');
    GM_addStyle(cssCode);

    var wPath = window.location.pathname;
    var isProfile = wPath.startsWith('/profile-');
    var isSite = wPath.startsWith('/site-');
    var isDna = wPath.startsWith('/dna/');
    var memberId;

    if (isSite || isProfile) {
        var json = unsafeWindow.clientData;
        if (json) {
            memberId = json.memberId || json.profileDetails.creator_id;
        }
    }

    if (!isDna) {
        unsafeWindow.contactMember = function() {
            openMsgForm(arguments, true);
        };

        unsafeWindow.contactWebmasterViaInbox = function() {
            openMsgForm(arguments);
        };
    }

    if (isSite && memberId) {
        var profile = document.querySelector('.profile_details_container');
        var contact = document.querySelector('.contact_site_creator_cta');
        var tree = document.querySelector('.view_family_tree_url .link');
        profile.innerHTML = '<a href="/profile-' + memberId + '/profile">' + profile.innerHTML + '</a>';
        contact.insertAdjacentHTML('beforebegin', messageHtml(memberId));
        contact.classList.replace('hierarchy_primary', 'hierarchy_secondary');
        contact.firstElementChild.prepend('📨 ');
        document.querySelector('.request_membership_cta > span').prepend('📩 ');
        tree.className = 'mh_button button_component allow_hover shape_rounded hierarchy_secondary';
        tree.firstElementChild.className = 'button_content size_small';
        tree.firstElementChild.prepend('🌳 ');
    }

    if (isProfile && memberId) {
        document.querySelector('.profile_page_top').insertAdjacentHTML('beforeend', messageHtml(memberId));
    }

    if (isDna) {
        var observer = new MutationObserver(function (mutList) {
            mutList.forEach(function (mut) {
                mut.addedNodes.forEach(function (anod) {
                    if (anod.matches('.dna_results_matches') || anod.matches('.matches_cards')) {
                        addDnaButtons(anod);
                    }
                });
            });
        });

        observer.observe(document.querySelector('#dna_results_root'), {
            subtree: true, childList: true
        });
    }
})();