Version: 2.1
Type: Full Script
Category: HTML
License: Other
Description: The OwnLinkSite link engine consists of a database and some php-based scripts. The user gets access to hundreds of thousands of links to adult pick- and video- sites. Free scripts and templates make both design and daily updating a breeze. The system is particularly useful for attracting as many readers as possible. OwnLinkSite.com has a very extensive tutorial explaining how to set up use the system, and how to get a high rating by Google.</
<? // pagetransform.php /*********************************************************************** * * *** pagetransform.php PROGRAM LISTING *** * *** How to use is outlined at ownlinksite.com *** * * 27.12.2002 V 1.0 Beta * 12.04.2003 V 1.1 Stable * 19.07.2003 V 2.0 Major update * 21.09.2003 V 2.1 Some small bug fixes * * Place the code in a sub-directory called ownlinksite and name it * pagetransform.php. * Also, put links.php and linkcollector.php in the same directory. * * This program transfers a template link page into an actual, working * php-based link page, as described in the tutorial how_to.php * * All rights reserverd J.P.C.D.S., Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. ***********************************************************************/ class pagetransform { // URL to where the OwnLinkSite database resides: var $_url_linkbase = 'ownlinksite.com/pagetransform_base.php'; var $_msg_arr; // Errors, warnings and messages created in this // program, to be displayed to user function pagetransform() { /*********************************************************************** * Constructor. When the object is created, do the whole job. ***********************************************************************/ } function check_dirs() { /*********************************************************************** * Creates directories pagedata,links and picks if they do not exist already ***********************************************************************/ $dirs = array('pagedata','links','picks'); foreach($dirs as $directory) { if(!is_dir($directory)) { // Does not exist, create it if(!mkdir($directory, 0777)) { // Could not create, give warning $this->_msg_arr[] = "<b>Warning:</b>Tried to create directory <b>$directory</b>, but did not succseed. Try creating it manually or change the permissions. This problem is explained in greater detail in the tutoril in ownlinksite.com"; } else { $this->_msg_arr[] = "<b>Info:</b>Directory $directory created successfully"; } } else { $this->_msg_arr[] = "<b>Info:</b>Directory $directory was there already, not created now"; } } } function binary_read($url) { /*********************************************************************** * Uses the binary reader fread to grab and return web content or file ***********************************************************************/ $x = ''; if($fp = @fopen($url,"rb")) { while(!feof($fp)) { $x.= fread($fp,1024); // Read 1024 bytes at a time } fclose($fp); return $x; // Success, return result } else { $this->_msg_arr[] = "<b>Warning:</b>Could not read $url"; return 0; // Could not open, return false } } function date_options() { /*********************************************************************** * All different date formats the user may choose from. * Returns an array with all formats. ***********************************************************************/ return array('d-m','m-d','d-m-Y','M d.','D m-d','l m-d','D m-d-y', 'D m-d-Y','D','l'); } function date_dropdown() { /*********************************************************************** * Puts the dates listed in function date_options() into a dropdown ***********************************************************************/ $date_options = $this->date_options(); $x = '<select size="1" name="date_format">'; foreach($date_options as $date_format) { $x .= '<option value="'.$date_format.'">'. date($date_format, time()).'</option>'; } $x .= '</select></p>'; return $x; } function show_input_form() { /*********************************************************************** * Prints the form used to insert the template-HTML to be transformed ***********************************************************************/ $x = '<form method="POST" action="pagetransform.php">'; $x .= ' <p><b><font face="Verdana">'. 'If you use dates on your page, select preferred format: '. $this->date_dropdown(); $x .= 'If you want the finished page to be saved automatically,<br>please write its name here <input type="text" name="file_name" size="20" value="index.php">'; $x .= '</p> <br>Paste your template HTML into the text area below '; if(isset($_GET['blocker'])) $x .= '<input type="hidden" name="blocker" value="'.$_GET['blocker'].'">'; $x .= ' <input type="submit" value="Submit">'; $x .= '<p><textarea rows="16" name="page" cols="60"></textarea>'; $x .= '</font></b></p></form>'; return $x; } function show_code($text) { /*********************************************************************** * Transforms the text to make it possible to show it via browser * Tags are replaced by their specialchrs equivalents, and new lines * like n are replaced by <br> ***********************************************************************/ $table_start = '<br></div><table width=100% border=1 cellpadding=0 cellspacing=0> <tr><td bgcolor="#FFFFCC">'; $table_stop = '</br></td></tr></table>'; return $table_start.nl2br(htmlspecialchars($text)).$table_stop; } function make_post_request($post_array) { /*********************************************************************** //* 28.09.2003 * Makes a POST request to the main OwnLinkSite server * The main server then returns the complete php code. ***********************************************************************/ $url = $this->_url_linkbase; $url = eregi_replace("^http://", "", $url); // Separate into Host and URI $host = substr($url, 0, strpos($url, "/")); $uri = strstr($url, "/"); // Form up the request body $post_vars = ""; while (list($key, $val) = each($post_array)) { if ($post_vars) $post_vars.= "&"; $post_vars.= $key."=".urlencode($val); } // Text used in the request header: $header_text = "POST $uri HTTP/1.0n". "Host: $hostn". "Content-Type: application/x-www-form-urlencodedn". "Content-Length: ".strlen($post_vars)."nn". "$post_varsn"; // Open the connection to the host $socket = fsockopen($host, 80); $x = ''; fputs($socket, $header_text); while (!feof($socket)) { $x .= fgets($socket, 1024); } return $x; } function get_quasi_xml($x,$tag) { /*********************************************************************** * Some parameters return from the OwnLinkSite server as text between * tag-like brackets. This function isolates text of interest by * stripping out everything between <tag> and </tag> in the text x ***********************************************************************/ return substr(strstr(substr($x, 0, strpos($x, "</$tag>")), "<$tag>"), strlen("<$tag>")); } function parameters_to_save() { /*********************************************************************** * Lists all the constants and arrays to be saved on the client's * harddisk (transferred from pagetransform_base.php) on the OwnLinkSite * server. All arrays are stored serialized. * * n_days = Number of days categories are shown from. * date_format = The date format used for all dates on page * pick_b = How broad the pix shall be on display, in pixels * pick_h = How tall the pixs are * links_each_cat = Array with number of links in each category * picks_each_cat = Array with mumber of pix in each category. Note it is the * displayed number which is stored, not the (much higher) * number of pick links passed from main server. * var = Array containing all categories in use, like url, short, .. * bookmarks = Used as bookmark to know where to select records * next time. ***********************************************************************/ return array('n_days_links','n_days_picks', 'date_format','pick_b','pick_h','user', 'links_each_cat','picks_each_cat','var','bookmarks'); } function save_to_file($x, $file) { /*********************************************************************** //* 20.09.2003 * Saves $x to file $file ***********************************************************************/ if($fp = fopen($file, 'w')) { fwrite($fp, $x); fclose($fp); return 1; } else { $dir_info = ''; if(strlen(trim(eregi_replace("/[^/]*$",'',$file))) > 0) $dir_info = 'for directory '.eregi_replace("/[^/]*$",'',$file); $this->_msg_arr[] = "<b>Warning:</b>Could not open file $file and save - please check access permissions ".$dir_info; return 0; } } function save_parameters($x) { /*********************************************************************** * Saves those parameters present in $x ***********************************************************************/ foreach($this->parameters_to_save() as $par_name) { $parameter = $this->get_quasi_xml($x,$par_name); if(strlen($parameter)!=0 && strlen($parameter) < strlen($x)) { $this->save_to_file($parameter,"pagedata/$par_name.txt"); // print "<br>Saved $par_name"; } } } function messages_presentable() { /*********************************************************************** * Returns the messages in a neat table ***********************************************************************/ $x = '<div align="center"> <table border="1" cellpadding="0" cellspacing="0" width="80%"> <tr><td bgcolor="#FF00FF" align="center"><h2>Messages from pagetransform.php: </h2> </td></tr><tr><td>'; if(is_array($this->_msg_arr)) { // Put some colors on the messages $x .= str_replace('Warning:','<font color="#0000FF">Warning:</font>', str_replace('Error:','<font color="#FF0000">Error:</font>', str_replace('</b>','</b><br>',implode('<br>',$this->_msg_arr)))) .'</td></tr>'; } else { $x .= '<b>None.</b> Everything went well</td></tr>'; } $x .= '</table></div>'; if(is_array($this->_msg_arr)) { return $x; } else { return 0; } } function transform_and_save() { /*********************************************************************** * Transfers the page and saves the result ***********************************************************************/ $this->check_dirs(); // Create the directories pagedata, links, picks $x = '<table width="100%" border="0" cellpadding="0" cellspacing="0">'; $x .= '<tr><td bgcolor="#FFCC33" align="center"><br><h2>'; $x .= '<font face="Verdana">Transforming the template to php-code</font>'; $x .= '</h2></td></tr>'; if(!isset($_POST['page'])) { // The form not shown alrady, do it now $x .= '<tr><td align="center">'.$this->show_input_form().'</td></tr>'; } else { // Date format and day of interest is saved directly $this->save_to_file($_POST['date_format'],'pagedata/date_format.txt'); $this->save_to_file(0,'pagedata/day_of_interest.txt'); // Generally today $page = stripslashes($this->make_post_request($_POST)); $show=stripslashes($this->get_quasi_xml($page,'page')); if(strlen($_POST['file_name']) > 2) { // The user request auomatically saving the page if(!$this->save_to_file($show,'../'.$_POST['file_name'])) { // Could not save $x .= '<tr><td align="left"><br><b><h3><font face="Verdana">'. "<h2>Unable to save the file utomatically!</h2> Please do it manually by saving this code in the main directory and call it <i>$_POST[file_name]</i> </font></h3></b>"; $x .= $this->show_code($show); } else { $x .= '<tr><td align="left"><br><b><h3><font face="Verdana">'; $x .= "The transformed file has been saved as $_POST[file_name]</h3>"; $x .= "<b>Please run <a href="linkcollector.php" target="_blank">linkcollector.php</a> to collect the first links and picks, and have a look at your page!</b><br><br>"; } } else { $x .= '<tr><td align="left"><br><b><h3><font face="Verdana">Put this code in the main directory and call it <i>index.php</i> or whatever:</font></h3></b>'; $x .= $this->show_code($show); } $x .= '</td></tr>'; $this->save_parameters($page); } $x .= '<tr><td align="center"><b><h3><font face="Verdana">'. '<a href="index.php">home</a> <a href="pagetransform.php">reset</a>'. '</font></h3></b></td></tr>'; $x .= '</table>'; if($this->messages_presentable()) $x .= $this->messages_presentable(); // Messages from this program if(isset($_POST['page'])) { if($this->get_quasi_xml($page,'message')) { $x .= $this->get_quasi_xml($page,'message'); // Messages from server } } return $x; } } // END CLASS pagetransform.php /*BLOCKER*/ // Uncomment the if-line below to protect pagetransform.php from un-authorized use // After un-commenting, the program must be called with the blocker-parameter // (in addition to any other arguments to be passed) like so: // http://your-site.com/ownlinksite/pagetransform.php?blocker=j9n8n72 // if($blocker != 'j9n8n72') exit(); // Do the pagetransform $pagetransform = new pagetransform(); print $pagetransform->transform_and_save(); ?> <? // linkcollector.php /*********************************************************************** * * *** linkcollector.php PROGRAM LISTING *** * *** How to use is outlined at ownlinksite.com *** * * 17.01.2002 V 1.0 Beta * 22.04.2003 V 1.1 Stable * 13.07.2003 V 2.0 Major update * 14.09.2003 V 2.1 Some small bug fixes * * Place the code in a sub-directory called ownlinksite and name it * linkcollector.php. * Also, put pagetransform.php and links.php in the same directory. * * This program runs as a regular (typically daily) cronjob on * the client's server. * * It communicates with pagetransform.php on the OwnLinkSite server * and receives records which it unzips, unserializes and places in the * directory links. * * Also, this program receives links to picks, downloads one pick pr. page, * and places them in the directpory called picks. * * All rights reserverd J.P.C.D.S., Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. ***********************************************************************/ class linkcollector { // URL to where the OwnLinkSite database resides: var $_url_linkbase = 'http://ownlinksite.com/linkbase.php'; var $_time_limit = 10; // How many seconds this program should run before // it times out. Consider increasing this value if // you have many picks or if your server has a very // slow internet connection var $_url; // The url used to request links from the OwnLinkSite // database, complete with all path and query var $_get_arr; // Array containing the different GET-parameters // included behind ? in the url var $_result; // Everything coming back from the OwnLinkSite server var $_result_arr; // Array with the different parts of $_result // split into each of the parameters listed in // function create_result_arr // Gets value false if no array could be created var $_day_index; // The letter indicting which day the results should // be stored as (a,b,c.. See function day_index var $_msg_arr; // Errors, warnings and messages created in this // program, to be displayed to user var $_linkcoll_stopped = false; // Becomes true if erroe made it necessary to stop function linkcollector() { /*********************************************************************** * Constructor. When the object is created, do the whole job. ***********************************************************************/ set_time_limit($this->_time_limit); $this->create_timestamp_if_missing(); } function create_timestamp_if_missing() { /*********************************************************************** * If a timestamp_start does not exist, it creates one now * This function should only be relevant first time linkcollector is run ***********************************************************************/ $file = 'pagedata/timestamp_start.txt'; if(!is_file($file) || $this->binary_read($file) < 100) $this->save_to_file(time(), $file); } function get_arr() { /*********************************************************************** * Names of all different data to be passed in the URL * The onces which are arrays are preceeded with a_ to destiguish them ************************************************************************/ $x[] = 'user'; // The user name, from file $x[] = 'password'; // Password, from either user input or file $x[] = 'timestamp_start'; // Time when pagetransform was run, from file $x[] = 'day_of_interest'; // Normally 0, meaning 0 days ago (today!) $x[] = 'n_days_links'; // Total number of days of interest for each link category $x[] = 'n_days_picks'; // Same for picks (if the page has picks!) $x[] = 'var'; // Which data to retrieve for each text link (ex. url, description..) $x[] = 'links_each_cat'; // Number of links in each category, array $x[] = 'picks_each_cat'; // Number of picks in each category $x[] = 'bookmarks'; // Bookmarks telling the database where it finished // retrieving links for each category last time // These data are not required by linkbase, but are used by linkcollector $x[] = 'pick_b'; // Desired pick sizes $x[] = 'pick_h'; return $x; } function result_arr() { /*********************************************************************** * Names of all data which may come in return from the database ************************************************************************/ $x[] = 'links'; // The text links (URL, short descripive text, // long descriptive text, which category it belongs to, // number of picks on the page it points to $x[] = 'picks'; // Similar as links, but for pick links $x[] = 'bookmarks'; // See above $x[] = 'compress'; // Logical, tells whether links and picks arrive compressed $x[] = 'password'; $x[] = 'user'; $x[] = 'timestamp_start'; // Timestamp first time linkcollector was run $x[] = 'message'; // Messages generated by the OwnLinkSite server return $x; } function remove_behind_first($x, $x2) { /*********************************************************************** * Uses fast functions (no slow ereg-type pattern matching) to delete * everything including and behind $x2 ***********************************************************************/ // If $x2 occurs in $x: Strip. Else, return as-is if (substr_count($x, $x2)) return substr($x, 0, strpos($x, $x2)); else return $x; } function remove_before_first($x, $x1) { /********************************************************************** * Uses fast functions (no slow ereg-type pattern matching) to delete * everything including and in front of $x1 **********************************************************************/ // If $x1 occurs in $x: Strip. Else, return as-is if (substr_count($x, $x1)) return substr(strstr($x, $x1), strlen($x1)); else return $x; } function binary_read($url) { /*********************************************************************** * Uses the binary reader fread to grab and return web content or file ***********************************************************************/ $x = ''; if($fp = fopen($url,"rb")) { while(!feof($fp)) { $x.= fread($fp,1024); // Read 1024 bytes at a time } fclose($fp); return $x; // Success, return result } else { return 0; // Could not open, return false } } function create_url() { /*********************************************************************** * Creates the URL with all necesary GET-variables for retrieving data from * server. Terminates program if any data is unavailable ***********************************************************************/ $variable_names = $this->get_arr(); // all variables to be included in URL // Read all variables from file and put them into a global array foreach($variable_names as $name) { $file = "pagedata/$name.txt"; if(file_exists($file)) { $value = trim($this->binary_read($file)); $this->_get_arr[$name] = $value; } else { $this->_msg_arr[] = "<b>Warning:</b> Could not find file $file"; } } // No point continuing if lots of data are missing if (count($this->_get_arr) < 2) { $this->_msg_arr[] = "<b>Error:</b> Link collection aborted. Reason: Missing necessary data in directory ownlinksite/pagedata. Please check the tutorial at <a href="http://ownlinksite.com">ownlinksite.com</a> for details on directory structure."; $this->_linkcoll_stopped = true; return false; } // If the user has included a password in the call to this program, let it // take precedence over the (older password) stored on file if (isset($_GET['password'])) $this->_get_arr['password'] = $_GET['password']; // Default day of interest is 0 (today), not stored on file if (!isset($this->_get_arr['day_of_interest'])) $this->_get_arr['day_of_interest'] = 0; // Create the complete url to fetch links $this->_url = $this->_url_linkbase . '?'; foreach($this->_get_arr as $key=>$value) { $this->_url .= $key . '=' . $value . '&'; } return $this->_url; } function download_everything() { /*********************************************************************** * Get everything from the OwnLinkSite server ***********************************************************************/ $t1 = time(); //print $this->create_url(); if($result = $this->binary_read($this->create_url())) { if(strlen($result) > 100) { // Success $this->_msg_arr[] = '<b>Info:</b> Collecting links from OwnLinkSite was done in ' . (time()-$t1) . ' sec.'; return $this->_result = $result; } else { $this->_msg_arr[] = '<b>Error:</b> Collecting links from OwnLinkSite was not successful. Contact with server was established, but the response text was too short. It contained this: '.nl2br(htmlspecialchars($result)); return 0; } } else { $this->_msg_arr[] = '<b>Error:</b> Could not establish contact with the OwnLinkSite server using url '.$this->_url; return false; } } function get_quasi_xml($x,$tag) { /*********************************************************************** * Parameters return from the OwnLinkSite server as text between * tag-like brackets. This function isolates text of interest by * stripping out everything between <tag> and </tag> in the text x ***********************************************************************/ $result=substr(strstr(substr($x, 0, strpos($x, "</$tag>")), "<$tag>"), strlen("<$tag>")); if(strlen($result)) return $result; // Some contents found else return 0; } function day_index($timestamp_start,$n_days,$day_of_interest=0) { /*********************************************************************** * Returns the day index for for the day of interest * Ex.: a for day 0, b for day 1. If 3 days are included, it starts on a * again on the 4. day * * $days_from_start = The timestamp (in seconds) when the client started * using ownlinksite. * $n_days = The number of days the client has information from * = on his web. (ex.: Every second day over 6 days is 3) * $day_of_interest = Number of days since the day of intreest (ex. 0=today, * 1 = yesterday) ***********************************************************************/ // 26 days possible, but use only $n_days of them. First time, start with a. $indexes = explode(',','a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z'); // Number of days from start to day of interest, rounded off up or down to nearest whole day $days_from_start = (int)((time()-$timestamp_start)/(3600*24) + .5) - $day_of_interest; // Go up or down n_days at a time until the day is within acceptable limits while ($days_from_start < 0) { $days_from_start += $n_days; } while ($days_from_start > $n_days-1) { $days_from_start -= $n_days; } return $indexes[$days_from_start]; } function create_result_array() { /*********************************************************************** * Strip out the different parts of the result ***********************************************************************/ if(!$this->download_everything()) return false; // Stop if no downloading success $variable_names = $this->result_arr(); foreach($variable_names as $name) { if(substr_count($this->_result, $name)) { // The parameter arrived if($variable = $this->get_quasi_xml($this->_result,$name)) { // Not empty $this->_result_arr[$name] = $variable; } } } } function save_to_file($x, $file) { /*********************************************************************** * Saves $x to file $file ***********************************************************************/ if($fp = fopen($file, 'w')) { fwrite($fp, $x); fclose($fp); return 1; } else { $dir_info = ''; if(strlen(trim(eregi_replace("/[^/]*$",'',$file))) > 0) $dir_info = 'for directory '.eregi_replace("/[^/]*$",'',$file); $this->_msg_arr[] = "<b>Warning:</b>Could not open file $file and save - please check access permissions ".$dir_info; return 0; } } function uncomp_unser_each_row($x) { /*********************************************************************** * Avoid extensive memory usage by un-compressing each category separately ***********************************************************************/ $x = unserialize($x); if(!is_array($x)) return $x; foreach ($x as $key => $value) { $x[$key] = unserialize(gzuncompress($value)); // Had to add unserialize here! } return $x; } function uncompress_each_row($x) { /*********************************************************************** * Avoid extensive memory usage by un-compressing each category separately ***********************************************************************/ //print "<br>x=$x"; if(strlen($x) < 1) return $x; $x = unserialize($x); foreach ($x as $key => $value) { $x[$key] = gzuncompress($value); } return $x; } function save_x_files($x) { /*********************************************************************** * Creates one file with text link data for each category for this day ***********************************************************************/ if(!is_array($x)) return; // Use the day index to get a unique file name for this day foreach($x as $id_category => $values) { $this->save_to_file($values, "links/x_$id_category"."_".$this->_day_index.".txt"); } } function save_picks($y) { /*********************************************************************** * Download and save the picks, and save the URLs they poin to * as well as descriptive text (to assist Google and the links * in determining content) ***********************************************************************/ if(!is_array($y)) return; $picks_each_cat = unserialize($this->_get_arr['picks_each_cat']); foreach($y as $id_category => $value1) { $j = 0; foreach($value1 as $i => $value2) { $pick_url = $value2[2]; if(isset($value2[3])) $im_url = $value2[3]; else $im_url = ''; $getpick = new getpick($pick_url, $im_url); $getpick->_new_w = $this->_get_arr['pick_b']; // Preferred pick size $getpick->_new_h = $this->_get_arr['pick_h']; if($getpick->download()) { // Put all picks in one directory, with y_ id_category, a running number, day index and .jpg $getpick->save_pick($adr="picks/y_$id_category"."_".$j."_$this->_day_index.jpg"); if($getpick->messages_to_html()) $this->_msg_arr[] = '<b>Info:</b>'.$getpick->messages_to_html(); unset($getpick); // Finished downloading, free memory $y_used[$id_category][$j][0] = $value2[0]; // Page URL $y_used[$id_category][$j][1] = 'ownlinksite/'.$adr; // Path to pick $y_used[$id_category][$j][2] = $value2[1]; // Short $j++; // Break out of this category if enough picks have been downloaded if($j >= $picks_each_cat[$id_category]) break(1); } } } // Go through all downloads to find out if enough were downloaded foreach($y as $id_category => $value1) { if(!isset($y_used[$id_category])) { // No picks downloaded! $this->_msg_arr[] = "<b>Warning:</b>Did not manage to download any pics in category $id_category. Expect some of the old picks to be shown multiple times to account for that"; } elseif(count($y_used[$id_category]) < $picks_each_cat[$id_category]) { $this->_msg_arr[] = "<b>Warning:</b>Tried to download ". $picks_each_cat[$id_category]. " in category $id_category, but only managed to download ". count($y_used[$id_category]). " Expect some of the old picks to be shown multiple times to account for that"; } } // Save the links which were used. Serialize each. if(isset($y_used)) { foreach($y_used as $id_category => $values) { $this->save_to_file(serialize($values), "links/y_$id_category". "_".$this->_day_index.".txt"); } } } function messages_presentable() { /*********************************************************************** * Returns the messages in a neat table ***********************************************************************/ $x = '<div align="center"> <table border="1" cellpadding="0" cellspacing="0" width="80%"> <tr><td bgcolor="#FF00FF" align="center"><h2>Messages from linkcollector.php: </h2> </td></tr><tr><td>'; if(is_array($this->_msg_arr)) { // Put some colors on the messages $x .= str_replace('Warning:','<font color="#0000FF">Warning:</font>', str_replace('Error:','<font color="#FF0000">Error:</font>', str_replace('</b>','</b><br>',implode('<br>',$this->_msg_arr)))) .'</td></tr>'; } else { $x .= '<b>None.</b> Everything went well</td></tr>'; } $x .= '</table></div>'; if(is_array($this->_msg_arr)) { return $x; } else { return false; } } function save_everything() { /*********************************************************************** * Saves all returned variables to file ***********************************************************************/ // If downloading from server has not been done, do it now if(!is_array($this->_result_arr) && !$this->_linkcoll_stopped) $this->create_result_array(); if($this->_linkcoll_stopped) { // Could not create relevant URL print $this->messages_presentable(); exit(); } // Make the day index, to be used as part of file names $n_days = max($this->_get_arr['n_days_links'],$this->_get_arr['n_days_picks']); $this->_day_index = $this->day_index($this->_get_arr['timestamp_start'],$n_days,$day_of_interest=0); // If we have links, save them in one file pr. category if($this->_get_arr['n_days_links']) $this->save_x_files($this->uncompress_each_row($this->_result_arr['links'])); $name = 'bookmarks'; $this->save_to_file($this->_result_arr[$name],'pagedata/'.$name.'.txt'); // Save the bookmarks serialized $name = 'password'; $this->save_to_file($this->_result_arr[$name],'pagedata/'.$name.'.txt'); // Save the password $name = 'user'; $this->save_to_file($this->_result_arr[$name],'pagedata/'.$name.'.txt'); // Save the user if($this->_get_arr['n_days_picks']) $this->save_picks($this->uncomp_unser_each_row($this->_result_arr['picks'])); } } // END CLASS linkcollector.php class getpick { /*********************************************************************** * * *** getpick.php PROGRAM LISTING *** * * 17.01.2002 V 1.0 Beta * 22.04.2003 V 1.1 Stable * 13.07.2003 V 2.0 Major update * 14.09.2003 V 2.1 Some small bug fixes * 22.12.2003 V 3.0 Major update for increased flexibility * * When the object is instantiated, an image is downloaded and placed in * $_img. * Of the 2 arguments passed to the constructor, the first is asumed to be * url to pick, the second (if it exists) is to the large image. * * Best result if the GD-librry is installed (likely for php 4.3.0 or later) * The object checks whether the GD-library is installed. If it is, it uses * it. If not, it uses workrounds to get a pick, but it is unable to re- * format it to the desired size, so expect the picks to be of a different * size than requested. * * All rights reserverd J.P.C.D.S., Inc. * * This program belongs to J.P.C.D.S., Inc., and may only be used togther * with linkcollector.php to create link sites as described on ownlinksite.com. * Any other copying or use of this program is not permitted. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ***********************************************************************/ var $_url_1; // Url to the image to be downloaded, alterntive 1 // This should be the URL to a pick var $_url_2; // Url to the image to be downloaded, alternative 2 (large) // This could be the URL to a large image, if available var $_img; // The downloaded picture var $_download_ok = false; // Changes to true fter successful download // Picture size var $_old_w; // Picture original width, pixels var $_old_h; // Picture original height, pixels var $_min_old_w=50; // Reject if original width is smaller var $_min_old_h=50; // Reject if original height is smaller var $_k_cut = 1.5; // If 1, the whole picutre used to make pick. // If 2, only half the pictures is used and so on var $_k_size; // Factor: New size/Old size, taking into acount // the re-sized pick must fill both w and h var $_new_w = 80; // Picture width after being re-sized, with default value var $_new_h = 100; // Picture height after being re-sixed, with default value // Reject criteria for GD download var $_min_n_colors=50; // Reject if fewer colors (or greyscales) // NB: If image is very small, this value is reduced automativally. // Reject criteria for non-GD download types var $_min_bytes = 2048; // Reject if downloaded pick is smaller var $_max_bytes = 7168; // Reject if downloaded pick is larger // Paramters determining which methods are available. Innocent until prooven guilty. var $_resize = true; // Functions for re-sizing the pick is available var $_count_colors = true; // Functions for counting colors are available var $_truecolor_ok = true; // The best function for formating image type is available var $_resampled_ok = true; // The best function for image reduction is available var $_url_in_use; // URL in use (either _url_1 or _ur_2) // Feedback to user var $_info_level = 2; // 0: no feedbac // 1: show only errors // 2: show errors and warnings // 3: show error, warnings and general info. var $_message; // Messages generated during download // $_message[1] = array with errors // $_message[2] = array with warnings // $_message[3] = array with general info function getpick($url_1, $url_2=false) { /*********************************************************************** * Constructor. ***********************************************************************/ // Simple checking of url arguments if (strlen($url_1) < 4) { // No sensible main URL given, abandon $this->_message[1][] = "The URL sent as first <i>$url_1</i> argument to constructor was rejected, getpick object is not created"; print $this->messages_to_html(); return 0; } elseif ($url_2 && strlen($url_2) < 4) { // url_2 given, but not sensible $url_2 = false; // Reject if invalide } // Make sure they start with http:// if not from harddisk (ex. c: ...) if( !eregi('^http://',$url_1) && $url_1[1]!=':') $url_1 = 'http://'.$url_1; if($url_2 && !eregi('^http://',$url_2) && $url_2[1]!=':') $url_2 = 'http://'.$url_2; $this->_url_1 = $url_1; $this->_url_2 = $url_2; $this->_url_in_use = $this->_url_1; // Dafault, start by using pick url // Select methods according to this server's setup $this ->selections(); } function selections() { /*********************************************************************** * Determine which methods and which url to use for downloading ***********************************************************************/ // Determine if GD-lib functions used for image resizing is available $resize_functions = array('imagecreatefromjpeg','imagecreate','imagejpeg'); foreach($resize_functions as $resize_function) { $this->_resize *= function_exists($resize_function); // False if any is missing } // If no re-sizing, use the pick url if(!$this->_resize) { $this->_message[2][] = 'Necessary GD-lib funtions for re-sizing the pick to preferred size is not available, so the result may not fit requested size'; } // Make a separate message regarding how the downloader works if(!function_exists('imagecreatetruecolor')) { $this->_truecolor_ok = false; $this->_message[2][] = 'The GD-function <i>imagecreatetruecolor</i> used to create new image when reducing image size does not exist, so the less good <i>imagecreate</i> is being used. Depending on how other parameters are set up, that may lead to blank pictures on some servers. Solution: Install latest GD-library php - go to php.net and search for GD-library for more info., or rent another server with more updated php.'; } // Which function to use for the actual image resize if(!function_exists('imagecopyresampled')) { $this->_resampled_ok = false; $this->_message[2][] = 'The GD-function <i>imagecopyresampled</i> used to reduce image size does not exist, so the. less good <i>imagecopyresized</i> needs to be used. Expect sligthly reduced quality.'; } // Check if necessary functions for counting colors in result are available if(!function_exists('imagecolorat') || !function_exists('imagecreatetruecolor')) { $this->_count_colors = false; $this->_message[2][] = 'The GD-functions <i>imagecolorat</i> and/or <i>imagecreatetruecolor</i>, used to check image quality, is not available in your verion of the GD-library. That increases chances of erronous images being accepted in the results'; } } function messages_to_html() { /*********************************************************************** * Re-format all messages into a html string ***********************************************************************/ // Just return if there are no messages if(!is_array($this->_message) || !$this->_info_level) return 0; $types = array(1=>'<b><font color="#FF0000">Error: </b></font>', 2=>'<b>Warning </b>', 3=>'<b>Info: </b>'); if($this->_info_level == 3) { // Add info. about all variables $vars=array('_url_1','_url_2','_old_w','_old_h', '_new_w','_new_h','_min_bytes','_max_bytes', '_resize','_count_colors','_url_in_use', '_info_level','_k_size','_resampled_ok','_truecolor_ok'); foreach($vars as $var) { $this->_message[3][] = "$var: ".$this->$var; } } $text = ''; foreach($this->_message as $type_code=>$value) { foreach($value as $no => $msg) { if($type_code <= $this->_info_level) { // Should be displayed $text .= $types[$type_code].$msg.'<br>'; } } } return $text; } function gdlib_colors_ok() { /*********************************************************************** * This function is used to check the number of colors in the * resized pick, and used to determine if the final result is OK ***********************************************************************/ $colors = array(); // Determine smalles dimention (width or hight, remove the px-text) $min_dim = min(str_replace('px','',$this->_new_w), str_replace('px','',$this->_new_h)); for($pix_coord=0; $pix_coord<$min_dim; $pix_coord++) { // Define the cell if it does not exist, and count colors $colors[imagecolorat($this->_img,$pix_coord,$pix_coord)] = 1; } // Modify required number of colors if the pick is very small $this->_min_n_colors = min($this->_min_n_colors, $min_dim*.6); if(count($colors) >= $this->_min_n_colors) { // Success! $this->_download_ok = true; return true; } else { $this->_message[3][] = "The downloaded pick contained $n_colors colors"; return false; } } function gdlib_download() { /*********************************************************************** * Download the image using gd-lib ***********************************************************************/ if(!($this->_img = @imagecreatefromjpeg($this->_url_in_use))) { $this->_message[2][] = "Unable to download pick from ". $this->_url_in_use; return false; } $this->_old_w = imagesx($this->_img); $this->_old_h = imagesy($this->_img); // Expect final quality to be too poor if source image too small if($this->_old_w < $this->_min_old_w || $this->_old_h < $this->_min_old_h) { $this->_message[2][] = "The pick turned out to be too small and was rejeted."; return 0; } // Chck if the dowloaded image's size is as smaller than the pick to be created if($this->_old_w < $this->_new_w || $this->_old_h < $this->_new_h) { // If url for a larger version of the image is available, use it if($this->_url_2 && $this->_url_in_use != $this->_url_2) { $this->_url_in_use = $this->_url_2; return $this->gdlib_download(); } else { // Have to accept increasing pick page, make warning and go on with it $this->_message[2][] = "One of the downloaded picks is smaller than the pick to be created. Increasing pick size generally leads to quality reduction. If this warning is generated few times compared to the number of picks generated, it may not be anything to worry about."; } } // Find out how much the picture should be reduced $k_w = $this->_new_w/max(1,$this->_old_w); // Preferred width scaling factor $k_h = $this->_new_h/max(1,$this->_old_h); // Preferred height scaling factor // Only cut away part of image if it does not mean having to incres the size of the rest $this->_k_size = max(max($k_w, $k_h),min(1,$this->_k_cut*max($k_w, $k_h))); if ($this->_truecolor_ok) { // Only on newest php. Best result. $new_pick = imagecreatetruecolor($this->_new_w, $this->_new_h); } else { // Accept the less good imagecreate if imagecreatetruecolor unavailable $new_pick = imagecreate($this->_new_w, $this->_new_h); } $x0 = .5*($this->_old_w-$this->_new_w/$this->_k_size); // Use top center part of pick is if ($this->_resampled_ok) { // Best result, use if available. imagecopyresampled ($new_pick, $this->_img, 0, 0, $x0, 0, $this->_new_w,$this->_new_h, $this->_new_w/$this->_k_size,$this->_new_h/$this->_k_size); } else { imagecopyresized ($new_pick, $this->_img, 0, 0, $x0, 0, $this->_new_w,$this->_new_h, $this->_new_w/$this->_k_size,$this->_new_h/$this->_k_size); } $this->_img = $new_pick; if($this->_count_colors) { // Count colors to estimate image quality if possible return $this->gdlib_colors_ok(); } else {// Have no way to check number of colors, accept by default $n_colors_ok = true; $this->_message[3][] = "Unable to count colors in pick, had to accept by default"; } // Accept if enough colors if($n_colors_ok) { // Probably OK image return ($this->_download_ok = true); } else { $this->_message[2][] = "The downloaded pick contained only $n_colors colors, which is too few, so it was rejected"; return false; } } function direct_download() { /*********************************************************************** * Use this function to read the image if the GD-library * is not available. * * Note that thios is only going to work for picks * (size limits used to accept/reject, and the fat that it cannot be * shrunk later) ***********************************************************************/ if(!$fp = @fopen($this->_url_in_use,"rb")) { $this->_message[2][] = "Unable to read image at URL $this->_url_in_use"; return 0; } $this->_img = fread($fp,$this->_max_bytes); if(strlen($this->_img) == $this->_max_bytes) { $this->_message[2][] = "The image appeared to be larger than the upper limit, which is curently set to ". $this->_max_bytes." bytes. The image was rejected."; return ($this->_img = false); } elseif(strlen($this->_img) < $this->_min_bytes) { $this->_message[2][] = "The image appeared to be small for lower limit upper limit, which is curently set to ". $this->_min_bytes." bytes. The image was rejected."; return ($this->_img = false); } else { return ($this->_download_ok = true); } } function show_pick_gd() { /*********************************************************************** * Shows the pick $this->_img, if there is one. * Note that no other pick must have been sent to screen for * this to work. ***********************************************************************/ if(!@imagejpeg($this->_img,'',100)) { print 'Unable to show the image'; return false; } else { return true; } } function show_pick_direct($file='temp_pick.jpg') { /*********************************************************************** * Show an image downloaded with the direct-function. Used for testing. * It does so by writing it to a temporary file called temp_pick.jpg * and ordering the browser to read from there. ***********************************************************************/ if(strlen($this->_img) >= $this->_min_bytes) { if($fp = fopen($file, 'w')) { fwrite($fp, $this->_img); fclose($fp); print "<img src="$file">"; return true; } else { $this->_message[2][] = "Could not open file $file - please check access permissions."; return false; } } else { $this->_message[2][] = "Found no image to print - has it been downloaded?"; return false; } } function save_pick_gd($file) { /*********************************************************************** * Save the imge using GD-function ***********************************************************************/ if(!imagejpeg($this->_img, $file)) { $this->_message[2][] = "Could not open file $file to save the image - please check access permissions for directory " . eregi_replace("/[^/]*$",'',$file); return false; } } function save_pick_direct($file) { /*********************************************************************** * Saves the image to file $file ***********************************************************************/ if($fp = fopen($file, 'w')) { fwrite($fp, $this->_img); fclose($fp); return 1; } else { $this->_message[2][] = "Could not open file $file to save the image - please check access permissions for directory " . eregi_replace("/[^/]*$",'',$file); return false; } } function download() { /*********************************************************************** * Use appropriate method to download ***********************************************************************/ if($this->_resize) return $this->gdlib_download(); else return $this->direct_download(); } function show_pick() { /*********************************************************************** * Use appropriate method to show the pick ***********************************************************************/ if($this->_resize) return $this->show_pick_gd(); else return $this->show_pick_direct(); } function save_pick($file) { /*********************************************************************** * Use appropriate method to save the pick ***********************************************************************/ if($this->_resize) return $this->save_pick_gd($file); else return $this->save_pick_direct($file); } } // END CLASS getpicks /*BLOCKER*/ // Uncomment the if-line below to protect linkcollector.php from un-authorized use // After un-commenting, the program must be called with the blocker-parameter // (in addition to any other arguments to be passed) like so: // http://your-site.com/ownlinksite/linkcollector.php?blocker=fb6wbee // if($blocker != 'fb6wbee') exit(); // Do the links and picks download using the lincollector class print '<div align="center"><h2>Now getting links and picks.</h2> <b>It may take a up to a few minutes, depending on your Internet connection - please be patient</b><br></div>'; flush(); $c_linkcollector = new linkcollector(); $c_linkcollector->save_everything(); print $c_linkcollector->_result_arr['message']; // Messages from OwnLinksSite server print '<br>'.$c_linkcollector->messages_presentable(); // Messages from linkcollector ?> <?php /*********************************************************************** * * *** links.php PROGRAM LISTING *** * *** How to use is outlined at ownlinksite.com *** * * 07.01.2002 V 1.0 Beta * 22.04.2003 V 1.1 Stable * 26.07.2003 V 2.0 Major update * 30.09.2003 V 2.1 Some small bug fixes * * Place the code in a sub-directory called ownlinksite and name it * links.php. * Also, put pagetransform.php and linkcollector.php in the same directory. * * This program transfers a template link page into an actual, working * php-based link page, as described in the tutorial how_to.php * * All rights reserverd J.P.C.D.S., Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. ***********************************************************************/ class links { var $_n_days_links; // Number of days with links (from today and older) var $_n_days_picks; // Number of days with picks var $_categories_links; // Array with all textlink categories var $_categories_picks; // Array with all pick categories var $_ok_files = array(); // Paths to already downloaded, OK link and pick files function links($n_days_links=0,$n_days_picks=0,$categories_links=0,$categories_picks=0) { /*********************************************************************** * Constructor ***********************************************************************/ // The parameters not passed as arguments should be read from file if(!$n_days_links) { $this->_n_days_links = $this->binary_read('ownlinksite/pagedata/n_days_links.txt'); } else { $this->_n_days_links = $n_days_links; } if(!$n_days_picks) { $this->_n_days_picks = $this->binary_read('ownlinksite/pagedata/n_days_picks.txt'); } else { $this->_n_days_picks = $n_days_picks; } if(!is_array($categories_links)) { $this->_categories_links = array_keys(unserialize($this->binary_read('ownlinksite/pagedata/links_each_cat.txt'))); } else { $this->_categories_links = $categories_links; } if(!is_array($categories_picks)) { $this->_categories_picks = array_keys(unserialize($this->binary_read('ownlinksite/pagedata/picks_each_cat.txt'))); } else { $this->_categories_picks = $categories_picks; } // Check for available links and picks (those downloaded before) $this->downloaded_files(); } function check_downloaded_files($timestamp_start,$links_or_picks='links') { /*********************************************************************** * Fills in _ok_files for links or picks ***********************************************************************/ if($links_or_picks=='links') { $n_days = $this->_n_days_links; $prefix = 'x'; $categories_links = '_categories_links'; } else { // Asume picks $n_days = $this->_n_days_picks; $prefix = 'y'; $categories_links = '_categories_picks'; } // Check for available files, and fill in if missing if(is_array($this->$categories_links)) { foreach($this->$categories_links as $id_category) { if(isset( $link_files)) unset($link_files); // Empty if(isset($no_link_files)) unset($no_link_files); // Empty for($day_of_interest=0; $day_of_interest<$n_days; $day_of_interest++) { $day_index = $this->day_index($timestamp_start,$n_days,$day_of_interest); $file = "ownlinksite/links/$prefix"."_$id_category"."_$day_index.txt"; // Use if it exists. For picks, the picks themselves must also exist. if(file_exists($file) && ($links_or_picks=='links' || $this->all_picks_ok($file,$id_category,$day_index))) { $link_files["$prefix$day_of_interest"] = $file; // OK file } else { $no_link_files ["$prefix$day_of_interest"] = ''; // Cannot use this one } } // If any day of interest for this category does not have a file: Use another if(isset($link_files)) { if(isset($no_link_files) && is_array($link_files)) { $link_copy = $link_files; foreach($no_link_files as $filename=>$file) { $value = array_shift($link_copy); $no_link_files[$filename] = $value; $link_copy[] = $value; // Make sure it does not run dry } $this->_ok_files[$links_or_picks][$id_category] = array_merge($link_fi