Nous sommes actuellement le 28 Mars 2024, 10:50

Le fuseau horaire est UTC+1 heure [Heure d’été]



Publier un nouveau sujet Répondre au sujet  [ 11 message(s) ] 
Auteur Message
Message Publié : 16 Mai 2014, 11:20 
Hors-ligne Faiseur de miracle
Avatar de l’utilisateur

Inscription : Nov 2013
Message(s) : 2121
Bonjour,

Je relance un petit sujet en parallèle : la sauvegarde des parties.
Il me semble que c'est toi Florimel qui avais créé un petit logiciel de récupération des parties pour feu AideDD (peu de temps avant son extinction d'ailleurs). Ceux qui ont eu l'occasion de l'utiliser avant ont eu beaucoup de chance. Ce ne fut pas mon cas... Mais je l'ai toujours sur mon PC.

Serait-il donc possible de l'adapter pour DD.net ? Je pense qu'il n'y a pas grand chose à modifier dans le code et j'aurai probablement essayer de le faire moi même si j'avais eu les bons outils sur mon PC.

Donc si tu as le temps de faire ça, ce serait super, sinon dis moi de quoi j'ai besoin pour recoder ton programme (logiciels entre autres) et je ferrai quelques essais ce we.

Merci.
Haut
 Profil  
 
 Sujet du message : Re: Sauvegarde des parties
Message Publié : 16 Mai 2014, 20:45 
Hors-ligne Shazamm !
Avatar de l’utilisateur

Inscription : Oct 2013
Message(s) : 1849
Salut.

Je ne vais pas avoir trop le temps de m'occuper de ça.
Une architecture plus adaptée serait probablement de coder cet export côté serveur à partir des données originelles des posts et de le proposer directement ce service depuis le site.

Le contournement que j'avais mis en place pour AideDD consistait simplement en un petit programme client qui "crawle" les pages web d'un forum et interprète le HTML pour les reformater les messages automatiquement.

Si le coeur t'en dit d'essayer de faire quelque chose avec, voici le code source en C# du programme ci-dessous.
En terme de logiciels, il te faudra donc simplement un environnement de développement C# : Microsoft Visual Studio Express ou MonoDevelop sont tous les deux gratuits.
Mais le source n'est pas très compliqué, et il doit être transposable à un autre langage si tu as une autres préférence.

Si tu te lances la-dedans, attention, lors de la mise au point du programme, de bien faire tes essais sur quelques messages uniquement, et pas des forums entiers, histoire de ne pas trop solliciter le serveur et d'éviter de faire s'écrouler les performances du site pour les utilisateurs interactifs.

► Afficher spoiler
Code :
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using HtmlAgilityPack;

namespace ArchiveAideDD
{
  class WebClient : System.Net.WebClient
  {
    private readonly CookieContainer cookieContainer = new CookieContainer();
    protected override WebRequest GetWebRequest(Uri address)
    {
      WebRequest request = base.GetWebRequest(address);
      HttpWebRequest webRequest = request as HttpWebRequest;
      if (webRequest != null) webRequest.CookieContainer = cookieContainer;
      return request;
    }
    public HtmlNode Load(string url)
    {
      string response = DownloadString(url);
      HtmlDocument doc = new HtmlDocument();
      doc.LoadHtml(response);
      return doc.DocumentNode;
    }
  }

  class Topic
  {
    HtmlNode elem;
    public Topic(HtmlNode elem) { this.elem = elem; }
    public string Title
    {
      get { return elem.Descendants("a").First().InnerText; }
    }
    public bool IsRP()
    {
      return !Title.StartsWith("[");
    }
    public IEnumerable<string> Pages()
    {
      string url = elem.Descendants("a").First().Attributes["href"].Value;
      int nb = int.Parse(elem.Descendants("dd").Where(e => e.Attributes["class"] != null && e.Attributes["class"].Value == "posts").First().FirstChild.InnerText);
      for (int i = 0; i < nb; i += 12)
        yield return i == 0 ? url : url.Replace(".html", "-" + i + ".html");
    }
  }

  class Forum
  {
    const string baseUrl = "http://www.aidedd.org/";
    WebClient client;

    public void Login(string user, string password)
    {
      client = new WebClient();
      client.Encoding = Encoding.UTF8;
      if (user != null && user.Length > 0)
      {
        string response = client.DownloadString(baseUrl + "ucp.php");
        client.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
        response = client.UploadString(baseUrl + "ucp.php?mode=login", "username=" + Uri.EscapeUriString(user) + "&password=" + Uri.EscapeUriString(password) + "&login=Connexion");
      }
    }

    IEnumerable<Topic> Topics(string forumId)
    {
      int pages = 1;
      for (int page = 0; page < pages; page++)
      {
        string url = baseUrl + "partie-f" + forumId;
        if (page > 0) url += "/page" + (page * 25).ToString() + ".html";
        HtmlNode doc = client.Load(url);
        if (page == 0)
          pages = int.Parse(doc.Descendants("div").Where(e => e.Attributes["class"] != null && e.Attributes["class"].Value == "pagination").First()
            .Descendants("strong").Skip(1).First().InnerText);
        HtmlNode topics = doc.Descendants("ul").Where(e => e.Attributes["class"] != null && e.Attributes["class"].Value == "topiclist topics").First();
        foreach (HtmlNode topic in topics.Elements("li")) yield return new Topic(topic.Element("dl"));
      }
    }
    public void Archive(string forumId)
    {
      TextWriter txt = new StreamWriter("archive-" + forumId + ".html",false, Encoding.UTF8);
      txt.WriteLine("<html><body>");
      Topic[] topics = Topics(forumId).Reverse().Where(t => t.IsRP()).ToArray();
      for(int i=0;i<topics.Length; i++)
      {
        Console.Write("Archiving {0}/{1}...", i + 1, topics.Length);
        Topic t = topics[i];
        txt.WriteLine("<h1>" + t.Title + "</h1>");
        IEnumerable<HtmlNode> content = t.Pages().SelectMany(
          url => client.Load(url).Descendants("div").Where(e => e.Attributes["class"] != null && e.Attributes["class"].Value == "content"));
        foreach (HtmlNode c in content)
        {
          foreach (HtmlNode n in c.Descendants("blockquote")) n.InnerHtml = n.FirstChild.InnerHtml;
          while (c.Descendants("div").FirstOrDefault() != null) c.Descendants("div").FirstOrDefault().Remove();
          while (c.Descendants("img").FirstOrDefault() != null) c.Descendants("img").FirstOrDefault().Remove();
          txt.WriteLine(c.OuterHtml);
        }
      }
      txt.WriteLine("</body></html>");
      txt.Close();
      Console.WriteLine();
    }
  }

  class Program
  {
    static void Main(string[] args)
    {
      Console.Write("Login : ");
      string user = Console.ReadLine();
      Console.Write("Password : ");
      string pwd = Console.ReadLine();
      Console.Write("Forum Id : ");
      string forumId = Console.ReadLine();
      Forum forum = new Forum();
      forum.Login(user, pwd);
      forum.Archive(forumId);
    }
  }
}
Haut
 Profil  
 
 Sujet du message : Re: Sauvegarde des parties
Message Publié : 16 Mai 2014, 20:50 
Hors-ligne Uruk
Avatar de l’utilisateur

Inscription : Nov 2013
Message(s) : 203
Plus simple:
https://www.phpbb.com/customise/db/mod/ ... _in_topic/
Haut
 Profil  
 
 Sujet du message : Re: Sauvegarde des parties
Message Publié : 16 Mai 2014, 21:02 
Hors-ligne Shazamm !
Avatar de l’utilisateur

Inscription : Oct 2013
Message(s) : 1849
Cool ! C'est tout à fait ce que j'entendais par:
Citer :
côté serveur à partir des données originelles des posts [à] proposer directement depuis le site
Et vu qu'il existe déjà un mod tout fait, même pas besoin de le coder :-). Merci butch2k pour ta pertinence, maintenant habituelle.
Haut
 Profil  
 
 Sujet du message : Re: Sauvegarde des parties
Message Publié : 16 Mai 2014, 21:39 
Hors-ligne Uruk
Avatar de l’utilisateur

Inscription : Nov 2013
Message(s) : 203
De rien ;)
Par contre faut voir la charge que ça impose au serveur sur des fils assez longs. D'expérience ça prend du CPU coté serveur, ça c'est normal, mais aussi généralement pas mal de mémoire PHP et on peut atteindre l'unable to allocate xxx bytes de PHP. Je sais pas a combien la limite est configurée sur le serveur mais il est préférable de le surcharger via ini_set() dans la fonction d'impression de manière a donner un peu plus d'air...
Haut
 Profil  
 
 Sujet du message : Re: Sauvegarde des parties
Message Publié : 16 Mai 2014, 23:00 
Hors-ligne Faiseur de miracle
Avatar de l’utilisateur

Inscription : Nov 2013
Message(s) : 2121
Dans quoi je me suis embarqué moi en proposant mon aide ! ^^
Bon, je vais aller repotasser tout ça du coup... après une bonne nuit de sommeil ! ;)
Merci à tous les deux.
Haut
 Profil  
 
 Sujet du message : Re: Sauvegarde des parties
Message Publié : 17 Mai 2014, 00:04 
Hors-ligne Shazamm !
Avatar de l’utilisateur

Inscription : Oct 2013
Message(s) : 1849
J'ai installé le MOD proposé par butch2k. :sifflote:
Il rajoute un lien « Imprimer tout » à côté du lien existant « Imprimer ».
Ça ne permet pas tout à fait de faire l'archive complète d'une partie, car il faut demander cette "impression" sujet par sujet, mais bon c'est quand même déjà un net progrès. :-)
Haut
 Profil  
 
 Sujet du message : Re: Sauvegarde des parties
Message Publié : 17 Mai 2014, 00:11 
Hors-ligne Faiseur de miracle
Avatar de l’utilisateur

Inscription : Nov 2013
Message(s) : 2121
Où vois-tu un lien « imprimer » et « imprimer tout » ??? :perplexe:

EDIT : c'est bon trouvé. J'ai pas les yeux en face des trous ce soir. DODO !
Merci pour l'info.
Haut
 Profil  
 
 Sujet du message : Re: Sauvegarde des parties
Message Publié : 17 Mai 2014, 03:53 
Hors-ligne Maître du jeu
Avatar de l’utilisateur

Inscription : Oct 2013
Message(s) : 1369
Localisation : Montréal
Je signale un bug qui coïncide avec l'installation du mode (qui sera très pratique, soit dit en passant).

Il semble qu'on ne puisse plus naviguer à travers les différentes pages d'un sujet. C'est un peu gênant si on dois relire certains post.
Haut
 Profil  
 
 Sujet du message : Re: Sauvegarde des parties
Message Publié : 17 Mai 2014, 04:05 
Hors-ligne Shazamm !
Avatar de l’utilisateur

Inscription : Oct 2013
Message(s) : 1849
Merci de l'avoir remarqué. Effectivement une erreur lors de l'installation du mod. C'est réparé.
Haut
 Profil  
 
 Sujet du message : Re: Sauvegarde des parties
Message Publié : 17 Mai 2014, 11:26 
Hors-ligne Administrateur
Avatar de l’utilisateur

Inscription : Oct 2013
Message(s) : 32849
Localisation : Limousin
:applaudit: :applaudit: Vous êtes Géniaux ! :applaudit: :applaudit:
Haut
 Profil  
 
Afficher les messages publiés depuis :  Trier par  
Publier un nouveau sujet Répondre au sujet  [ 11 message(s) ] 

Le fuseau horaire est UTC+1 heure [Heure d’été]


Qui est en ligne ?

Utilisateur(s) parcourant ce sujet : Aucun utilisateur inscrit et 1 invité


Vous ne pouvez pas publier de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas insérer de pièces jointes dans ce forum

Aller vers :  
Propulsé par phpBB® Forum Software © phpBB Group
Traduction et support en français • Utiliser phpBB avec un certificat SSL