Wikipedia Reflection

Ever wished providing the beauty that is Wikipedia on your own website? Now you can: just include this PHP script wherever you want Wikipedia to appear!

Beware of services, e.g. WikiFetcher.com, that charge incredible fees for a very similar thing!
Wikipedia content is free as long as it is attributed, and it must remain free for ever.

The script below can be used free of any charge.

NB: It is highly recommended to temporarily cache pages fetched from Wikipedia. That will assure quicker execution, smaller bandwidth requirements, and also less load on the Wikipedia servers.

Thanks to:

  • Wikipedia voluntary contributors
  • David Polanco and Jim Worthen from Aeonity.com
  • and many others

Future:

  • It would be really cool to be able to edit Wikipedia from another site (perhaps using Ajax?)

All ideas, snippets of code, or financial support towards further development are always very welcome — just contact me.


<?php
# Wiki Reflection Version: 2.3 ( see http://www.vacilando.org/index.php?x=7065 )
# Open source license: GPL

# Make sure to force Unicode for Wikipedia content -- otherwise all foreign scripts will display utter nonsense. This should of course be in your header, though my experimenting shows it may as well stay right here.
echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';

# Make sure images do not display with a border.
echo '<style TYPE="text/css">
  <!--
  img{border: 0 none;}
  -->
  </STYLE>';

$default_title = 'Vacilando'; # If you do not specify a title, this will be your default page.

$sourceurl = 'http://en.wikipedia.org/wiki/'; # This URL needs adjusting sometimes.
$pathfromroot = substr( $_SERVER['REQUEST_URI'], 0, strpos( $_SERVER['REQUEST_URI'], "?" ) );
$title_wiki = $_GET['title'];
if ($title_wiki == "") { $title_wiki = $default_title; }
$nicetitle = str_replace( "_", " ", stripslashes( $title_wiki ) );

function callback( $buffer ) {

  global $nicetitle;
  global $title_wiki;
  global $sourceurl;

  # Separate the article content
  $buffer = substr( $buffer, strpos( $buffer, '<!-- start content -->' ) );
  $buffer = substr( $buffer, 0, strpos( $buffer, '<div class="printfooter">' ) );
  # Replace relative links (use another wiki server)
  $buffer = str_replace( '"/w/skin', '"http://en.wikipedia.org/w/skin', $buffer );
  $buffer = str_replace( '"/skins', '"http://en.wikipedia.org/skins', $buffer );
  # Replace relative links (use this server)
  $buffer = str_replace( '"/wiki/', '"' . $pathfromroot . '?title=', $buffer );
  # Remove edit links
  $buffer = str_replace( ">edit<", "><", $buffer );
  $buffer = str_replace( "[<", "<", $buffer );
  $buffer = str_replace( ">]", ">", $buffer );
  $buffer = str_replace( 'href="/w/index.php?', 'target="_blank" href="http://en.wikipedia.org/w/index.php?', $buffer ); # These are typically links to non-existent pages, so the Wikipedia edit page has to open.

  if ( $buffer <> '' ) {
    $buffer = '<table width=100% cellspacing=0 cellpadding=1 bgcolor="#EEEEEE" border=0><tr><td>
    <p><font size="+2"><b>' . $nicetitle . '</b>&nbsp;<sup><a href="http://en.wikipedia.org/w/index.php?title=' . $title_wiki . '&action=edit" title="Edit this article at Wikipedia" target="_blank"><font color="red" size="-1">edit</font></a></sup></font>
    <br><i><small>extracted from </small><a href="http://www.wikipedia.org" target="_blank"><small>Wikipedia, the Free Encyclopedia</small></a><small>
    (using <a href="http://www.vacilando.org/index.php?x=7065"><small>Wikipedia Reflection Script</small></a>)</small></i></td>
    <td><form method="get"><br><input type="text" name="title" size="30">&nbsp;<input type="submit" value="search"></form></td>
    <td><div align="right"><a href="http://www.gnu.org/copyleft/fdl.html" target="_blank"><img src="_misc/gnu-fdl.png" border="0"></a></div></td></tr></table><p>' . $buffer;
  } else {
    $buffer = '<p>Unfortunately, no content could be extracted!
    <p><a href="javascript:history.go(-1)">Return to the previous page</a> or consult the <a target="_blank" href="' . $sourceurl . $title_wiki . '">Wikipedia article on "' . $nicetitle . '"</a>.';
  }

  return $buffer;
}


# Your page header comes here...'

ob_start("callback");
#include $sourceurl . $title_wiki;
$cuu = new CURL;
echo $cuu -> get( $sourceurl . $title_wiki );
ob_end_flush();

# Your page footer comes here...'



# Define the cURL class:
class CURL {
  var $callback = false;

  function setCallback($func_name) {
    $this->callback = $func_name;
  }

  function doRequest($method, $url, $vars) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    #curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
    #curl_setopt($ch, CURLOPT_USERAGENT, 'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)');
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
    curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
    if ($method == 'POST') {
      curl_setopt($ch, CURLOPT_POST, 1);
      curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);
    }
    $data = curl_exec($ch);
    curl_close($ch);
    if ($data) {
      if ($this->callback)
      {
        $callback = $this->callback;
        $this->callback = false;
        return call_user_func($callback, $data);
      } else {
        return $data;
      }
    } else {
      return curl_error($ch);
    }
  }

  function get($url) {
    return $this->doRequest('GET', $url, 'NULL');
  }

  function post($url, $vars) {
    return $this->doRequest('POST', $url, $vars);
  }
}
?>


My statement published after some e-mails on behalf of Wikimedia Foundation asking me to remove this script:

  1. I don't agree with the Foundation blocking remote loading. We all contribute to the Wikipedia under GFDL and therefore have the right to display the Wikipedia's content. There is no difference between requesting a Wikipedia page via a graphical browser (such as Firefox or Google Chrome) and a command-line browser such as cURL.
  2. The Foundation keeps itself busy blocking remote loading. My own page running this script was blocked. I do not think blocking access is an appropriate way of spending money people donate to the Foundation in hope of increasing free content and openness. While blocking remote loading is not a friendly act taken by the Foundation, in the long term it will prove to be a rather ineffective. A script like this is boringly simple and anyone can write a new one.
  3. Even though my own test application of this script was blocked by Wikimedia Foundation, I prefer to keep the old simple script up on this page as a reminder of my first assertion, and as an inspiration for others to stand up for the freedom on the Internet.

Cheers,

Tomáš Fülöpp

 

Anderlecht, Belgium
Saturday, December 4, 2004

project

Wikipedia mirror open-source

English

Webmention logo