Clicky

Fragmentos útiles para proteger tu blog de WordPress contra scrapers

web scraper

Algunas personas roban nuestros contenidos para mostrarlo en su propio blog

Si tienes un blog o una página web probablemente ya te habrás tenido que enfrentar al problema del scraping de tu contenido: Algunas personas roban nuestros contenidos para mostrarlo en su propio blog, por lo general con un montón de anuncios de Adsense. Éstos son algunos fragmentos de código útiles para ayudar a proteger tu blog contra scrapers.

Forzar tu blog de WordPress a salir de los frames

Algunos scrapers muestran su blog en un marco (o frame) para mantener las ventajas de su contenido, y muestran sus anuncios en otro marco con el fin de tratar de hacer un poco de dinero. Este código hará que tu blog salga de los frames, por lo que el visitante sólo podrá ver tu blog, no el  sitio del scrapper.

Sólo tienes que pegar el código de abajo en tu archivo functions.php , guardarlo, y ya está.

// Break Out of Frames for WordPress
function break_out_of_frames() {
    if (!is_preview()) {
        echo "\n<script type=\"text/javascript\">";
        echo "\n<!--";
        echo "\nif (parent.frames.length > 0) { parent.location.href = location.href; }";
        echo "\n-->";
        echo "\n</script>\n\n";
    }
}
add_action('wp_head', 'break_out_of_frames');

También puedes añadir esto en tu archivo .htaccess :

Header append X-Frame-Options SAMEORIGIN

Proteger tu blog contra el hotlinking a imágenes

La mayoría de los scrapers sólo tiene que utilizar tu feed RSS y mostrarlo en tu sitio, lo que significa que también utilizan las imágenes originales en sus sitios y consumen el ancho de banda del servidor de nuestros propios sitios web. Así que definitivamente se puede usar esto para informar al lector que está leyendo un artículo robado de otro blog.

Vamos a crear una pequeña imagen que dice algo así como "Este artículo ha sido robado de www.misitio.com" y subirlo a tu servidor de blogs. A continuación, edita el archivo htaccess. , (ubicado en el directorio raíz del blog de WordPress o cualquier otro CMS) y añade este código al mismo:

RewriteEngine On
#Cambia ?misitio\.com/ por la url de tu blog
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?misitio\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
#Cambia /images/nohotlink.jpg por la url de la imagen que queremos mostrar
RewriteRule .*\.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]

He aquí en acción un ejemplo divertido de esta técnica:

hotlinking fail

En Vista al Mar lo tengo así como explico en: Cómo intentar recuperar las visitas perdidas por el nuevo diseño de Imágenes de Google

Añadir automáticamente un enlace a tus títulos de post

Como la mayoría de los ladrones de contenido utilizan herramientas de scraper automáticas, van a desguazar todo tu contenido, incluyendo el título de la entrada. Una buena manera de desalentar a los scrapers es poner automáticamente un enlace en tus títulos de los post, por lo que cada post robado enlazará automáticamente a su post original.

Para hacerlo en WordPress, simplemente abre tu archivo single.php y busca en donde aparece el título. A continuación, reemplaza el código por el siguiente texto:

<h1>
  <a href="/<?php el_linkpermanente(); ?>"><?php el_titulo(); ?></a>
</h1>

Añadir automáticamente un enlace a tus posts originales en formato RSS

Otra forma útil para luchar contra el robo de contenidos es insertar automáticamente un aviso de derechos de autor con un link a la publicación original en cada artículo RSS. De esta manera, los scrapers que usan tu feed RSS para publicar tu contenido en sus propios sitios, también publicará de forma automática el aviso de copyright y el vínculo de retroceso.

Sólo tienes que añadir el siguiente código a tu archivo functions.php. El aviso de copyright puede ser personalizado en la línea 4.

// add custom feed content
function add_feed_content($content) {
    if(is_feed()) {
        $content .= '<p>Este artículo tiene copyright &copy; '.date('Y').'&nbsp;'.bloginfo('name').'</p>';
    }
    return $content;
}
add_filter('the_excerpt_rss', 'add_feed_content');
add_filter('the_content', 'add_feed_content');

Crear un feed RSS personalizado

Mientras que la técnica anterior es buena, sólo muestra un pequeño aviso en la parte inferior de tus mensajes. Es posible que desees un análisis más en profundidad de la solución, que permite limitar el número de caracteres que aparecen en cada elemento del feed RSS.

Aquí está un código de plantilla de página para usar con WordPress que se puede personalizar fácilmente para adaptarla a tus necesidades específicas.


<?php
/*
Template Name: Custom Feed
*/
$numposts = 5;
function yoast_rss_date( $timestamp = null ) {
  $timestamp = ($timestamp==null) ? time() : $timestamp;
  echo date(DATE_RSS, $timestamp);
}
function yoast_rss_text_limit($string, $length, $replacer = '...') {
  $string = strip_tags($string);
  if(strlen($string) > $length)
    return (preg_match('/^(.*)\W.*$/', substr($string, 0, $length+1), $matches) ? $matches[1] : substr($string, 0, $length)) . $replacer;   
  return $string;
}
$posts = query_posts('showposts='.$numposts);
$lastpost = $numposts - 1;
header("Content-Type: application/rss+xml; charset=UTF-8");
echo '<?xml version="1.0"?>';
?><rss version="2.0">
<channel>
  <title>Yoast E-mail Update</title>
  <link>http://yoast.com/</link>
  <description>The latest blog posts from Yoast.com.</description>
  <language>en-us</language>
  <pubDate><?php yoast_rss_date( strtotime($ps[$lastpost]->post_date_gmt) ); ?></pubDate>
  <lastBuildDate><?php yoast_rss_date( strtotime($ps[$lastpost]->post_date_gmt) ); ?></lastBuildDate>
  <managingEditor>Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.</managingEditor>
<?php foreach ($posts as $post) { ?>
  <item>
    <title><?php echo get_the_title($post->ID); ?></title>
    <link><?php echo get_permalink($post->ID); ?></link>
    <description><?php echo '<![CDATA['.yoast_rss_text_limit($post->post_content, 500).'<br/><br/>Keep on reading: <a href="'.get_permalink($post->ID).'">'.get_the_title($post->ID).'</a>'.']]>';  ?></description>
    <pubDate><?php yoast_rss_date( strtotime($post->post_date_gmt) ); ?></pubDate>
    <guid><?php echo get_permalink($post->ID); ?></guid>
  </item>
<?php } ?>
</channel>
</rss>

 

Jesus_Caceres