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 spoilerCode :
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);
}
}
}