Czech National Team
http://www.forum.czechnationalteam.cz/

Osobní statistika na vlastních webových stránkách
http://www.forum.czechnationalteam.cz/viewtopic.php?f=160&t=3011
Stránka 1 z 1

Autor:  vkliber [ stř 05 zář, 2012 11:38 ]
Předmět příspěvku:  Osobní statistika na vlastních webových stránkách

Pokud máte své vlastní webové stránky (ať už na svém serveru, nebo hostované u nějakého providera) a chcete si na nich zobrazovat své BOINC statistiky, máte nyní možnost.

Na adrese http://stats.czechnationalteam.cz/user_xml.php?id_user= a následuje ID číslo vaších osobních statistik (ID CNT statistik dole na stránce osobní statistiky), lze stáhnout XML soubor osobních statistik (více zde).

Kdo ovládá html, css, php, popřípadě javascript, pro toho nebude problém z XML souboru vytvořit webovou stránku (nebo jen tabulku do již hotové stránky). Jako vzor a ukázka (jak to může vypadat) může posloužit tato stránka (zdrojový kód níže v návodu).

Kdo tyto programovací techniky neovládá (nebo jen částečně, nebo se chce inspirovat) a přesto chce na své stránky umístit svou osobní statistiku, pro toho je připraven tento návod.

Jak přidat své Osobní statistiky na vlastní webové stránky?
Budete potřebovat hosting který podporuje php (to jsou snad všechny 45cc ) na kterém běží vaše webové stránky. Tam umístíte (zřejmě pomocí nějakého ftp nástroje který doporučuje poskytovatel vašeho hostingu) soubor stats.php (nezapomeňte v obsahu souboru změnit hodnotu proměné $id_user na vaše ID CNT statistik, a taky si určitě změníte obsah meta tagů a title v <head> na své vlastní iniciály) :
Kód:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <meta http-equiv="Content-Style-Type" content="text/css">
  <meta name="author" content="Kliber Vít">
  <meta name="category" content="BOINC, statistiky, Vit Kliber">
  <meta name="keywords" content="BOINC, statistiky, Vit Kliber">
  <meta name="description" content="BOINC, Czech National Team, Statistiky uživatele Vit Kliber.">
  <title>Vit Kliber - BOINC - Statistiky</title>
  <style type="text/css">
body {
  color: #000000;
  background-color: #FFFFFF;
  font-family: Verdana, Arial;
  font-size: 12px;
  font-weight: normal;
}
table {
  color: #000000;
  background-color: #AAAAAA;
  font-family: Verdana, Arial;
  font-size: 10px;
  font-weight: normal;
  border: 1px solid #0000FF;
  padding: 0;
  margin: 0;
  border-spacing: 0;
}
thead {
  color: #DDDDDD;
  background-color: #101010;
  font-family: Verdana, Arial;
  font-size: 10px;
  font-weight: bold;
}
tr.a {
  background-color: #EEEEEE;
}
tr.n {
  background-color: #FFCCCC;
}
tr.c {
  background-color: #CCCCFF;
}
td.l {
  border: 1px solid #808080;
  text-align: left;
}
td.r {
  border: 1px solid #808080;
  text-align: right;
}
  </style>
</head>
<body bgcolor="#FFFFFF" text="#000000" link="#000000" vlink="#000000">

<?php

// nutno změnit hodnotu proměnné $id_user na své vlastní ID statistik
$id_user = 1;     // ID statistik uživatele

// připravím si globální proměné
$user  = array(); // do pole se načte obsah xml souboru sekce <user>
$proj  = array(); // do pole se načte obsah xml souboru sekce <projects>
$radek = 0;       // počítadlo projektů v xml souboru

// do proměnné obsah bude funkce preg_match ukládat pole parsovaného řádku
$obsah = "";

// připravím si regulární výrazy pro funkci preg_match pro hledání     ...
$sreg = '/^(<(?P<stag>\S+)>)/';                                     // ... otevření node ve tvaru <tag>
$ereg = '/^(<\/(?P<etag>\S+)>)/';                                   // ... uzavření node ve tvaru </tag>
$hreg = '/^(<(?P<stag>\S+)>(?P<value>(\S|\s)+)<\/(?P<etag>\S+)>)/'; // ... hodnoty ve tvaru <tag>value</tag>

/*
   předpokládám, že fopen může být na některém hostingu zakázán,
   proto použiji fsockopen
   url cesta k xml uživatelských statistik je :
   http://stats.czechnationalteam.cz/user_xml.php?id_user=
   a hned následuje číslo ID statistik uživatele (proměná $id_user)
*/
// otevření connection na server statistik
$fp = fsockopen("stats.czechnationalteam.cz", 80, $errno, $errstr);
if (!$fp) {
   echo "Nelze kontaktovat server.<br>\n";
  echo "$errstr ($errno)<br>\n";
}
else {
  // odeslání požadavku na stránku
  fwrite($fp, "GET /user_xml.php?id_user=".$id_user." HTTP/1.1\r\nHost: stats.czechnationalteam.cz\r\nConnection: Close\r\n\r\n");
  $vypis = 0; // na začátku přenáší fsockopen nějaké http hlavičky které mě nezajímají
  while (!feof($fp)) {
    $data = fgets($fp, 4096); // čtu stránku řádek po řádku
    $data = trim($data);      // a z každého načteného řádku odstraním nadbytečné znaky
    if ( $vypis == 0 ) {
      // až narazím na řádek který začíná direktivou <?xml tak začnu zpracovávat řádky z xml souboru
      if ( SubStr ($data, 0, 5) == "<?xml" ) {
        $vypis = 1;
      }
    }
    if ( $vypis == 1 ) {
      // nyní budu zpracovávat vstupní xml řádek po řádku pomocí
      // velice jednoduchého parseru ... použiji funkci preg_match
      if     ( preg_match($hreg, $data, $obsah) ) {
        switch ($obsah["stag"]) {
          case "stat_date":        $user["STAT_DATE"]              .= $obsah["value"]; break;
          case "id":               $user["ID"]                     .= $obsah["value"]; break;
          case "name":             $user["NAME"]                   .= $obsah["value"]; break;
          case "cpid":             $user["CPID"]                   .= $obsah["value"]; break;
          case "mini_team_id":     $user["MINI_TEAM_ID"]           .= $obsah["value"]; break;
          case "mini_team_name":   $user["MINI_TEAM_NAME"]         .= $obsah["value"]; break;
          case "mini_team_url":    $user["MINI_TEAM_URL"]          .= $obsah["value"]; break;
          case "school_team_id":   $user["SCHOOL_TEAM_ID"]         .= $obsah["value"]; break;
          case "school_team_name": $user["SCHOOL_TEAM_NAME"]       .= $obsah["value"]; break;
          case "school_team_url":  $user["SCHOOL_TEAM_URL"]        .= $obsah["value"]; break;
          case "cnt_proj_url":     $user["CNT_PROJ_URL"]           .= $obsah["value"]; break;
          case "cnt_stats_url":    $user["CNT_STATS_URL"]          .= $obsah["value"]; break;
          case "cnt_cert_url":     $user["CNT_CERT_URL"]           .= $obsah["value"]; break;
          case "proj_id":          $proj[$radek]["PROJ_ID"]        .= $obsah["value"]; break;
          case "proj_name":        $proj[$radek]["PROJ_NAME"]      .= $obsah["value"]; break;
          case "proj_base_url":    $proj[$radek]["PROJ_BASE_URL"]  .= $obsah["value"]; break;
          case "proj_home_url":    $proj[$radek]["PROJ_HOME_URL"]  .= $obsah["value"]; break;
          case "proj_prof_url":    $proj[$radek]["PROJ_PROF_URL"]  .= $obsah["value"]; break;
          case "proj_active":      $proj[$radek]["PROJ_ACTIVE"]    .= $obsah["value"]; break;
          case "rank_over_30":     $proj[$radek]["RANK_OVER_30"]   .= $obsah["value"]; break;
          case "rank_over_07":     $proj[$radek]["RANK_OVER_07"]   .= $obsah["value"]; break;
          case "rank_over_01":     $proj[$radek]["RANK_OVER_01"]   .= $obsah["value"]; break;
          case "rank":             $proj[$radek]["RANK"]           .= $obsah["value"]; break;
          case "credit":           $proj[$radek]["CREDIT"]         .= $obsah["value"]; break;
          case "credit_over_01":   $proj[$radek]["CREDIT_OVER_01"] .= $obsah["value"]; break;
          case "credit_over_07":   $proj[$radek]["CREDIT_OVER_07"] .= $obsah["value"]; break;
          case "credit_over_30":   $proj[$radek]["CREDIT_OVER_30"] .= $obsah["value"]; break;
          case "rac":              $proj[$radek]["RAC"]            .= $obsah["value"]; break;
          case "cup":              $proj[$radek]["CUP"]            .= $obsah["value"]; break;
          case "profile":          $proj[$radek]["PROFILE"]        .= $obsah["value"]; break;
          case "user_proj_id":     $proj[$radek]["USER_PROJ_ID"]   .= $obsah["value"]; break;
        }
      }
      elseif ( preg_match($ereg, $data, $obsah) ) {
        // na ukončení node není nutná žádná akce
      }
      elseif ( preg_match($sreg, $data, $obsah) ) {
        // na začátku každého node <project> zvednu počítadlo projektů
        if ( $obsah["stag"] == "project" ) {
          $radek += 1;
        }
      }
      else {
        // nic jiného by xml nemělo obsahovat
      }
    }
  }
  fclose($fp);
}

// Nyní mám v proměné $user a $proj obsah xml souboru o této struktuře :
// $user["STAT_DATE"]        ... datum poslední aktualizace statistik
// $user["ID"]               ... ID uživatele v rámci statistik CNT
// $user["NAME"]             ... název uživatele
// $user["CPID"]             ... CPID
// $user["MINI_TEAM_ID"]     ... ID minitýmu
// $user["MINI_TEAM_NAME"]   ... název minitýmu
// $user["MINI_TEAM_URL"]    ... url minitýmu (je třeba doplnit o ID minitýmu)
// $user["SCHOOL_TEAM_ID"]   ... ID školního minitýmu
// $user["SCHOOL_TEAM_NAME"] ... název školního minitýmu
// $user["SCHOOL_TEAM_URL"]  ... url školního minitýmu (je třeba doplnit o ID školního minitýmu)
// $user["CNT_PROJ_URL"]     ... url projektu na subdoméně projekty (je třeba doplnit o ID projektu v rámci CNT)
// $user["CNT_STATS_URL"]    ... url statistik na subdoméně stats (je třeba doplnit ID uživatele v rámci statistik CNT)
// $user["CNT_CERT_URL"]     ... url certifikátu uživatele (je třeba doplnit ID uživatele v rámci statistik CNT)
// --
// $proj[]["PROJ_ID"]        ... ID projektu v rámci CNT
// $proj[]["PROJ_NAME"]      ... název projektu
// $proj[]["PROJ_BASE_URL"]  ... základní url projektu
// $proj[]["PROJ_HOME_URL"]  ... url účtu na projektu
// $proj[]["PROJ_PROF_URL"]  ... url profilu na projektu (je třeba doplnit ID účtu na projektu)
// $proj[]["PROJ_ACTIVE"]    ... aktivita projektu (A/N)
// $proj[]["RANK_OVER_30"]   ... posun v pořadí za posledních 30 dní
// $proj[]["RANK_OVER_07"]   ... posun v pořadí za posledních 7 dní
// $proj[]["RANK_OVER_01"]   ... posun v pořadí za poslední den
// $proj[]["RANK"]           ... pořadí
// $proj[]["CREDIT"]         ... kredit
// $proj[]["CREDIT_OVER_01"] ... kredit za poslední den
// $proj[]["CREDIT_OVER_07"] ... kredit za posledních 7 dní
// $proj[]["CREDIT_OVER_30"] ... kredit za posledních 30 dní
// $proj[]["RAC"]            ... rac
// $proj[]["CUP"]            ... cup body
// $proj[]["PROFILE"]        ... profil na projektu (A/N)
// $proj[]["USER_PROJ_ID"]   ... ID účtu na projektu
// --
// celkový sumační řádek který má $proj[]["PROJ_ID"] = 0 obsahuje některé atributy změněné
// $proj[]["PROJ_ID"]        ... 0
// $proj[]["PROJ_NAME"]      ... BOINC Celkem
// $proj[]["PROJ_BASE_URL"]  ... http://boinc.berkeley.edu/
// $proj[]["PROJ_HOME_URL"]  ... http://boinc.berkeley.edu/
// $proj[]["PROJ_PROF_URL"]  ... prázdné
// $proj[]["PROJ_ACTIVE"]    ... N
// $proj[]["PROFILE"]        ... 2 znaky +/-/=, první je změna cup bodů, druhý je změna pozice v rámci cup
// $proj[]["USER_PROJ_ID"]   ... celkové pořadí v rámci cup

// funkce pro formátování textu
// dělá pouze nahrazení prázdného pole nedělitelnou mezerou
// může se rovněž později použít pro formátování čísel
function format($text) {
  if ( $text == "" ) $text = "&nbsp;";
  return $text;
}

// není konečně můžu vypisovat hodnoty
// první nějaká hlavička
// potom projdu pole projektů a vypíšu do řádků tabulky
if ( $radek != 0 ) {
  echo "Uživatel : <b>".$user["NAME"]."</b>.\n<br>\n";
  echo "Statistiky na <a href=\"".$user["CNT_STATS_URL"].$user["ID"]."\">CNT</a>.\n<br>\n";
  if ( $user["MINI_TEAM_ID"] != "" )
    echo "Minitým <a href=\"".$user["MINI_TEAM_URL"].$user["MINI_TEAM_ID"]."\">".$user["MINI_TEAM_NAME"]."</a>.\n<br>\n";
  if ( $user["SCHOOL_TEAM_ID"] != "" )
    echo "Školní minitým <a href=\"".$user["SCHOOL_TEAM_URL"].$user["SCHOOL_TEAM_ID"]."\">".$user["SCHOOL_TEAM_NAME"]."</a>.\n<br>\n";
  echo "<a href=\"".$user["CNT_CERT_URL"].$user["ID"]."\">Certifikát</a>.\n<br>\n";
  echo "<br>\n";
  echo "Poslední aktualizace provedena ".$user["STAT_DATE"].".\n<br>\n";
  echo("<table>\n");
  echo("  <colgroup>\n");
  echo("    <col width=\"16%\">\n");
  echo("    <col width=\"5%\">\n");
  echo("    <col width=\"5%\">\n");
  echo("    <col width=\"5%\">\n");
  echo("    <col width=\"6%\">\n");
  echo("    <col width=\"12%\">\n");
  echo("    <col width=\"10%\">\n");
  echo("    <col width=\"10%\">\n");
  echo("    <col width=\"10%\">\n");
  echo("    <col width=\"12%\">\n");
  echo("    <col width=\"5%\">\n");
  echo("    <col width=\"2%\">\n");
  echo("    <col width=\"2%\">\n");
  echo("  </colgroup>\n");
  echo("  <thead>\n");
  echo("    <tr>\n");
  echo("      <td class=\"l\">Projekt</td>\n");
  echo("      <td class=\"r\">-30</td>\n");
  echo("      <td class=\"r\">-7</td>\n");
  echo("      <td class=\"r\">-1</td>\n");
  echo("      <td class=\"r\">Poř.</td>\n");
  echo("      <td class=\"r\">Kredit</td>\n");
  echo("      <td class=\"r\">-1</td>\n");
  echo("      <td class=\"r\">-7</td>\n");
  echo("      <td class=\"r\">-30</td>\n");
  echo("      <td class=\"r\">Rac</td>\n");
  echo("      <td class=\"r\">Cup</td>\n");
  echo("      <td class=\"l\">U</td>\n");
  echo("      <td class=\"l\">P</td>\n");
  echo("    </tr>\n");
  echo("  </thead>\n");
  echo("  <tbody>\n");
  for($i=1;$i<=Count($proj);$i++) {
    if ( $proj[$i]["PROJ_ID"] == 0 )         echo("<tr class=\"c\">");
    else {
      if ( $proj[$i]["PROJ_ACTIVE"] == "N" ) echo("<tr class=\"n\">");
      else                                   echo("<tr class=\"a\">");
    }
    echo("<td class=\"l\"><a href=\"".$user["CNT_PROJ_URL"].$proj[$i]["PROJ_ID"]."\">".$proj[$i]["PROJ_NAME"]."</a></td>");
    echo("<td class=\"r\">".format($proj[$i]["RANK_OVER_30"])."</td>");
    echo("<td class=\"r\">".format($proj[$i]["RANK_OVER_07"])."</td>");
    echo("<td class=\"r\">".format($proj[$i]["RANK_OVER_01"])."</td>");
    echo("<td class=\"r\">".format($proj[$i]["RANK"])."</td>");
    echo("<td class=\"r\">".format($proj[$i]["CREDIT"])."</td>");
    echo("<td class=\"r\">".format($proj[$i]["CREDIT_OVER_01"])."</td>");
    echo("<td class=\"r\">".format($proj[$i]["CREDIT_OVER_07"])."</td>");
    echo("<td class=\"r\">".format($proj[$i]["CREDIT_OVER_30"])."</td>");
    echo("<td class=\"r\">".format($proj[$i]["RAC"])."</td>");
    echo("<td class=\"r\">".format($proj[$i]["CUP"])."</td>");
    if ( $proj[$i]["PROJ_ID"] == 0 )
      echo("<td class=\"l\">&nbsp;</td>");
    else
      echo("<td class=\"l\"><a href=\"".$proj[$i]["PROJ_HOME_URL"]."\">U</a></td>");
    if ( $proj[$i]["PROJ_ID"] == 0 )
      echo("<td class=\"l\">&nbsp;</td>");
    else {
      if ( $proj[$i]["PROFILE"] == "N" ) echo("<td class=\"l\">&nbsp;</td>");
      else echo("<td class=\"l\"><a href=\"".$proj[$i]["PROJ_PROF_URL"].$proj[$i]["USER_PROJ_ID"]."\">P</a></td>");
    }
    echo("</tr>\n");
  }
  echo("</tbody>\n");
  echo("</table>\n");
  echo("<br>\n");
}

// toť vše, s úctou a potěšením Vít Kliber
?>

</body>
</html>

Pak už stačí jen základní znalost kaskádových stylů (css) a můžete si pohrát s výsledkem.

Stránka 1 z 1 Všechny časy jsou v UTC + 1 hodina
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/