>
Cuando uno trata de vender algo le dedica tiempo a buscar compradores o a actualizar sus anuncios de modo a maximizar sus posibilidades y es justamente acá donde entré a improvisar una vez más.
- Tengo varios anuncios ofreciendo productos
- Tengo que entrar a actualizar diariamente mis anuncios pero son varios y me hacen perder mucho tiempo
- Muchas veces me olvido y pierdo oportunidades
Es un quilombo, pero tengo la suerte de ser informático (he’i) y las computadoras son mi área de expertise por lo puedo abusar sin remordimiento de ellas (de las computadoras).
Está hecho en C# (me encanta), corriendo sobre Linux (aunque también funciona en Windows y MacOS) y funcionando sin problemas desde hace más de un mes.
Los espacios de nombre importados hablan de las porciones del framework que usé
using System;using System.IO;using System.Net;using System.Web;using System.Text;using System.Text.RegularExpressions;
[csharp]
using HtmlAgilityPack;
using ClasiparBot.Utils;
[/csharp]
El entry pointsolo contiene lo siguiente ya que la lógica está contenida dentro de la clase ClasiBot.
[csharp]
public static void Main (string[] args){if (args.Length != 1){ Debug.PrintError(“MainClass.Main(): Invalid command line parameter(s)”); return;}
if (!File.Exists(args[0])){ Debug.PrintError(“MainClass.Main(): Configuration file is missing”); return;}
List <botparameters > botParams = ParseConfigurationFile(args[0]);
foreach(BotParameters botParameter in botParams) Debug.Notify(“MainClass.Main(): Error free? “, new ClasiBot(botParameter).StartBot().ToString().ToUpper());}
[/csharp]
El método StartBot()
[csharp]
ServicePointManager.Expect100Continue = false;
HttpWebRequest request = (HttpWebRequest) WebRequest.Create(_parameter.ManagementLink);request.UserAgent = “Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.9) Gecko/20100317 SUSE/3.5.9-0.1.1 Firefox/3.5.9rn”;
request.CookieContainer = new CookieContainer();
HttpWebResponse response = (HttpWebResponse) request.GetResponse();StreamReader reader = new StreamReader(response.GetResponseStream());
HtmlDocument htmlDoc = new HtmlDocument();htmlDoc.LoadHtml(reader.ReadToEnd());
string hashID = ParseHashID(_parameter.ManagementLink.ToString()).Trim();string authToken = htmlDoc.DocumentNode.SelectSingleNode(“//input[@name=’authenticity_token’]”).Attributes[“value”].Value;
Debug.Notify(“ClasiBot.StartBot(): HashID is”, hashID);Debug.Notify(“ClasiBot.StartBot(): Authenticity token is”, authToken);
string output = AccessDashboard(request.CookieContainer, hashID, authToken);output = PerformAnnouncementOperation(request.CookieContainer);Debug.Notify(“ClasiBot.StartBot(): Operation result is ‘”, ParseResult(output), “‘”);
[/csharp]
Este método genera el URI dependiendo de la decisión de actualizar, concretar o eliminar el anuncio.
[csharp]
string BuildURIByOperation(Uri mainUri, AnnouncementOperation operation, Uri announcementUri){string operationUri = “http://” + mainUri.Host + “/ad/”;
switch(operation){case AnnouncementOperation.Refresh:operationUri += “refresh_ad”;break;case AnnouncementOperation.Delete:operationUri += “delete_ad”;break;case AnnouncementOperation.MarkAsSold:operationUri += “mark_as_sol”;break;}
operationUri += announcementUri.AbsolutePath.Replace(“.html”, “”);
return operationUri;
}
[/csharp]
Este método determina el resultado de la operación
[csharp]
public string ParseResult(string html){Match match = Regex.Match(html, @”(?.+)”);}
if (match.Success)return match.Groups[“message”].Value;
match = Regex.Match(html, @”(?.+)”);
if (!match.Success)throw new Exception(“Unable to match result in output html”);
return match.Groups[“message”].Value;}
[/csharp]
La salida
No publico todo el fuente porque aunque lo que hago no es ilegal, puede perjudicar su negocio y lo último que yo quiero es dañar a la industria paraguaya.
Este programa es más bien una h erramienta personal y este post pretende ser un artículo científico para gente que esté interesada en el funcionamiento de los bots.