X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FNetwork%2FProbe.php;h=3f10895c3c5c8874054066735ef4b259061da1ab;hb=6a376c29d85cb3e3b5ccf99bc604da472a7191c7;hp=15235c7c26d5969f2bc58caa67721e3e560474b1;hpb=92c1cbeeeccf31ae311b532866610b48c97dccfe;p=friendica.git diff --git a/src/Network/Probe.php b/src/Network/Probe.php index 15235c7c26..3f10895c3c 100644 --- a/src/Network/Probe.php +++ b/src/Network/Probe.php @@ -394,6 +394,10 @@ class Probe $data['network'] = Protocol::PHANTOM; } + if (!isset($data['hide']) && in_array($data['network'], Protocol::FEDERATED)) { + $data['hide'] = self::getHideStatus($data['url']); + } + $data = self::rearrangeData($data); // Only store into the cache if the value seems to be valid @@ -404,6 +408,70 @@ class Probe return $data; } + + /** + * Fetches the "hide" status from the profile + * + * @param string $url URL of the profile + * + * @return boolean "hide" status + */ + private static function getHideStatus($url) + { + $curlResult = Network::curl($url); + if (!$curlResult->isSuccess()) { + return false; + } + + // If the file is too large then exit + if (defaults($curlResult->getInfo(), 'download_content_length', 0) > 1000000) { + return false; + } + + // If it isn't a HTML file then exit + if (($curlResult->getContentType() != '') && !strstr(strtolower($curlResult->getContentType()), 'html')) { + return false; + } + + $body = $curlResult->getBody(); + + $doc = new DOMDocument(); + @$doc->loadHTML($body); + + $xpath = new DOMXPath($doc); + + $list = $xpath->query('//meta[@name]'); + foreach ($list as $node) { + $meta_tag = []; + if ($node->attributes->length) { + foreach ($node->attributes as $attribute) { + $meta_tag[$attribute->name] = $attribute->value; + } + } + + if (empty($meta_tag['content'])) { + continue; + } + + $content = strtolower(trim($meta_tag['content'])); + + switch (strtolower(trim($meta_tag['name']))) { + case 'dfrn-global-visibility': + if ($content == 'false') { + return true; + } + break; + case 'robots': + if (strpos($content, 'noindex') !== false) { + return true; + } + break; + } + } + + return false; + } + /** * @brief Checks if a profile url should be OStatus but only provides partial information * @@ -1436,10 +1504,39 @@ class Probe $data['baseurl'] = 'https://twitter.com'; $curlResult = Network::curl($data['url'], false); - if ($curlResult->isSuccess()) { - return $data; + if (!$curlResult->isSuccess()) { + return []; + } + + $body = $curlResult->getBody(); + $doc = new DOMDocument(); + @$doc->loadHTML($body); + $xpath = new DOMXPath($doc); + + $list = $xpath->query('//img[@class]'); + foreach ($list as $node) { + $img_attr = []; + if ($node->attributes->length) { + foreach ($node->attributes as $attribute) { + $img_attr[$attribute->name] = $attribute->value; + } + } + + if (empty($img_attr['class'])) { + continue; + } + + if (strpos($img_attr['class'], 'ProfileAvatar-image') !== false) { + if (!empty($img_attr['src'])) { + $data['photo'] = $img_attr['src']; + } + if (!empty($img_attr['alt'])) { + $data['name'] = $img_attr['alt']; + } + } } - return []; + + return $data; } /**