/** * A simple set of functions to check our version 1.0 update service. * * @package WordPress * @since 2.3.0 */ /** * Check WordPress version against the newest version. * * The WordPress version, PHP version, and Locale is sent. Checks against the * WordPress server at api.wordpress.org server. Will only check if WordPress * isn't installing. * * @since 2.3.0 * @uses $wp_version Used to check against the newest WordPress version. * * @param array $extra_stats Extra statistics to report to the WordPress.org API. * @param bool $force_check Whether to bypass the transient cache and force a fresh update check. Defaults to false, true if $extra_stats is set. * @return mixed Returns null if update is unsupported. Returns false if check is too soon. */ function wp_version_check( $extra_stats = array(), $force_check = false ) { if ( defined('WP_INSTALLING') ) return; global $wpdb, $wp_local_package; include( ABSPATH . WPINC . '/version.php' ); // include an unmodified $wp_version $php_version = phpversion(); $current = get_site_transient( 'update_core' ); $translations = wp_get_installed_translations( 'core' ); // Invalidate the transient when $wp_version changes if ( is_object( $current ) && $wp_version != $current->version_checked ) $current = false; if ( ! is_object($current) ) { $current = new stdClass; $current->updates = array(); $current->version_checked = $wp_version; } if ( ! empty( $extra_stats ) ) $force_check = true; // Wait 60 seconds between multiple version check requests $timeout = 60; $time_not_changed = isset( $current->last_checked ) && $timeout > ( time() - $current->last_checked ); if ( ! $force_check && $time_not_changed ) return false; $locale = get_locale(); /** * Filter the locale requested for WordPress core translations. * * @since 2.8.0 * * @param string $locale Current locale. */ $locale = apply_filters( 'core_version_check_locale', $locale ); // Update last_checked for current to prevent multiple blocking requests if request hangs $current->last_checked = time(); set_site_transient( 'update_core', $current ); if ( method_exists( $wpdb, 'db_version' ) ) $mysql_version = preg_replace('/[^0-9.].*/', '', $wpdb->db_version()); else $mysql_version = 'N/A'; if ( is_multisite() ) { $user_count = get_user_count(); $num_blogs = get_blog_count(); $wp_install = network_site_url(); $multisite_enabled = 1; } else { $user_count = count_users(); $user_count = $user_count['total_users']; $multisite_enabled = 0; $num_blogs = 1; $wp_install = home_url( '/' ); } $query = array( 'version' => $wp_version, 'php' => $php_version, 'locale' => $locale, 'mysql' => $mysql_version, 'local_package' => isset( $wp_local_package ) ? $wp_local_package : '', 'blogs' => $num_blogs, 'users' => $user_count, 'multisite_enabled' => $multisite_enabled, ); $post_body = array( 'translations' => json_encode( $translations ), ); if ( is_array( $extra_stats ) ) $post_body = array_merge( $post_body, $extra_stats ); $url = $http_url = 'http://api.wordpress.org/core/version-check/1.7/?' . http_build_query( $query, null, '&' ); if ( $ssl = wp_http_supports( array( 'ssl' ) ) ) $url = set_url_scheme( $url, 'https' ); $options = array( 'timeout' => ( ( defined('DOING_CRON') && DOING_CRON ) ? 30 : 3 ), 'user-agent' => 'WordPress/' . $wp_version . '; ' . home_url( '/' ), 'headers' => array( 'wp_install' => $wp_install, 'wp_blog' => home_url( '/' ) ), 'body' => $post_body, ); $response = wp_remote_post( $url, $options ); if ( $ssl && is_wp_error( $response ) ) { trigger_error( __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server’s configuration. If you continue to have problems, please try the support forums.' ) . ' ' . __( '(WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.)' ), headers_sent() || WP_DEBUG ? E_USER_WARNING : E_USER_NOTICE ); $response = wp_remote_post( $http_url, $options ); } if ( is_wp_error( $response ) || 200 != wp_remote_retrieve_response_code( $response ) ) return false; $body = trim( wp_remote_retrieve_body( $response ) ); $body = json_decode( $body, true ); if ( ! is_array( $body ) || ! isset( $body['offers'] ) ) return false; $offers = $body['offers']; foreach ( $offers as &$offer ) { foreach ( $offer as $offer_key => $value ) { if ( 'packages' == $offer_key ) $offer['packages'] = (object) array_intersect_key( array_map( 'esc_url', $offer['packages'] ), array_fill_keys( array( 'full', 'no_content', 'new_bundled', 'partial', 'rollback' ), '' ) ); elseif ( 'download' == $offer_key ) $offer['download'] = esc_url( $value ); else $offer[ $offer_key ] = esc_html( $value ); } $offer = (object) array_intersect_key( $offer, array_fill_keys( array( 'response', 'download', 'locale', 'packages', 'current', 'version', 'php_version', 'mysql_version', 'new_bundled', 'partial_version', 'notify_email', 'support_email' ), '' ) ); } $updates = new stdClass(); $updates->updates = $offers; $updates->last_checked = time(); $updates->version_checked = $wp_version; if ( isset( $body['translations'] ) ) $updates->translations = $body['translations']; set_site_transient( 'update_core', $updates ); if ( ! empty( $body['ttl'] ) ) { $ttl = (int) $body['ttl']; if ( $ttl && ( time() + $ttl < wp_next_scheduled( 'wp_version_check' ) ) ) { // Queue an event to re-run the update check in $ttl seconds. wp_schedule_single_event( time() + $ttl, 'wp_version_check' ); } } // Trigger a background updates check if running non-interactively, and we weren't called from the update handler. if ( defined( 'DOING_CRON' ) && DOING_CRON && ! doing_action( 'wp_maybe_auto_update' ) ) { do_action( 'wp_maybe_auto_update' ); } } /** * Check plugin versions against the latest versions hosted on WordPress.org. * * The WordPress version, PHP version, and Locale is sent along with a list of * all plugins installed. Checks against the WordPress server at * api.wordpress.org. Will only check if WordPress isn't installing. * * @since 2.3.0 * @uses $wp_version Used to notify the WordPress version. * * @param array $extra_stats Extra statistics to report to the WordPress.org API. * @return mixed Returns null if update is unsupported. Returns false if check is too soon. */ function wp_update_plugins( $extra_stats = array() ) { include( ABSPATH . WPINC . '/version.php' ); // include an unmodified $wp_version if ( defined('WP_INSTALLING') ) return false; // If running blog-side, bail unless we've not checked in the last 12 hours if ( !function_exists( 'get_plugins' ) ) require_once( ABSPATH . 'wp-admin/includes/plugin.php' ); $plugins = get_plugins(); $translations = wp_get_installed_translations( 'plugins' ); $active = get_option( 'active_plugins', array() ); $current = get_site_transient( 'update_plugins' ); if ( ! is_object($current) ) $current = new stdClass; $new_option = new stdClass; $new_option->last_checked = time(); // Check for update on a different schedule, depending on the page. switch ( current_filter() ) { case 'upgrader_process_complete' : $timeout = 0; break; case 'load-update-core.php' : $timeout = MINUTE_IN_SECONDS; break; case 'load-plugins.php' : case 'load-update.php' : $timeout = HOUR_IN_SECONDS; break; default : if ( defined( 'DOING_CRON' ) && DOING_CRON ) { $timeout = 0; } else { $timeout = 12 * HOUR_IN_SECONDS; } } $time_not_changed = isset( $current->last_checked ) && $timeout > ( time() - $current->last_checked ); if ( $time_not_changed && ! $extra_stats ) { $plugin_changed = false; foreach ( $plugins as $file => $p ) { $new_option->checked[ $file ] = $p['Version']; if ( !isset( $current->checked[ $file ] ) || strval($current->checked[ $file ]) !== strval($p['Version']) ) $plugin_changed = true; } if ( isset ( $current->response ) && is_array( $current->response ) ) { foreach ( $current->response as $plugin_file => $update_details ) { if ( ! isset($plugins[ $plugin_file ]) ) { $plugin_changed = true; break; } } } // Bail if we've checked recently and if nothing has changed if ( ! $plugin_changed ) return false; } // Update last_checked for current to prevent multiple blocking requests if request hangs $current->last_checked = time(); set_site_transient( 'update_plugins', $current ); $to_send = compact( 'plugins', 'active' ); $locales = array( get_locale() ); /** * Filter the locales requested for plugin translations. * * @since 3.7.0 * * @param array $locales Plugin locale. Default is current locale of the site. */ $locales = apply_filters( 'plugins_update_check_locales', $locales ); if ( defined( 'DOING_CRON' ) && DOING_CRON ) { $timeout = 30; } else { // Three seconds, plus one extra second for every 10 plugins $timeout = 3 + (int) ( count( $plugins ) / 10 ); } $options = array( 'timeout' => $timeout, 'body' => array( 'plugins' => json_encode( $to_send ), 'translations' => json_encode( $translations ), 'locale' => json_encode( $locales ), 'all' => json_encode( true ), ), 'user-agent' => 'WordPress/' . $wp_version . '; ' . get_bloginfo( 'url' ) ); if ( $extra_stats ) { $options['body']['update_stats'] = json_encode( $extra_stats ); } $url = $http_url = 'http://api.wordpress.org/plugins/update-check/1.1/'; if ( $ssl = wp_http_supports( array( 'ssl' ) ) ) $url = set_url_scheme( $url, 'https' ); $raw_response = wp_remote_post( $url, $options ); if ( $ssl && is_wp_error( $raw_response ) ) { trigger_error( __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server’s configuration. If you continue to have problems, please try the support forums.' ) . ' ' . __( '(WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.)' ), headers_sent() || WP_DEBUG ? E_USER_WARNING : E_USER_NOTICE ); $raw_response = wp_remote_post( $http_url, $options ); } if ( is_wp_error( $raw_response ) || 200 != wp_remote_retrieve_response_code( $raw_response ) ) return false; $response = json_decode( wp_remote_retrieve_body( $raw_response ), true ); foreach ( $response['plugins'] as &$plugin ) { $plugin = (object) $plugin; } unset( $plugin ); foreach ( $response['no_update'] as &$plugin ) { $plugin = (object) $plugin; } unset( $plugin ); if ( is_array( $response ) ) { $new_option->response = $response['plugins']; $new_option->translations = $response['translations']; // TODO: Perhaps better to store no_update in a separate transient with an expiry? $new_option->no_update = $response['no_update']; } else { $new_option->response = array(); $new_option->translations = array(); $new_option->no_update = array(); } set_site_transient( 'update_plugins', $new_option ); } /** * Check theme versions against the latest versions hosted on WordPress.org. * * A list of all themes installed in sent to WP. Checks against the * WordPress server at api.wordpress.org. Will only check if WordPress isn't * installing. * * @since 2.7.0 * @uses $wp_version Used to notify the WordPress version. * * @param array $extra_stats Extra statistics to report to the WordPress.org API. * @return mixed Returns null if update is unsupported. Returns false if check is too soon. */ function wp_update_themes( $extra_stats = array() ) { include( ABSPATH . WPINC . '/version.php' ); // include an unmodified $wp_version if ( defined( 'WP_INSTALLING' ) ) return false; $installed_themes = wp_get_themes(); $translations = wp_get_installed_translations( 'themes' ); $last_update = get_site_transient( 'update_themes' ); if ( ! is_object($last_update) ) $last_update = new stdClass; $themes = $checked = $request = array(); // Put slug of current theme into request. $request['active'] = get_option( 'stylesheet' ); foreach ( $installed_themes as $theme ) { $checked[ $theme->get_stylesheet() ] = $theme->get('Version'); $themes[ $theme->get_stylesheet() ] = array( 'Name' => $theme->get('Name'), 'Title' => $theme->get('Name'), 'Version' => $theme->get('Version'), 'Author' => $theme->get('Author'), 'Author URI' => $theme->get('AuthorURI'), 'Template' => $theme->get_template(), 'Stylesheet' => $theme->get_stylesheet(), ); } // Check for update on a different schedule, depending on the page. switch ( current_filter() ) { case 'upgrader_process_complete' : $timeout = 0; break; case 'load-update-core.php' : $timeout = MINUTE_IN_SECONDS; break; case 'load-themes.php' : case 'load-update.php' : $timeout = HOUR_IN_SECONDS; break; default : if ( defined( 'DOING_CRON' ) && DOING_CRON ) { $timeout = 0; } else { $timeout = 12 * HOUR_IN_SECONDS; } } $time_not_changed = isset( $last_update->last_checked ) && $timeout > ( time() - $last_update->last_checked ); if ( $time_not_changed && ! $extra_stats ) { $theme_changed = false; foreach ( $checked as $slug => $v ) { if ( !isset( $last_update->checked[ $slug ] ) || strval($last_update->checked[ $slug ]) !== strval($v) ) $theme_changed = true; } if ( isset ( $last_update->response ) && is_array( $last_update->response ) ) { foreach ( $last_update->response as $slug => $update_details ) { if ( ! isset($checked[ $slug ]) ) { $theme_changed = true; break; } } } // Bail if we've checked recently and if nothing has changed if ( ! $theme_changed ) return false; } // Update last_checked for current to prevent multiple blocking requests if request hangs $last_update->last_checked = time(); set_site_transient( 'update_themes', $last_update ); $request['themes'] = $themes; $locales = array( get_locale() ); /** * Filter the locales requested for theme translations. * * @since 3.7.0 * * @param array $locales Theme locale. Default is current locale of the site. */ $locales = apply_filters( 'themes_update_check_locales', $locales ); if ( defined( 'DOING_CRON' ) && DOING_CRON ) { $timeout = 30; } else { // Three seconds, plus one extra second for every 10 themes $timeout = 3 + (int) ( count( $themes ) / 10 ); } $options = array( 'timeout' => $timeout, 'body' => array( 'themes' => json_encode( $request ), 'translations' => json_encode( $translations ), 'locale' => json_encode( $locales ), ), 'user-agent' => 'WordPress/' . $wp_version . '; ' . get_bloginfo( 'url' ) ); if ( $extra_stats ) { $options['body']['update_stats'] = json_encode( $extra_stats ); } $url = $http_url = 'http://api.wordpress.org/themes/update-check/1.1/'; if ( $ssl = wp_http_supports( array( 'ssl' ) ) ) $url = set_url_scheme( $url, 'https' ); $raw_response = wp_remote_post( $url, $options ); if ( $ssl && is_wp_error( $raw_response ) ) { trigger_error( __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server’s configuration. If you continue to have problems, please try the support forums.' ) . ' ' . __( '(WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.)' ), headers_sent() || WP_DEBUG ? E_USER_WARNING : E_USER_NOTICE ); $raw_response = wp_remote_post( $http_url, $options ); } if ( is_wp_error( $raw_response ) || 200 != wp_remote_retrieve_response_code( $raw_response ) ) return false; $new_update = new stdClass; $new_update->last_checked = time(); $new_update->checked = $checked; $response = json_decode( wp_remote_retrieve_body( $raw_response ), true ); if ( is_array( $response ) ) { $new_update->response = $response['themes']; $new_update->translations = $response['translations']; } set_site_transient( 'update_themes', $new_update ); } /** * Performs WordPress automatic background updates. * * @since 3.7.0 */ function wp_maybe_auto_update() { include_once( ABSPATH . '/wp-admin/includes/admin.php' ); include_once( ABSPATH . '/wp-admin/includes/class-wp-upgrader.php' ); $upgrader = new WP_Automatic_Updater; $upgrader->run(); } /** * Retrieves a list of all language updates available. * * @since 3.7.0 */ function wp_get_translation_updates() { $updates = array(); $transients = array( 'update_core' => 'core', 'update_plugins' => 'plugin', 'update_themes' => 'theme' ); foreach ( $transients as $transient => $type ) { $transient = get_site_transient( $transient ); if ( empty( $transient->translations ) ) continue; foreach ( $transient->translations as $translation ) { $updates[] = (object) $translation; } } return $updates; } /** * Collect counts and UI strings for available updates * * @since 3.3.0 * * @return array */ function wp_get_update_data() { $counts = array( 'plugins' => 0, 'themes' => 0, 'wordpress' => 0, 'translations' => 0 ); if ( $plugins = current_user_can( 'update_plugins' ) ) { $update_plugins = get_site_transient( 'update_plugins' ); if ( ! empty( $update_plugins->response ) ) $counts['plugins'] = count( $update_plugins->response ); } if ( $themes = current_user_can( 'update_themes' ) ) { $update_themes = get_site_transient( 'update_themes' ); if ( ! empty( $update_themes->response ) ) $counts['themes'] = count( $update_themes->response ); } if ( ( $core = current_user_can( 'update_core' ) ) && function_exists( 'get_core_updates' ) ) { $update_wordpress = get_core_updates( array('dismissed' => false) ); if ( ! empty( $update_wordpress ) && ! in_array( $update_wordpress[0]->response, array('development', 'latest') ) && current_user_can('update_core') ) $counts['wordpress'] = 1; } if ( ( $core || $plugins || $themes ) && wp_get_translation_updates() ) $counts['translations'] = 1; $counts['total'] = $counts['plugins'] + $counts['themes'] + $counts['wordpress'] + $counts['translations']; $titles = array(); if ( $counts['wordpress'] ) $titles['wordpress'] = sprintf( __( '%d WordPress Update'), $counts['wordpress'] ); if ( $counts['plugins'] ) $titles['plugins'] = sprintf( _n( '%d Plugin Update', '%d Plugin Updates', $counts['plugins'] ), $counts['plugins'] ); if ( $counts['themes'] ) $titles['themes'] = sprintf( _n( '%d Theme Update', '%d Theme Updates', $counts['themes'] ), $counts['themes'] ); if ( $counts['translations'] ) $titles['translations'] = __( 'Translation Updates' ); $update_title = $titles ? esc_attr( implode( ', ', $titles ) ) : ''; $update_data = array( 'counts' => $counts, 'title' => $update_title ); /** * Filter the returned array of update data for plugins, themes, and WordPress core. * * @since 3.5.0 * * @param array $update_data { * Fetched update data. * * @type array $counts An array of counts for available plugin, theme, and WordPress updates. * @type string $update_title Titles of available updates. * } * @param array $titles An array of update counts and UI strings for available updates. */ return apply_filters( 'wp_get_update_data', $update_data, $titles ); } function _maybe_update_core() { include( ABSPATH . WPINC . '/version.php' ); // include an unmodified $wp_version $current = get_site_transient( 'update_core' ); if ( isset( $current->last_checked ) && 12 * HOUR_IN_SECONDS > ( time() - $current->last_checked ) && isset( $current->version_checked ) && $current->version_checked == $wp_version ) return; wp_version_check(); } /** * Check the last time plugins were run before checking plugin versions. * * This might have been backported to WordPress 2.6.1 for performance reasons. * This is used for the wp-admin to check only so often instead of every page * load. * * @since 2.7.0 * @access private */ function _maybe_update_plugins() { $current = get_site_transient( 'update_plugins' ); if ( isset( $current->last_checked ) && 12 * HOUR_IN_SECONDS > ( time() - $current->last_checked ) ) return; wp_update_plugins(); } /** * Check themes versions only after a duration of time. * * This is for performance reasons to make sure that on the theme version * checker is not run on every page load. * * @since 2.7.0 * @access private */ function _maybe_update_themes() { $current = get_site_transient( 'update_themes' ); if ( isset( $current->last_checked ) && 12 * HOUR_IN_SECONDS > ( time() - $current->last_checked ) ) return; wp_update_themes(); } /** * Schedule core, theme, and plugin update checks. * * @since 3.1.0 */ function wp_schedule_update_checks() { if ( !wp_next_scheduled('wp_version_check') && !defined('WP_INSTALLING') ) wp_schedule_event(time(), 'twicedaily', 'wp_version_check'); if ( !wp_next_scheduled('wp_update_plugins') && !defined('WP_INSTALLING') ) wp_schedule_event(time(), 'twicedaily', 'wp_update_plugins'); if ( !wp_next_scheduled('wp_update_themes') && !defined('WP_INSTALLING') ) wp_schedule_event(time(), 'twicedaily', 'wp_update_themes'); if ( ( wp_next_scheduled( 'wp_maybe_auto_update' ) > ( time() + HOUR_IN_SECONDS ) ) && ! defined('WP_INSTALLING') ) wp_clear_scheduled_hook( 'wp_maybe_auto_update' ); } if ( ( ! is_main_site() && ! is_network_admin() ) || ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ) return; add_action( 'admin_init', '_maybe_update_core' ); add_action( 'wp_version_check', 'wp_version_check' ); add_action( 'upgrader_process_complete', 'wp_version_check', 10, 0 ); add_action( 'load-plugins.php', 'wp_update_plugins' ); add_action( 'load-update.php', 'wp_update_plugins' ); add_action( 'load-update-core.php', 'wp_update_plugins' ); add_action( 'admin_init', '_maybe_update_plugins' ); add_action( 'wp_update_plugins', 'wp_update_plugins' ); add_action( 'upgrader_process_complete', 'wp_update_plugins', 10, 0 ); add_action( 'load-themes.php', 'wp_update_themes' ); add_action( 'load-update.php', 'wp_update_themes' ); add_action( 'load-update-core.php', 'wp_update_themes' ); add_action( 'admin_init', '_maybe_update_themes' ); add_action( 'wp_update_themes', 'wp_update_themes' ); add_action( 'upgrader_process_complete', 'wp_update_themes', 10, 0 ); add_action( 'wp_maybe_auto_update', 'wp_maybe_auto_update' ); add_action('init', 'wp_schedule_update_checks'); Reutilizando datos de congreso.esSesiónDeControl.com
Arrow

Reutilizar datos de congreso.es


2
Miguel Ángel Gonzalo

Archivero-Bibliotecario de las Cortes Generales de España. Webmaster de www.congreso.es


Escrito el 1 de octubre de 2013 a las 18:59 | Clasificado en Ciudadanía, Tecnología

Tan importante como que existan portales open data que cumplan los requisitos de calidad es que existan proyectos y aplicaciones de reutilización. Los datos de la web del Congreso son utilizados en aplicaciones diversas para conocer mejor el trabajo de los parlamentarios.

Logos de algunos de los proyectos de reutilización de la información parlamentaria de congreso.es.
Logos de algunos de los proyectos de reutilización de la información parlamentaria de congreso.es.

En España están disponibles ahora mismo 7.250 datasets públicos dentro de más 20 portales de datos abiertos de las administraciones públicas, dentro de un movimiento creciente favorable a la apertura de los datos públicos que es extremadamente saludable en términos de mejora de la democracia. Una pregunta interesante es cuántas aplicaciones están utilizando, de una manera positiva para la ciudadanía, ese caudal de datos públicos.

Marc Garriga explicaba brillantemente hace unos días las razones por las cuales no se utilizan todavía suficientemente los datos públicos. Por la parte de la oferta, citaba la baja calidad de los datos abiertos, el no ajustarse a la demanda del público reutilizador, mala identificación de los datos, licencias de uso demasiado restrictivas y la falta de una información de contexto que ayude a entender los datos que se ponen a disposición del reutilizador. Por la parte de la demanda, Garriga citó la desconfianza en que las administraciones vayan a ser constantes y perseverantes en la apertura de los datos, de forma que se justifique el esfuerzo, o el simple desconocimiento de que esos datos están ahí.

Se suele pensar en la futura ley de transparencia como una ley de acceso a la información, lo cual es así, pero no hay que olvidar que en España ya existían, en desarrollo del artículo 105.b) de la Constitucion Española, con carácter fragmentado o limitado y sin consideración de derecho fundamental, diversas leyes de acceso a la información. Desde las primeras leyes de archivos como la Ley 16/1985, de 25 de junio, del Patrimonio Histórico Español, pasando por las leyes de procedimiento administrativo como la Ley 30/1992 de Régimen Jurídico de las Administraciones Públicas y del Procedimiento Administrativo Común; o  leyes sectoriales como la Ley 27/2006, de 18 de julio, que regula los derechos de acceso a la información, de participación pública y acceso a la Justicia en materia de Medio Ambiente.

Especialmente relevante en este momento es la Ley 37/2007, de 16 de noviembre, sobre reutilización de la información del sector público, que establece las condiciones según las cuales los documentos de las Administraciones y organismos del sector público son reutilizables. En la ley se fijan las condiciones de su uso que son básicamente tres:

  • Reutilización de documentos puestos a disposición del público sin sujeción a condiciones.
  • Reutilización de documentos puestos a disposición del público con sujeción a condiciones establecidas en licencias-tipo.
  • Reutilización de documentos previa solicitud.

En este marco se fija la política de uso de la información ofrecida en la página web del Congreso de los Diputados. En el aviso legal que figura en su web se dice que :

“La información disponible en el sitio web www.congreso.es es susceptible de reutilización y es puesta a disposición del público sin sujeción a condiciones. La reutilización de los contenidos debe cumplir los siguientes criterios:

a) Que el contenido de la información no sea alterado.
b) Que no se desnaturalice el sentido de la información.
c) Que se cite la fuente.
d) Que se mencione la fecha de la última actualización.
e) Que siga un principio de acceso publico y de no exclusividad”.

Estas condiciones, que son las más abiertas de las posibles incluidas en la ley 37/2007, son las que se aplican a todos los proyectos de reutilización de la información que se han puesto en marcha.

El Congreso, a través de su Centro de Tecnologías de la Información y la Comunicación, e impulsado por la Junta de Informática y la Mesa del Congreso, ha puesto a disposición de la ciudadanía, a través de la web del Congreso, los datos de las votaciones celebradas en las sesiones plenarias desde enero de 2012. Se ofrecen en un fichero XML descargable. Son los únicos datos disponibles en un formato open data homologable a los requisitos comunmente establecidos, pero, sin duda, suponen un primer paso y una apuesta de la cámara por ofrecer sus datos en formatos accesibles, abiertos y que permitan al máximo su reutilización como establece el futuro art. 11 c) del Proyecto de Ley de Transparencia.

El resto de los datos utilizados en los diversos proyectos de reutilización que se comentarán más adelante se han obtenido mediante la técnica del “web scraping“, que tiene el inconveniente de depender de la propia estructura de navegación y otros elementos de la página web. Cualquier cambio en la página web no comunicado o no detectado por las organizaciones provoca que la actualización de los datos ya no sea posible.

Aún así, el alto número de proyectos de reutilización de datos de congreso.es, lejos de ser una amenaza, es una oportunidad para verificar cuáles son los datos de mayor interés y pone de relieve que la información existente en la web es relevante y oportuna para los intereses ciudadanos, aunque todavía no pueda ser ofrecida en los formatos abiertos que son reclamados.

La existencia de estos proyectos de reutilización sirve, además, de excelente banco de pruebas para identificar cuáles son los datos que interesa más abrir, ya que son los más demandados. Es evidente que si las organizaciones sociales están poniendo el foco en los datos sobre composición de la cámara, iniciativas legislativas, votaciones, contacto con los diputados, deberían ser éstas las prioridades sobre las que habría que trabajar en un futuro.

Es cierto que el volumen de datos calificables como “open data” en la web es reducido, pero, posiblemente, como comentaba hace unos días José Felix Ontañón, existan en este momento en nuestro país portales open data con un número de app que utilicen esos datos inferior a las que tiene ahora mismo congreso.es. Eso no es motivo para dormirse en los laureles, sino todo lo contrario, debe servir para estudiar esas aplicaciones e identificar los puntos de interés ciudadano en la información que actualmente contiene el portal parlamentario del Congreso.

Algunos de los proyectos que utilizan total o parcialmente datos de la página web son los siguientes.

1. Widget del Congreso de los Diputados, elaborado por Antoni Gutierrez-Rubi y David Álvarez.

Consiste en la recopilación de los datos de contacto de diputados (correo electrónico y redes sociales), así como de su pertenencia a órganos de la cámara. No es exactamente un proyecto de reutilización ya que, para su elaboración también utilizan datos que consiguen directamente de otras fuentes, como los otros parlamentarios, pero por su larga trayectoria y su utilidad bien vale la pena destacarlo. Su valor añadido está en poner el foco en la necesidad de diálogo con herramientas actualizadas y sencillas para contactar con los parlamentarios.

2. Aplicación “Qué hacen los Diputados”.

Impulsada desde el blog del mismo nombre y soportada por una exitosa campaña de crowfounding en goteo.org, consiste en una aplicación web opensource de seguimiento y visualización del trabajo de los diputados/as del Congreso. Como explican los promotores:

“La parte primordial de la web consiste en ofrecer un acceso libre y sencillo a la información disponible de cada diputado (biografía, iniciativas, intervenciones, votaciones). Dicha información estará disponible en diferentes formatos (json, xml, csv) con el objetivo de facilitar su reutilización. También ofreceremos interpretaciones de los datos que recopilemos a través del blog”.

3. Proyecto Avizor.

El Proyecto Avizor es una iniciativa de seguimiento y evaluación de la actividad parlamentaria en todo lo relativo a las políticas españolas que mayor impacto tienen sobre la pobreza y el desarrollo internacional. A través de un buscador se puede consultar todo lo que en el Congreso se decide y discute sobre estos temas. Una sencilla metodología permite otorgar puntuación a cada acto parlamentario y elaborar un ranking de diputados y grupos parlamentarios, en relación con su compromiso y aportación política a la lucha contra la pobreza.

No es tampoco un proyecto de reutilización de la información y los datos en sentido estricto pero, sin duda, es uno de los proyectos que analiza más y mejor los datos que se publican en la página web, y, además, proporcionando una cualificación a la información tratada.

Una de las claves del proyecto, que conecta perfectamente, con la finalidad de la reutilización de los datos públicos es facilitar el paso “de la disponibilidad de información al acceso efectivo a la misma”. Es decir, un primer paso indispensable es que los datos estén en las páginas web parlamentarias pero no menos importante es que las organizaciones de monitorización parlamentaria los usen para dotarles de profundidad y contexto.

4. Proyecto Colibrí.

Como ellos mismos se definen el Proyecto Colibrí  “es una iniciativa ciudadana que pretende servir de puente entre la comunidad de programadores y periodistas y la web del Congreso para así facilitar el acceso a la información que en dicha web se puede encontrar”. Ofrecen una API basada en servicios REST para la utilización de los datos del Proyecto.

El proyecto surge dentro de uno más amplio llamado “Openkratio” que está formado por ciudadanos motivados por impulsar en la sociedad los principios del Gobierno y los Datos Abiertos. Como indican en su propia web su propósito es:

Hacer comunidad para constituir un grupo de acción ciudadana, de ámbito nacional, que a través de iniciativas de difusión, participación, colaboración y desarrollo de proyectos en el espacio público y político, ayude a tejer una red de interés y transformación social para la mejora de la democracia mediante la adopción de los principios del movimiento “open“, especialmente del Gobierno Abierto (open government) y la apertura de datos públicos (open data)”

5. Congreso al día.

Una de las apps basadas en Proyecto Colibrí es la desarrollada por Rafa Paradela con el objetivo de:

“Aportar información sobre los diputados de nuestro congreso y sobre las decisiones que toman y que tan directamente nos afecta a todos. Dar a conocer a quienes nos representan”

En la app de “Congreso al día” se puede acceder, por un lado, a una buena visualización de los datos de los diputados tales como su fotografía, grupo parlamentario, partido político y direcciones de contacto y, por otro, igualmente a una visualización muy clarificadora de las votaciones celebradas en cada sesión plenaria.

Esta app es un gran ejemplo de cómo los datos abiertos en un formato reutilizable, en este caso, las votaciones del Congreso, pueden servir para construir visualizaciones de esos datos fomentado la necesaria y productiva colaboración publico-privada.

6. Open Congreso.

Open Congreso es otra web app, desarrollada por Andrea Di Toro igualmente a partir de la API de Proyecto Colibrí. Como figura en su la web del proyecto:

“Es una herramienta que facilita el acceso a la información pública del Congreso del Gobierno de España. Actualmente disponemos de datos sobre la composición de los grupos parlamentarios, las sesiones parlamentarias y las votaciones. El proyecto ha sido desarrollado para facilitar al usuario la visualización de los datos, aportando representaciones gráficas de la distribución de los votos y de las sesiones parlamentaria”.

El punto fuerte de este proyecto son las visualizaciones de los datos sobre la composición de los grupos parlamentarios y las votaciones por sesiones.

7. PicaFlor.

Este proyecto ofrece sendas apps para windowsphone y para Windows 8 con información sobre la composición del Congreso.

8. Congreso 2.0.

Congreso 2.0 es una app para iOS (Apple) y para Android que, según se indica en su propia web:

“Permitirá consultar la actividad legislativa del Congreso de los Diputados de España durante la presente legislatura (2011-Actualidad). Podrás participar como si fueras un diputado. Obviamente tu voto no tendrá ninguna validez legal, pero pretendemos que sirva para expresar la opinión popular. Tu voto será totalmente anónimo. No se guardará ningún dato que pueda identificarte a nivel personal”

La app permite acceder a las iniciativas legislativas en tramitación, a las aprobadas y a las rechazadas a partir de la información y los datos de la web del Congreso.

El valor añadido de la app está, entre otras cuestiones, en la personalización ya que permite votar (a favor o en contra), de una determinada iniciativa legislativa, añadir comentarios y guardar las iniciativas favoritas. Cada iniciativa se puede descargar o ver directamente en la web del Congreso.

Si el lector conoce algún proyecto más de reutilización de datos de congreso.es se agradecería que enriqueciera este artículo con sus referencias en los comentarios.

 

Los votantes dicen...
  1. […] de política y de la relación entre los parlamentos y las iniciativas ciudadanas; en el fondo hablamos de innovación política, y de cómo los parlamentos han de abrirse a la […]

  2. […] de política y de la relación entre los parlamentos y las iniciativas ciudadanas, en el fondo hablamos de innovación política, y de cómo los parlamentos han de abrirse a la […]

Comparte tu punto de vista

XHTML: Puedes usar estas etiquetas: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>