Сканирование по фамилии на сайте MyHeritage
Я «дерево» своих родственников храню на сайте «MyHeritage» (сейчас там 543 человека, но это включая очень дальних). На сайте есть интересная функция,
На сайте зарегистрирован 61 миллион пользователей и заведено 861 миллион профилей, так что функция имеет смысл. Наша с женой практика это подтверждает — нашлись три дерева её родственников.
У меня из родни пока никто не нашёлся, поэтому я решил поискать сам. Написал скрипт, который сканирует выдачу поиска по сайту и выдаёт администраторов найденных сайтов. Открываете полученные УРЛы в браузере и пишете всем им письмо. Автоматическую рассылку я делать не стал, смысла нет, на сайте полный набор защиты — разные виды «капчи» и лимит на количество сообщений в сутки. У меня получилось порядка 35 ссылок на мою фамилию, ради этого делать полную автоматику не интересно. Код скрипта.
<?php
$SURNAME = array('Иванов', 'Иванова');
$EXCLUDETREE = array(111111); // дерево, которое надо пропустить (например, ваше собственное)
$MANMASK = 'http\://www\.myheritage\.com/person\-(\d+)_(\d+)_(\d+)/[^"]+';
$CONTACTMASK = 'contactWebmasterViaInbox\((\d+)\)';
$CONTACTURL = 'http://www.myheritage.com/site-%d/t?lang=RU';
$URL = 'http://www.myheritage.com/FP/smart-research-search.php?offset=%d&l=%s';
$trees = array();
$context = stream_context_create(array(
'http' => array(
'method' => 'GET',
'header' => "User-agent: Opera/9.80 (Darwin x86_64; U; Edition Next; ru) Presto/2.10.238 Version/12.00\r\n".
"Accept-encoding: gzip",
'protocol_version' => PHP_VERSION >= 5.3 ? '1.1' : '1.0',
'timeout' => 5,
)
));
foreach ($SURNAME as $surname) {
echo 'Поиск по фамилии «', $surname, "».\n";
for ($i = 0;;$i += 10) {
echo 'Смещение: ', $i;
$content = DecodeResponse(file_get_contents(sprintf($URL, $i, urlencode($surname)), false, $context), $http_response_header);
echo ", длина полученного документа: ", strlen($content), " байт, ";
if (preg_match_all("!$MANMASK!", $content, $m)) {
echo 'найдено записей: ', $peoplecount = count($m[0]), ".\n";
$trees = array_merge($trees, $m[3]);
} else {
$peoplecount = 0;
echo "записей не найдено.\n";
}
if ($peoplecount != 10) {
break;
}
}
}
$trees = array_diff(array_unique($trees), $EXCLUDETREE);
echo 'Найдено деревьев: ', count($trees), ".\n";
foreach ($trees as $id) {
$content = DecodeResponse(file_get_contents(sprintf($CONTACTURL, $id), false, $context), $http_response_header);
if (preg_match("!$CONTACTMASK!", $content, $m)) {
echo "http://www.myheritage.com/FP/inbox.php?lang=RU&compose=1&recipient={$m[1]}&type=1\n";
}
}
function DecodeResponse($content, $headers) {
foreach ($headers as $header) {
if (stripos($header, 'Content-Encoding:') === 0 && strpos($header, 'gzip') !== false) {
return gzinflate(substr($content, 10));
}
}
return $content;
}
Комментарии 23
Надо будет скачать весь gencom себе, а то глядишь и это отключат.
Это где так?
Комментарий для alexeit.myopenid.net:
Я не заморачиваюсь, ввожу максимум информации, что знаю. Страна, район, город/село и в комментарии название на момент рождения, если оно отличается. Или что имеется ввиду.
Комментарий для kurapov.name:
В бесплатной версии — да. Я купил платную, более того, меня бы насторожило, что я размещаю такие ценные для меня данные накаком-то сервисе, которому я денег не плачу́ и они мне ничего не обязаны. Откуда у них деньги и что будет, когда они у них закончатся?
Тут платный сайт, с понятными источниками доходов, с многолетней историей, с десятками миллионов пользователей.
На http://myheritage.comкакую-нибудь ерунду, а потом её просто почистить.
В принципе, можно забить в родителя(ей)
Нет, не нужно. Например, когда я создаю семью, где с родителями
Вы говорите о том, что происходит уже ПОСЛЕ регистрации. А я — о первичной регистрации, для которой необходимы данные обоих родителей.
Думаю, можно им в поддержку написать, чтобы поправили.