Tornato dalle vacanze, mi sono trovato una spiacevole sorpresa. Non so come, non so quando, non so nemmeno perchè, ma mi sono trovato qualcosa come 4000 ping/trackback di spam. 

Ancora non so se la risposta sia disabilitare totalmente ping/trackback o abilitare la moderazione (cosa che tra parentesi nemmeno so se funziona per i trackback), ma la cosa piu urgente da fare ora come ora è eliminare queste quintalate di feedback non desiderati.

Una rapida scorsa all'interfaccia amministrativa di SubText mi fa capire che volendoli cancellare uno per uno (a pagina, 10 alla volta) con tanto di mille mila messaggi di conferma, sarei diventato vecchio in fretta. Do anche una guardata alle metablog api, ma noto che non ci sono metodi che mi permettono di cancellare i feedback. Ho anche cercato in giro post o accrocchi che ne parlassero, ma non ne ho trovato (possibile che sia stato l'unico ad avere questo problema?? :P) Se ci sono, me li sono persi, nel caso fatemelo sapere per favore :)

Comunque, ho messo in atto la Soluzione Estrema, cioè ho buttato via un paio d'ore a costruire una windows form che servisse allo scopo.
Probabilmente è la soluzione più stupida del mondo, e non discuto che ce ne siano miliardi di altre, ma guardando come funziona il motore e cercando in giro non ho trovato spunti migliori. Se qualcuno ce li ha, me lo faccia sapere che posso pensare di tenerlo come referenza futura:)

La mia ricetta è stata:

- Un componente web browser
- Una regexp che controlli l'html
- Una discreta conoscenza degli oggetti mshtml.* (che, l'ho probabilmente già detto e lo ripeto, sono scritti col c**o)

Non sapendo ovviamente nulla di nessuno dei tre punti, quello che è venuto fuori è una ciofeca (:P) ma piu o meno fa il suo lavoro.

Blog cleaner in action

Praticamente, funziona così:

- Si digita l'indirizzo della pagina che si vuole ripulire e si schissa "GO" (l'ho fatto per pagina perchè ho notato che il 99% dei feedback erano concentrati su una decina di post, probabilmente quelli meglio indicizzati in google)
- Ci si ricorda di fare login nella pagina amministrativa, altrimenti non viene fuori il link per rimuovere il commento
- Una volta fatto login, si rischiaccia "go" e si refresha la pagina per evitare la cache (tasto destro/refresh, altrimenti molte volte il webbrowser non si refresha bene)
- Una volta che si vedono tutti i millemila commenti con il remove comment, si schissa il pulsantone "Check feedbacks to purge". Apparirà la finestra che si vede in immagine, con la lista di tutti i commentii.
- Schiacciando "cancel" si torna indietro. Schiacciano "purge unchecked feedback", si cancellano TUTTI i feedback TRANNE quelli selezionati. Quindi attenzione di ricordarsi di selezionare i feedback che si vuole mantenere.

A questo punto il programma torna indietro e, con un pò di magia nera ed un sacco di porcate, si prende gli oggetti link che ha precedentemente salvato e simula tutti i "click" (è purtroppo l'unico modo che ho trovato). L'accrocchio è lento come la morte, perchè purtroppo non sono riuscito ad intercettare l'evento di loading alle fine del click (UpdatePanel e oggetto WebBrowser a quanto pare non quagliano molto), quindi ho fatto la solenne porcata di aspettare 3 secondi per ogni click. Ne consegue che ci metterà sempre 3 secondi a feedback, che in caso di 4000 link come me possono voler dire parecchie ore, ma almeno lo fa in background mentre io sto facendo altro :) Oltretutto ogni volta devo riparsare il documento pre ripopolare la collezione di link, perchè l'update panel cambia rimuovendo il link cancellato, ma l'oggetto webbrowser non se ne accorge (e non lancia nessun evento.. grrrrr) e quindi non posso utilizzare i link vecchi tenuti in memoria.

Il codice fa sicuramente schifo ed è quanto di piu lontano di quello che può essere scritto bene, ma serviva solo per questo particolare problema, ed ora sono felice possessore di un blog piu pulito. Se volete utilizzarlo perchè avete il mio stesso problema, ed utilizzate SubText, vi allego il codice. Tenete comunque conto di questi punti importantissimi:

1: è assolutamente pensato per lavorare sul MIO blog con la MIA skin. Visto l'utilizzo intenso di interazione con il DOM della pagina, non è ASSOLUTAMENTE assicurato che funzioni anche sul vostro. anzi, è quasi sicuro che si pianti :)
In particolare, io gioco con il parent del link "remove comment" per popolare la lista dei feedback in maniera corretta. Sulla mia skin precedente, il div giusto era SOTTO il link removecomment, quindi prendevo l'ultimo children del parent, mentre nella skin attuale (che già che c'ero ho cambiato, la vecchia aveva stufato!) il div corretto è il secondo, mentre il remove comment è l'ultimo!
2: è assolutamente fornito "AS-IS", e non mi prendo nessuna responsabilità nel caso vogliate usarlo/testarlo/whatever.
3: Che nessun mi venga a dire che questo-o-quello si poteva fare meglio/diversamente/whatever che me ne frega :D L'unica cosa che mi interessa è se c'era qualche modo più diretto per interagire con il blog e cancellare tutto senza dover per forza simulare tutti i click (e se c'è un modo per far capire all'oggetto WebBrowser che il caricamento di un UpdatePanel è finito!)
4: Chiaramente ci sono molti (tanti) problemi, il più noioso che ho trovato è che l'updatepanel "scazza" dopo qualche minuto di attività, probabilmente per una perdita di credenziali, ma non sempre. Quindi, ogni tanto lancerà fuori un errore di tipo Sys.Web.Timeout exception o qualcosa di simile. Si chiude, si riapre, e si ricomincia :P
5: Ricordatevi sempre di selezionare i feedback che si vogliono mantenere! E' pensato per un post riempito di trackback inutili, quindi l'azione di default che fa è rimuoverli tutti a meno che non li si selezioni!

Trovate il codice qui (stavolta lo allego altrimenti, com'era successo per la stored di pulizia dei campi da Sql Injection, me la chiedete in trentamila e poi finisce che a qualcuno non arriva).

Edi: come mi ha giustamente fatto notare simone, è subtext, non .text :D