}
/**
+ * 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) {
$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);