X-Git-Url: https://git.ao2.it/tweeper.git/blobdiff_plain/50e34cbbe2a9a8d993f0bba6206b01fcc0e1bad3..6525c19868a0511abaaac9d2ba452ba640899209:/src/Tweeper.php diff --git a/src/Tweeper.php b/src/Tweeper.php index b794368..2d3870f 100644 --- a/src/Tweeper.php +++ b/src/Tweeper.php @@ -36,7 +36,7 @@ date_default_timezone_set('UTC'); */ class Tweeper { - private static $userAgent = "Mozilla/5.0 (Linux; U; Android 4.3; en-us; SM-N900T Build/JSS15J)"; + private static $userAgent = "APIs-Google (+https://developers.google.com/webmasters/APIs-Google.html)"; private static $maxConnectionTimeout = 5; private static $maxConnectionRetries = 5; @@ -87,46 +87,6 @@ class Tweeper { } /** - * Convert Twitter mobile date to the date format expected in a RSS document. - */ - public static function twitterToRssDate($date) { - // Twitter uses relative timestamps in minutes for recent tweets. - if (preg_match('/^(\d+)m$/', $date, $matches)) { - $timestamp = strtotime("+" . $matches[1] . " min", time()); - if (FALSE === $timestamp) { - $timestamp = 0; - } - } - else { - /* - * In case the time is specified put it after the date, - * to make it recognized by strptime(). - */ - if (preg_match('/(.*) - (.*)/', $date, $matches)) { - $date = $matches[2] . " " . $matches[1]; - } - - $timestamp = strtotime($date); - if (FALSE === $timestamp) { - $timestamp = 0; - } - - /* - * The twitter mobile UI usually only specifies the month and the day, so - * strtotime($date) may interpret the date as being in the future. - * - * If the date is in the future it is probably in the same day but in the - * previous year. - */ - if ($timestamp > time()) { - $timestamp = strtotime('-1 years', $timestamp); - } - } - - return Tweeper::epochToRssDate($timestamp); - } - - /** * Convert string to UpperCamelCase. */ public static function toUpperCamelCase($str, $delim = ' ') { @@ -151,6 +111,17 @@ class Tweeper { } } while (curl_errno($ch) == CURLE_OPERATION_TIMEDOUT && ++$attempt < Tweeper::$maxConnectionRetries); + $response_code = curl_getinfo($ch, CURLINFO_RESPONSE_CODE); + if (FALSE === $response_code) { + trigger_error(curl_error($ch), E_USER_WARNING); + return FALSE; + } + + if ($response_code >= 400) { + trigger_error("HTTP reponse code $response_code", E_USER_WARNING); + return FALSE; + } + return $ret; } @@ -263,6 +234,34 @@ class Tweeper { } /** + * Generate a data URL. + */ + public static function generateDataURL($url) { + $supported_content_types = [ + "image/gif", + "image/jpeg", + "image/png", + ]; + + $url_info = Tweeper::getUrlInfo($url); + if (FALSE === $url_info) { + trigger_error("Failed to retrieve info for URL: " . $url, E_USER_WARNING); + return ''; + } + + $supported = in_array($url_info['content_type'], $supported_content_types); + if (!$supported) { + trigger_error("Unsupported data URL type \"" . $url_info['content_type'] . "\" for URL: " . $url_info['url'], E_USER_WARNING); + return ''; + } + + $base64Data = base64_encode(file_get_contents($url)); + $dataURL = 'data: ' . $url_info['content_type'] . ';base64,' . $base64Data; + + return $dataURL; + } + + /** * Mimic the message from libxml.c::php_libxml_ctx_error_level() */ private static function logXmlError($error) { @@ -341,13 +340,19 @@ class Tweeper { $data = json_decode($matches[1], $assoc = TRUE); - // The "qe" object contains elements which will result in invalid XML - // element names, so remove it. + // Remove items that may contain elements which can result in invalid XML + // element names (for example names starting with a number). unset($data["qe"]); - - // The "knobs" object contains elements with undefined namespaces, so - // remove it to silence an error message. - unset($data["knobs"]); + unset($data["knobx"]); + unset($data["to_cache"]); + + // Stop here in case Instagram redirected to the login page, this can + // happen when too many consecutive requests have been made from the same + // IP. + if (array_key_exists("LoginAndSignupPage", $data["entry_data"])) { + trigger_error("Cannot open instagram page: redirected to Login page.\n", E_USER_WARNING); + return NULL; + } $json = json_encode($data); @@ -376,6 +381,9 @@ class Tweeper { $get_xml_host_method = 'getXml' . Tweeper::toUpperCamelCase($host, '.'); if (method_exists($this, $get_xml_host_method)) { $xml_data = call_user_func_array([$this, $get_xml_host_method], [$html]); + if (NULL === $xml_data) { + return NULL; + } $xmlDoc->loadXML($xml_data); } else {