Th3-822

[rapidleech][u] mediafire.com_member.php

Feb 18th, 2015
593
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 19.05 KB | None | 0 0
  1. <?php
  2. ######## Account Info ########
  3. $upload_acc['mediafire_com']['user'] = ''; //Set your login
  4. $upload_acc['mediafire_com']['pass'] = ''; //Set your password
  5. ########################
  6.  
  7. // Uncomment the next line to force default upload settings: Instant Upload: ON and Default Action on Duplicate Name: Skip Upload
  8. // define('MF_forceDefaultUploadOptions');
  9.  
  10. $_GET['proxy'] = isset($_GET['proxy']) ? $_GET['proxy'] : '';
  11. $not_done = true;
  12.  
  13. $cURL = $options['use_curl'] && extension_loaded('curl') && function_exists('curl_init') && function_exists('curl_exec') ? true : false;
  14. $chttps = false;
  15. if ($cURL) {
  16.     $cV = curl_version();
  17.     if (in_array('https', $cV['protocols'], true)) $chttps = true;
  18. }
  19. if (!extension_loaded('openssl') && !$chttps) html_error('You need to install/enable PHP\'s OpenSSL extension to support HTTPS connections.');
  20. elseif (!$chttps) $cURL = false;
  21.  
  22. /* Not Final */
  23. if (!function_exists('curl_upfile')) {
  24.     function curl_upfile($host, $port, $url, $referer, $cookie, $post, $file, $filename, $fieldname, $field2name = '', $proxy = 0, $pauth = 0, $upagent = 0, $scheme = 'http') {
  25.         static $ch;
  26.         if (empty($upagent)) $upagent = rl_UserAgent;
  27.         $scheme = strtolower("$scheme://");
  28.         $fileSize = filesize($file);
  29.  
  30.         if (!is_readable($file)) return html_error(sprintf(lang(65), $file));
  31.         if ($scheme == 'https://' && ($port == 0 || $port == 80)) $port = 443;
  32.         elseif ($port == 0) $port = 80;
  33.  
  34.         if (!extension_loaded('curl') || !function_exists('curl_init') || !function_exists('curl_exec')) return html_error('cURL isn\'t enabled or cURL\'s functions are disabled');
  35.         $arr = explode("\r\n", $referer);
  36.         $header = array();
  37.         if (count($arr) > 1) {
  38.             $referer = $arr[0];
  39.             unset($arr[0]);
  40.             $header = array_filter(array_map('trim', $arr));
  41.         }
  42.         $opt = array(CURLOPT_HEADER => 1, CURLOPT_SSL_VERIFYPEER => 0,
  43.             CURLOPT_SSL_VERIFYHOST => 0, CURLOPT_RETURNTRANSFER => 1,
  44.             CURLOPT_FOLLOWLOCATION => 0, CURLOPT_FAILONERROR => 1,
  45.             CURLOPT_FORBID_REUSE => 0, CURLOPT_FRESH_CONNECT => 0,
  46.             CURLINFO_HEADER_OUT => 1, CURLOPT_URL => $scheme . $host . ($port != 80 && $port != 443 ? ":" . $port : "") . str_replace(array(' ', "\r", "\n"), array('%20'), $url),
  47.             CURLOPT_USERAGENT => $upagent);
  48.  
  49.         $opt[CURLOPT_REFERER] = !empty($referer) ? $referer : false;
  50.         $opt[CURLOPT_COOKIE] = !empty($cookie) ? (is_array($cookie) ? CookiesToStr($cookie) : trim($cookie)) : false;
  51.  
  52.         if (!empty($_GET['useproxy']) && !empty($_GET['proxy'])) {
  53.             $opt[CURLOPT_HTTPPROXYTUNNEL] = ($scheme == 'https://') ? true : false;
  54.             // $opt[CURLOPT_HTTPPROXYTUNNEL] = false; // Uncomment this line for disable https proxy over curl.
  55.             $opt[CURLOPT_PROXY] = $_GET['proxy'];
  56.             $opt[CURLOPT_PROXYUSERPWD] = (!empty($pauth) ? base64_decode($pauth) : false);
  57.         } else $opt[CURLOPT_PROXY] = false;
  58.  
  59.         // Send more headers...
  60.         $headers = array('Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language: en-US;q=0.7,en;q=0.3', 'Pragma: no-cache', 'Cache-Control: no-cache', 'Connection: Close');
  61.         if (empty($opt[CURLOPT_REFERER])) $headers[] = 'Referer:';
  62.         if (empty($opt[CURLOPT_COOKIE])) $headers[] = 'Cookie:';
  63.         if (!empty($opt[CURLOPT_PROXY]) && empty($opt[CURLOPT_PROXYUSERPWD])) $headers[] = 'Proxy-Authorization:';
  64.         if (count($header) > 0) $headers = array_merge($headers, $header);
  65.         $opt[CURLOPT_HTTPHEADER] = $headers;
  66.  
  67.         $opt[CURLOPT_HTTPAUTH] = false;
  68.  
  69.         if (empty($post)) $post = array();
  70.         $opt[CURLOPT_POST] = 1;
  71.         if (!is_array($post)) return html_error('Error: $post must be a array!');
  72.         if (function_exists('curl_file_create')) {
  73.             $post[$fieldname] = curl_file_create($file);
  74.         } else {
  75.             $post = array_map(function($val) {
  76.                 return ltrim($val, '@');
  77.             }, $post);
  78.             $post[$fieldname] = sprintf('@%s;filename=%s', realpath($file), $filename);
  79.             if (defined('CURLOPT_SAFE_UPLOAD')) $opt['CURLOPT_SAFE_UPLOAD'] = false;
  80.         }
  81.         $opt[CURLOPT_POSTFIELDS] = $post;
  82.  
  83.         // Progress bar
  84.         $opt[CURLOPT_NOPROGRESS] = false;
  85.         $opt[CURLOPT_BUFFERSIZE] = GetChunkSize($fileSize);
  86.         $opt[CURLOPT_PROGRESSFUNCTION] = function($ch, $download_size = 0, $downloaded = 0, $upload_size = 0, $uploaded = 0) {
  87.             if (version_compare(PHP_VERSION, '5.5.0') < 0) {
  88.                 $uploaded = $upload_size;
  89.                 $upload_size = $downloaded;
  90.                 $downloaded = $download_size;
  91.                 $download_size = $ch;
  92.             }
  93.             static $lastUploaded = 0;
  94.             static $time = 0;
  95.             static $lastChunkTime;
  96.             if (!isset($lastChunkTime)) $lastChunkTime = microtime(true);
  97.  
  98.             if ($uploaded != $lastUploaded && (time() > $time || $uploaded == $upload_size)) {
  99.                 $mtime = microtime(true);
  100.                 $ctime = $mtime - $lastChunkTime;
  101.                 $ctime = ($ctime > 0) ? $ctime : 1;
  102.                 $lastChunkTime = $mtime;
  103.                 $speed = round(($uploaded - $lastUploaded) / 1024 / $ctime, 2);
  104.                 $progress = min(round(($uploaded / $upload_size) * 100, 2), 100);
  105.                 echo "<script type='text/javascript'>pr('$progress', '" . bytesToKbOrMbOrGb($uploaded) . "', '$speed');</script>\n";
  106.                 flush();
  107.                 $lastUploaded = $uploaded;
  108.                 $time = time();
  109.             }
  110.         };
  111.  
  112.         $opt[CURLOPT_CONNECTTIMEOUT] = $opt[CURLOPT_TIMEOUT] = 120;
  113.  
  114.         // Creating curl resource
  115.         if (!isset($ch)) $ch = curl_init();
  116.  
  117.         foreach ($opt as $O => $V) curl_setopt($ch, $O, $V); // Using this instead of 'curl_setopt_array'
  118.  
  119.         if ($proxy) echo '<p>' . sprintf(lang(89), $proxyHost, $proxyPort) . '<br />UPLOAD: <b>' . htmlspecialchars($url) . "</b>...<br />\n";
  120.         else echo '<p>'.sprintf(lang(90), $host, $port).'</p>';
  121.  
  122.         echo(lang(104) . ' <b>' . htmlspecialchars($filename) . '</b>, ' . lang(56) . ' <b>' . bytesToKbOrMbOrGb($fileSize) . '</b>...<br />');
  123.         $GLOBALS['id'] = md5(time() * rand(0, 10));
  124.         require (TEMPLATE_DIR . '/uploadui.php');
  125.         flush();
  126.  
  127.         $page = curl_exec($ch);
  128.         $info = curl_getinfo($ch);
  129.         $errz = curl_errno($ch);
  130.         $errz2 = curl_error($ch);
  131.         curl_close($ch);
  132.  
  133.         if ($errz != 0) return html_error("[cURL-Upload:$errz] $errz2");
  134.  
  135.         if (substr($page, 9, 3) == '100' || !empty($opt[CURLOPT_HTTPPROXYTUNNEL])) $page = preg_replace("@^HTTP/1\.[01] \d{3}(?:\s[^\r\n]+)?\r\n\r\n(HTTP/1\.[01] \d+ [^\r\n]+)@i", "$1", $page, 1); // The "100 Continue" or "200 Connection established" can break some functions in plugins, lets remove it...
  136.         return $page;
  137.     }
  138. }
  139.  
  140. if ($upload_acc['mediafire_com']['user'] && $upload_acc['mediafire_com']['pass']) {
  141.     $default_acc = true;
  142.     $_REQUEST['up_login'] = $upload_acc['mediafire_com']['user'];
  143.     $_REQUEST['up_pass'] = $upload_acc['mediafire_com']['pass'];
  144.     $_REQUEST['action'] = 'FORM';
  145.     echo "<b><center>Using Default Login.</center></b>\n";
  146. } else $default_acc = false;
  147.  
  148. if (empty($_REQUEST['action']) || $_REQUEST['action'] != 'FORM') {
  149.     echo "<table border='0' style='width:270px;' cellspacing='0' align='center'>
  150.     <form method='POST'>
  151.     <input type='hidden' name='action' value='FORM' />
  152.     <tr><td style='white-space:nowrap;'>&nbsp;Login*</td><td>&nbsp;<input type='text' name='up_login' value='' style='width:160px;' /></td></tr>
  153.     <tr><td style='white-space:nowrap;'>&nbsp;Password*</td><td>&nbsp;<input type='password' name='up_pass' value='' style='width:160px;' /></td></tr>\n";
  154.     echo "<tr><td colspan='2' align='center'><br /><input type='submit' value='Upload' /></td></tr>\n";
  155.     echo "<tr><td colspan='2' align='center'><small>*You can set it as default in <b>".basename(__FILE__)."</b></small></td></tr>\n";
  156.     echo "</table>\n</form>\n";
  157. } else {
  158.     $login = $not_done = false;
  159.     $domain = 'www.mediafire.com';
  160.     $referer = "https://$domain/";
  161.     $app = array('id' => '44595', 'api_version' => '1.5'); // Application ID for MediaFire's API @ https://www.mediafire.com/#settings/applications
  162.  
  163.     // Login
  164.     echo "<table style='width:600px;margin:auto;'>\n<tr><td align='center'>\n<div id='info' width='100%' align='center'>Login to $domain</div>\n";
  165.  
  166.     $cookie = array();
  167.     if (!empty($_REQUEST['up_login']) && !empty($_REQUEST['up_pass'])) {
  168.         if (!empty($_REQUEST['A_encrypted'])) {
  169.             $_REQUEST['up_login'] = decrypt(urldecode($_REQUEST['up_login']));
  170.             $_REQUEST['up_pass'] = decrypt(urldecode($_REQUEST['up_pass']));
  171.             unset($_REQUEST['A_encrypted']);
  172.         }
  173.         Login($_REQUEST['up_login'], $_REQUEST['up_pass']);
  174.         $login = true;
  175.     } else html_error('Login failed: User/Password empty.');
  176.  
  177.     // Hashing File
  178.     echo "<script type='text/javascript'>document.getElementById('info').innerHTML = 'Hashing File';</script>\n";
  179.  
  180.     $fileHash = (in_array('sha256', hash_algos()) ? hash_file('sha256', $lfile, false) : ''); // sha256 is needed for Instant upload and extra checks.
  181.  
  182.     // Preparing Upload
  183.     echo "<script type='text/javascript'>document.getElementById('info').innerHTML = 'Preparing Upload';</script>\n";
  184.  
  185.     $uploadCheck = array_map('strtolower_nr', mf_apireq('upload/check', array('size' => $fsize, 'hash' => $fileHash, 'filename' => $lname)));
  186.     mf_checkErrors($uploadCheck, 'Pre-Upload Check Error');
  187.  
  188.     if ($uploadCheck['storage_limit_exceeded'] == 'yes') html_error('User storage limit exceeded.');
  189.     if ($fsize > $uploadCheck['available_space']) html_error('User does not have enough space for this file.'); // $fsize > ($uploadCheck['storage_limit'] - $uploadCheck['used_storage_size'])
  190.  
  191.     if (!empty($fileHash) && $uploadCheck['file_exists'] == 'yes' && !empty($uploadCheck['different_hash']) && $uploadCheck['different_hash'] == 'no') html_error('A file with the same name already exists in your root directory and it\'s contents are identical.');
  192.  
  193.     if (!defined('MF_forceDefaultUploadOptions')) {
  194.         $uploadPrefs = array_map('strtolower', mf_apireq('upload/get_options'));
  195.         mf_checkErrors($uploadPrefs, 'Cannot Get Upload Preferences');
  196.     } else $uploadPrefs = array('disable_instant' => 'no', 'action_on_duplicate' => 'skip');
  197.  
  198.     if ($uploadCheck['file_exists'] == 'yes' && $uploadPrefs['action_on_duplicate'] == 'skip') html_error('A file with the same name already exists in your root directory.');
  199.  
  200.     if ($uploadCheck['hash_exists'] == 'yes' && $uploadPrefs['disable_instant'] == 'no') {
  201.         // Instant Upload
  202.         echo "<script type='text/javascript'>document.getElementById('info').innerHTML = 'Instant Upload Mode';</script>\n";
  203.  
  204.         $instantUpload = mf_apireq('upload/instant', array('size' => $fsize, 'hash' => $fileHash, 'filename' => $lname, 'action_on_duplicate' => $uploadPrefs['action_on_duplicate']));
  205.         mf_checkErrors($instantUpload, 'Instant Upload Error');
  206.  
  207.         if (empty($instantUpload['quickkey'])) html_error('Instant Upload: quickkey not found.');
  208.         $download_link = "$referer?" . $instantUpload['quickkey'];
  209.         return; // Stop this include
  210.     }
  211.  
  212.     // Uploading
  213.     echo "<script type='text/javascript'>document.getElementById('info').style.display = 'none';</script>\n";
  214.  
  215.     // action_token
  216.     $getAToken = mf_apireq('user/get_action_token', array('type' => 'upload', 'lifespan' => 1440)); //24 Hours Lifespan
  217.     mf_checkErrors($getAToken, 'Error Getting Action Token');
  218.  
  219.     $up_url = $referer . "api/{$app['api_version']}/upload/simple.php?response_format=json&session_token={$getAToken['action_token']}&action_on_duplicate=" . $uploadPrefs['action_on_duplicate'];
  220.  
  221.     $url = parse_url($up_url);
  222.     $upfiles = curl_upfile($url['host'], defport($url), $url['path'].(!empty($url['query']) ? '?'.$url['query'] : ''), $referer.(!empty($fileHash) ? "\r\nX-Filehash: $fileHash" : ''), 0, 0, $lfile, $lname, 'Filedata', '', $_GET['proxy'], $pauth, 0, $url['scheme']);
  223.  
  224.     // Upload Finished
  225.     echo "<script type='text/javascript'>document.getElementById('progressblock').style.display='none';</script>\n";
  226.  
  227.     is_page($upfiles);
  228.  
  229.     $status = intval(substr($upfiles, 9, 3));
  230.     if ($status >= 500) $ulResult = array('result' => 'Error', 'error' => $status, 'message' => "Upload: HTTP Error $status.");
  231.     else {
  232.         $ulResult = Get_Reply($upfiles);
  233.         if (count($ulResult) == 1 && !empty($ulResult['response'])) $ulResult = $ulResult['response'];
  234.     }
  235.     mf_checkErrors($ulResult, $prefix = 'Upload error');
  236.  
  237.     if (empty($ulResult['doupload']['key'])) html_error('Upload error: Key not found.');
  238.  
  239.     // Kill Action Token and test the Session Token with it too
  240.     $test = mf_apireq('user/destroy_action_token', array('action_token' => $getAToken['action_token']));
  241.     if (strtolower($test['result']) == 'error' && $test['error'] == '105') {
  242.         // Re-Login
  243.         Login($_REQUEST['up_login'], $_REQUEST['up_pass']);
  244.         mf_apireq('user/destroy_action_token', array('action_token' => $getAToken['action_token']));
  245.     }
  246.  
  247.     // Pool Upload
  248.     echo "<div id='T8_div' width='100%' align='center'>Checking Finished Upload : Try <span id='T8_try'>0</span><br /><span id='T8_status'></span></div>\n";
  249.  
  250.     $x = 1;
  251.     do {
  252.         echo "<script type='text/javascript'>document.getElementById('T8_try').innerHTML = '$x';</script>\n";
  253.  
  254.         sleep($x + 5);
  255.         $poll_upload = mf_apireq('upload/poll_upload', array('key' => $ulResult['doupload']['key']));
  256.         mf_checkErrors($poll_upload, 'Error Saving File');
  257.  
  258.         echo "<script type='text/javascript'>document.getElementById('T8_status').innerHTML += '" . htmlspecialchars($poll_upload['doupload']['description'], ENT_QUOTES) . "<br />';</script>\n";
  259.  
  260.         if (!empty($poll_upload['doupload']['fileerror'])) {
  261.             $err = "Uploaded File Error: [{$poll_upload['doupload']['error']}]";
  262.             switch ($poll_upload['doupload']['error']) {
  263.                 default: $err .= ($poll_upload['doupload']['description'] ? $poll_upload['doupload']['description'] : '*No description for this error*');break;
  264.                 case 1: $err .= 'File is larger than the maximum filesize allowed';break;
  265.                 case 2: $err .= 'File size cannot be 0';break;
  266.                 case 3: case 4:
  267.                 case 9: $err .= 'Found a bad RAR file';break;
  268.                 case 5: $err .= 'Virus found';break;
  269.                 case 6: case 8:
  270.                 case 10: $err .= 'Unknown internal error';break;
  271.                 case 7: $err .= 'File hash or size mismatch';break;
  272.                 case 12: $err .= 'Failed to insert data into database';break;
  273.                 case 13: $err .= 'File name already exists in the same parent folder, skipping';break;
  274.                 case 14: $err .= 'Destination folder does not exist';break;
  275.                 case 15: $err .= 'Account storage limit is reached';break;
  276.                 case 16: $err .= 'There was a file update revision conflict';break;
  277.                 case 17: $err .= 'Error patching delta file';break;
  278.                 case 18: $err .= 'Account is blocked';break;
  279.                 case 19: $err .= 'Failure to create path';break;
  280.             }
  281.             html_error("$err.");
  282.         }
  283.     } while ($x++ < 20 && $poll_upload['doupload']['status'] != '99');
  284.  
  285.     if (empty($poll_upload['doupload']['quickkey'])) html_error('Upload: quickkey not found.');
  286.     $download_link = "$referer?" . $poll_upload['doupload']['quickkey'];
  287. }
  288.  
  289. function Login($user, $pass) {
  290.     $post = array();
  291.     $post['email'] = $user;
  292.     $post['password'] = $pass;
  293.     $post['application_id'] = $GLOBALS['app']['id'];
  294.     $post['signature'] = sha1($user . $pass . $GLOBALS['app']['id']);
  295.     $post['token_version'] = 1;
  296.  
  297.     $login = mf_apireq('user/get_session_token', $post);
  298.     mf_checkErrors($login, 'Login Error');
  299.     if (empty($login['session_token'])) html_error('Session Token not Found.');
  300.     $GLOBALS['app']['session_token'] = $login['session_token'];
  301.  
  302.     if (!empty($login['current_api_version']) && $login['current_api_version'] != $GLOBALS['app']['api_version']) $GLOBALS['app']['new_api_version'] = $login['current_api_version'];
  303.  
  304.     return true;
  305. }
  306.  
  307. function Get_Reply($content) {
  308.     if (!function_exists('json_decode')) html_error('Error: Please enable JSON in PHP.');
  309.     $content = ltrim($content);
  310.     if (($pos = strpos($content, "\r\n\r\n")) > 0) $content = trim(substr($content, $pos + 4));
  311.     $cb_pos = strpos($content, '{');
  312.     $sb_pos = strpos($content, '[');
  313.     if ($cb_pos === false && $sb_pos === false) html_error('JSON start braces not found.');
  314.     $sb = ($cb_pos === false || $sb_pos < $cb_pos) ? true : false;
  315.     $content = substr($content, strpos($content, ($sb ? '[' : '{')));$content = substr($content, 0, strrpos($content, ($sb ? ']' : '}')) + 1);
  316.     if (empty($content)) html_error('No JSON content.');
  317.     $rply = json_decode($content, true);
  318.     if ($rply === null) html_error('Error reading JSON.');
  319.     return $rply;
  320. }
  321.  
  322. function mf_checkErrors($reply, $prefix = 'Error') {
  323.     if (strtolower($reply['result']) != 'error' || (!empty($reply['doupload']['result']) && is_numeric($reply['doupload']['result']) && $reply['doupload']['result'] >= 0)) return;
  324.     if (!empty($reply['error'])) {
  325.         $err = "$prefix: [{$reply['error']}]: ";
  326.         switch ($reply['error']) {
  327.             default: $err .= ($reply['message'] ? $reply['message'] : '*No message for this error*');break;
  328.             case 101:
  329.             case 900: $err .= 'API temporarily not available, please try again later';break;
  330.             case 107: $err .= 'Email/Password incorrect';break;
  331.             case 108: $err .= 'Invalid User/Email';break;
  332.             // HTTP Errors
  333.             case 500: $err .= 'Server error while processing your request, please try again later';break;
  334.             case 503: $err .= 'API temporarily not available, please try again later';break;
  335.         }
  336.     } else {
  337.         $err = "$prefix: [{$reply['doupload']['error']}]: ";
  338.         switch ($reply['doupload']['error']) {
  339.             default: $err .= ($reply['doupload']['description'] ? $reply['doupload']['description'] : '*No description for this error*');break;
  340.             case -20: $err .= 'Invalid Upload Key';break;
  341.             case -80: $err .= 'Upload Key not Found';break;
  342.             case -701:
  343.             case -881: $err .= 'Maximum file size for free users exceeded';break;
  344.             case -700:
  345.             case -882: $err .= 'Maximum file size exceeded';break;
  346.         }
  347.     }
  348.     if (!empty($GLOBALS['app']['new_api_version'])) echo "\n<span>Current API Used: " . htmlspecialchars($GLOBALS['app']['api_version']) . "<br />Lastest API Available: " . htmlspecialchars($GLOBALS['app']['new_api_version']) . "</span>\n";
  349.     html_error("$err.");
  350. }
  351.  
  352. function mf_apireq($action, $post = array()) {
  353.     if (!function_exists('json_encode')) html_error('Error: Please enable JSON in PHP.');
  354.     if (!is_array($post)) html_error('mf_apireq: Parameter 2 must be passed as an array.');
  355.  
  356.     $post['response_format'] = 'json'; // Get API replies in json
  357.     if (in_array($action, array('user/get_session_token', 'upload/poll_upload'))) unset($post['session_token']);
  358.     else if (empty($post['session_token']) && !empty($GLOBALS['app']['session_token'])) $post['session_token'] = $GLOBALS['app']['session_token'];
  359.     $post = array_map('urlencode', array_filter($post));
  360.  
  361.     $path = "api/{$GLOBALS['app']['api_version']}/$action.php";
  362.     if ($GLOBALS['cURL']) $page = cURL($GLOBALS['referer'] . $path, 0, $post, $GLOBALS['referer']);
  363.     else {
  364.         $page = geturl($GLOBALS['domain'], 443, "/$path", $GLOBALS['referer'], 0, $post, 0, $_GET['proxy'], $GLOBALS['pauth'], 0, 'https');
  365.         is_page($page);
  366.     }
  367.  
  368.     $status = intval(substr($page, 9, 3));
  369.     if ($status >= 500) return array('result' => 'Error', 'error' => $status, 'message' => "mf_apireq: HTTP Error $status.");
  370.  
  371.     $json = Get_Reply($page);
  372.     if (count($json) == 1 && !empty($json['response'])) $json = $json['response'];
  373.     return $json;
  374. }
  375.  
  376. function strtolower_nr($str) {
  377.     return (is_string($str) ? strtolower($str) : $str);
  378. }
  379.  
  380. //[18-2-2015]  Written by Th3-822.
  381. //[30-12-2017] Updated API to 1.5 & small fixes. - Th3-822
  382. //[24-1-2018] Fixed upload token expiring issues & small fixes. - Th3-822
  383. //[03-6-2018] Switched to www. domain & use cURL for upload (Requires PHP 5.4 for Progress Bar to Work, iirc) & spamming GH with issues won't make this fixed early. - Th3-822
  384. //[08-6-2018] Fixed filenames on upload. - Th3-822
Add Comment
Please, Sign In to add comment