Ejemplo de utilización de la API
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using F.IA.WolframAlpha;
namespace WATest
{
public class WolframAlphaWrapperExample
{
F.IA.WolframAlpha.WolframAlphaEngine Engine = new F.IA.WolframAlpha.WolframAlphaEngine();
public void Output(string Data, int Indenting, System.ConsoleColor Color)
{
for (int i=0;i<Indenting * 4;i++){
Data = " " + Data;
}
Console.ForegroundColor = Color;
Console.WriteLine(Data);
Console.ForegroundColor = ConsoleColor.White;
System.IO.StreamWriter Writer = new System.IO.StreamWriter(System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\Wolfram Alpha wrapper log.log", true);
Writer.WriteLine(Data);
Writer.Close();
Writer.Dispose();
}
public void Process(string qry, System.Windows.Forms.Control container)
{
//Try to delete the log file if it already exists.
try
{
System.IO.File.Delete(System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\Wolfram Alpha wrapper log.log");
}
catch
{
}
//Define what our application ID is.
string WolframAlphaApplicationID = "beta824g1";
//Define what we want to search for.
string WolframAlphaSearchTerms =qry;
//Print out what we're about to do in the console.
Output("Getting response for the search terms \"" + WolframAlphaSearchTerms + "\" and the application ID string \"" + WolframAlphaApplicationID + "\" ...", 0, ConsoleColor.White);
//Use the engine to get a response, from the application ID specified, and the search terms.
F.IA.WolframAlpha.WolframAlphaQuery query = new F.IA.WolframAlpha.WolframAlphaQuery();
query.APIKey = WolframAlphaApplicationID;
query.Query = WolframAlphaSearchTerms;
Engine.LoadResponse(query);
//Print out a message saying that the last task was successful.
Output("Response injected.", 0, ConsoleColor.White);
//Make 2 empty spaces in the console.
Output("", 0, ConsoleColor.White);
Output("Response details", 1, ConsoleColor.Blue);
//Print out how many different pods that were found.
Output("Pods found: " + Engine.QueryResult.NumberOfPods, 1, ConsoleColor.White);
Output("Query pasing time: " + Engine.QueryResult.ParseTiming + " seconds", 1, ConsoleColor.White);
Output("Query execution time: " + Engine.QueryResult.Timing + " seconds", 1, ConsoleColor.White);
int PodNumber = 1;
foreach (WolframAlphaPod Item in Engine.QueryResult.Pods)
{
//Make an empty space in the console.
Output("", 0, ConsoleColor.White);
Output("Pod " + PodNumber, 2, ConsoleColor.Red);
Output("Sub pods found: " + Item.NumberOfSubPods, 2, ConsoleColor.White);
Output("Title: \"" + Item.Title + "\"", 2, ConsoleColor.White);
Output("Position: " + Item.Position, 2, ConsoleColor.White);
int SubPodNumber = 1;
foreach (WolframAlphaSubPod SubItem in Item.SubPods)
{
Output("", 0, ConsoleColor.White);
Output("Sub pod " + SubPodNumber, 3, ConsoleColor.Magenta);
Output("Title: \"" + SubItem.Title + "\"", 3, ConsoleColor.White);
Output("Pod text: \"" + SubItem.PodText + "\"", 3, ConsoleColor.White);
Output("Pod image title: \"" + SubItem.PodImage.Title + "\"", 3, ConsoleColor.White);
Output("Pod image width: " + SubItem.PodImage.Width, 3, ConsoleColor.White);
Output("Pod image height: " + SubItem.PodImage.Height, 3, ConsoleColor.White);
Output("Pod image location: \"" + SubItem.PodImage.Location.ToString() + "\"", 3, ConsoleColor.White);
Output("Pod image description text: \"" + SubItem.PodImage.HoverText + "\"", 3, ConsoleColor.White);
if ((container as System.Windows.Forms.TableLayoutPanel).RowCount < SubPodNumber)
(container as System.Windows.Forms.TableLayoutPanel).RowCount = SubPodNumber;
(container as System.Windows.Forms.TableLayoutPanel ).Controls.Add (new System.Windows.Forms.PictureBox (){ ImageLocation = SubItem.PodImage.Location.AbsoluteUri ,
SizeMode= System.Windows.Forms.PictureBoxSizeMode.AutoSize
},0, SubPodNumber-1);
SubPodNumber += 1;
}
PodNumber += 1;
}
//Make an empty space in the console.
Output("", 0, ConsoleColor.White);
//Make the application stay open until there is user interaction.
Output("All content has been saved to " + System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\Wolfram Alpha wrapper log.log. Press a key to close the example.", 0, ConsoleColor.Green);
Console.ReadLine();
}
}
}
Clases para encapsular la API
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace F.IA.WolframAlpha
{
public class WolframAlphaValidationResult
{
private string WA_ParseData;
private List<WolframAlphaAssumption> WA_Assumptions;
private bool WA_Success;
private bool WA_Error;
private double WA_Timing;
public bool Success
{
get { return WA_Success; }
set { WA_Success = value; }
}
public string ParseData
{
get { return WA_ParseData; }
set { WA_ParseData = value; }
}
public List<WolframAlphaAssumption> Assumptions
{
get { return WA_Assumptions; }
set { WA_Assumptions = value; }
}
public bool ErrorOccured
{
get { return WA_Error; }
set { WA_Error = value; }
}
public double Timing
{
get { return WA_Timing; }
set { WA_Timing = value; }
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace F.IA.WolframAlpha
{
public class WolframAlphaSubPod
{
public string Title
{
get;
set;
}
public string PodText
{
get;
set;
}
public WolframAlphaImage PodImage
{
get;
set;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace F.IA.WolframAlpha
{
public class WolframAlphaQueryResult
{
private List<WolframAlphaPod> WA_Pods;
public List<WolframAlphaPod> Pods
{
get { return WA_Pods; }
set { WA_Pods = value; }
}
public bool Success
{
get;
set;
}
public bool ErrorOccured
{
get;
set;
}
public int NumberOfPods
{
get;
set;
}
public string DataTypes
{
get;
set;
}
public string TimedOut
{
get;
set;
}
public double Timing
{
get;
set;
}
public double ParseTiming
{
get;
set;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
namespace F.IA.WolframAlpha
{
public class WolframAlphaQuery
{
private const string MainRoot = "http://api.wolframalpha.com/v1/query.jsp";
private string WA_APIKey;
public string APIKey
{
get { return WA_APIKey; }
set { WA_APIKey = value; }
}
private string WA_Format;
private string WA_Substitution;
private string WA_Assumption;
private string WA_Query;
private string WA_PodTitle;
private int WA_TimeLimit;
private bool WA_AllowCached;
private bool WA_Asynchronous;
private bool WA_MoreOutput;
public bool MoreOutput
{
get { return WA_MoreOutput; }
set { WA_MoreOutput = value; }
}
public string Format
{
get { return WA_Format; }
set { WA_Format = value; }
}
public bool Asynchronous
{
get { return WA_Asynchronous; }
set { WA_Asynchronous = value; }
}
public bool AllowCaching
{
get { return WA_AllowCached; }
set { WA_AllowCached = false; }
}
public string Query
{
get { return WA_Query; }
set { WA_Query = value; }
}
public int TimeLimit
{
get { return WA_TimeLimit; }
set { WA_TimeLimit = value; }
}
public void AddPodTitle(string PodTitle, bool CheckForDuplicates = false)
{
if (CheckForDuplicates == true && WA_PodTitle.Contains("&PodTitle=" + HttpUtility.UrlEncode(PodTitle)))
{
return;
}
WA_PodTitle += "&podtitle=" + HttpUtility.UrlEncode(PodTitle);
}
public void AddSubstitution(string Substitution, bool CheckForDuplicates = false)
{
if (CheckForDuplicates == true && WA_Substitution.Contains("&substitution=" + HttpUtility.UrlEncode(Substitution)))
{
return;
}
WA_Substitution += "&substitution=" + HttpUtility.UrlEncode(Substitution);
}
public void AddAssumption(string Assumption, bool CheckForDuplicates = false)
{
if (CheckForDuplicates == true && WA_Assumption.Contains("&substitution=" + HttpUtility.UrlEncode(Assumption)))
{
return;
}
WA_Assumption += "&assumption=" + HttpUtility.UrlEncode(Assumption);
}
public void AddAssumption(WolframAlphaAssumption Assumption, bool CheckForDuplicates = false)
{
if (CheckForDuplicates == true && WA_Assumption.Contains("&substitution=" + HttpUtility.UrlEncode(Assumption.Word)))
{
return;
}
WA_Assumption += "&assumption=" + HttpUtility.UrlEncode(Assumption.Word);
}
public string[] Substitutions
{
get { return WA_Substitution.Split(new string[] { "&substitution=" }, StringSplitOptions.RemoveEmptyEntries); }
}
public string[] Assumptions
{
get { return WA_Assumption.Split(new string[] { "&assumption=" }, StringSplitOptions.RemoveEmptyEntries); }
}
public string[] PodTitles
{
get { return WA_PodTitle.Split(new string[] { "&assumption=" }, StringSplitOptions.RemoveEmptyEntries); }
}
public string FullQueryString
{
get { return "?appid=" + WA_APIKey + "&moreoutput=" + MoreOutput + "&timelimit=" + TimeLimit + "&format=" + WA_Format + "&input=" + WA_Query + WA_Assumption + WA_Substitution; }
}
public class WolframAlphaQueryFormat
{
public static string Image = "image";
public static string HTML = "html";
public static string PDF = "pdf";
public static string PlainText = "plaintext";
public static string MathematicaInput = "minput";
public static string MathematicaOutput = "moutput";
public static string MathematicaMathMarkupLanguage = "mathml";
public static string MathematicaExpressionMarkupLanguage = "expressionml";
public static string ExtensibleMarkupLanguage = "xml";
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace F.IA.WolframAlpha
{
public class WolframAlphaPod
{
private List<WolframAlphaSubPod> WA_SubPods;
public List<WolframAlphaSubPod> SubPods
{
get { return WA_SubPods; }
set { WA_SubPods = value; }
}
public string Title
{
get;
set;
}
public string Scanner
{
get;
set;
}
public int Position
{
get;
set;
}
public bool ErrorOccured
{
get;
set;
}
public int NumberOfSubPods
{
get;
set;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace F.IA.WolframAlpha
{
public class WolframAlphaImage
{
public Uri Location
{
get;
set;
}
public int Width
{
get;
set;
}
public int Height
{
get;
set;
}
public string Title
{
get;
set;
}
public string HoverText
{
get;
set;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
namespace F.IA.WolframAlpha
{
public class WolframAlphaEngine
{
private string WA_APIKey;
private WolframAlphaQueryResult WA_QueryResult;
private WolframAlphaValidationResult WA_ValidationResult;
public WolframAlphaEngine(string APIKey)
{
WA_APIKey = APIKey;
}
public WolframAlphaEngine()
{
// TODO: Complete member initialization
}
public string APIKey
{
get { return WA_APIKey; }
set { WA_APIKey = value; }
}
public WolframAlphaQueryResult QueryResult
{
get { return WA_QueryResult; }
}
public WolframAlphaValidationResult ValidationResult
{
get { return WA_ValidationResult; }
}
#region "Overloads of ValidateQuery"
public WolframAlphaValidationResult ValidateQuery(WolframAlphaQuery Query)
{
if (string.IsNullOrEmpty(Query.APIKey))
{
if (string.IsNullOrEmpty(this.APIKey))
{
throw new Exception("To use the Wolfram Alpha API, you must specify an API key either through the parsed WolframAlphaQuery, or on the WolframAlphaEngine itself.");
}
Query.APIKey = this.APIKey;
}
if (Query.Asynchronous == true && Query.Format == WolframAlphaQuery.WolframAlphaQueryFormat.HTML)
{
throw new Exception("Wolfram Alpha does not allow asynchronous operations while the format for the query is not set to \"HTML\".");
}
System.Net.HttpWebRequest WebRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create("http://preview.wolframalpha.com/api/v1/validatequery.jsp" + Query.FullQueryString);
WebRequest.KeepAlive = true;
string Response = new System.IO.StreamReader(WebRequest.GetResponse().GetResponseStream()).ReadToEnd();
return ValidateQuery(Response);
}
public WolframAlphaValidationResult ValidateQuery(string Response)
{
System.Xml.XmlDocument Document = new System.Xml.XmlDocument();
WolframAlphaValidationResult Result = null;
try
{
Document.LoadXml(Response);
Result = ValidateQuery(Document);
}
catch
{
}
Document = null;
return Result;
}
public WolframAlphaValidationResult ValidateQuery(System.Xml.XmlDocument Response)
{
System.Threading.Thread.Sleep(1);
System.Xml.XmlNode MainNode = Response.SelectNodes("/validatequeryresult")[0];
WA_ValidationResult = new WolframAlphaValidationResult();
WA_ValidationResult.Success = Convert.ToBoolean ( MainNode.Attributes["success"].Value);
WA_ValidationResult.ErrorOccured = Convert.ToBoolean (MainNode.Attributes["error"].Value);
WA_ValidationResult.Timing = Convert.ToDouble (MainNode.Attributes["timing"].Value);
WA_ValidationResult.ParseData = MainNode.SelectNodes("parsedata")[0].InnerText;
WA_ValidationResult.Assumptions = new List<WolframAlphaAssumption>();
foreach (System.Xml.XmlNode Node in MainNode.SelectNodes("assumptions"))
{
System.Threading.Thread.Sleep(1);
WolframAlphaAssumption Assumption = new WolframAlphaAssumption();
Assumption.Word = Node.SelectNodes("word")[0].InnerText;
System.Xml.XmlNode SubNode = Node.SelectNodes("categories")[0];
foreach (System.Xml.XmlNode ContentNode in SubNode.SelectNodes("category"))
{
System.Threading.Thread.Sleep(1);
Assumption.Categories.Add(ContentNode.InnerText);
}
WA_ValidationResult.Assumptions.Add(Assumption);
}
return WA_ValidationResult;
}
#endregion
#region "Overloads of LoadResponse"
public WolframAlphaQueryResult LoadResponse(WolframAlphaQuery Query)
{
if (string.IsNullOrEmpty(Query.APIKey))
{
if (string.IsNullOrEmpty(this.APIKey))
{
throw new Exception("To use the Wolfram Alpha API, you must specify an API key either through the parsed WolframAlphaQuery, or on the WolframAlphaEngine itself.");
}
Query.APIKey = this.APIKey;
}
if (Query.Asynchronous == true && Query.Format == WolframAlphaQuery.WolframAlphaQueryFormat.HTML)
{
throw new Exception("Wolfram Alpha does not allow asynchronous operations while the format for the query is not set to \"HTML\".");
}
System.Net.HttpWebRequest WebRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create("http://preview.wolframalpha.com/api/v1/query.jsp" + Query.FullQueryString);
WebRequest.KeepAlive = true;
string Response = new System.IO.StreamReader(WebRequest.GetResponse().GetResponseStream()).ReadToEnd();
return LoadResponse(Response);
}
public WolframAlphaQueryResult LoadResponse(string Response)
{
System.Xml.XmlDocument Document = new System.Xml.XmlDocument();
WolframAlphaQueryResult Result = null;
try
{
Document.LoadXml(Response);
Result = LoadResponse(Document);
}
catch
{
}
Document = null;
return Result;
}
public WolframAlphaQueryResult LoadResponse(System.Xml.XmlDocument Response)
{
System.Threading.Thread.Sleep(1);
System.Xml.XmlNode MainNode = Response.SelectNodes("/queryresult")[0];
WA_QueryResult = new WolframAlphaQueryResult();
WA_QueryResult.Success =Convert.ToBoolean ( MainNode.Attributes["success"].Value);
WA_QueryResult.ErrorOccured = Convert.ToBoolean ( MainNode.Attributes["error"].Value);
WA_QueryResult.NumberOfPods = Convert.ToInt32 ( MainNode.Attributes["numpods"].Value);
WA_QueryResult.Timing = Convert.ToDouble (MainNode.Attributes["timing"].Value);
WA_QueryResult.TimedOut = MainNode.Attributes["timedout"].Value;
WA_QueryResult.DataTypes = MainNode.Attributes["datatypes"].Value;
WA_QueryResult.Pods = new List<WolframAlphaPod>();
foreach (System.Xml.XmlNode Node in MainNode.SelectNodes("pod"))
{
System.Threading.Thread.Sleep(1);
WolframAlphaPod Pod = new WolframAlphaPod();
Pod.Title = Node.Attributes["title"].Value;
Pod.Scanner = Node.Attributes["scanner"].Value;
Pod.Position = Convert.ToInt32 (Node.Attributes["position"].Value);
Pod.ErrorOccured = Convert.ToBoolean (Node.Attributes["error"].Value);
Pod.NumberOfSubPods = Convert.ToInt32 (Node.Attributes["numsubpods"].Value);
Pod.SubPods = new List<WolframAlphaSubPod>();
foreach (System.Xml.XmlNode SubNode in Node.SelectNodes("subpod"))
{
System.Threading.Thread.Sleep(1);
WolframAlphaSubPod SubPod = new WolframAlphaSubPod();
SubPod.Title = SubNode.Attributes["title"].Value;
foreach (System.Xml.XmlNode ContentNode in SubNode.SelectNodes("plaintext"))
{
System.Threading.Thread.Sleep(1);
SubPod.PodText = ContentNode.InnerText;
}
foreach (System.Xml.XmlNode ContentNode in SubNode.SelectNodes("img"))
{
System.Threading.Thread.Sleep(1);
WolframAlphaImage Image = new WolframAlphaImage();
Image.Location = new Uri(ContentNode.Attributes["src"].Value);
Image.HoverText = ContentNode.Attributes["alt"].Value;
Image.Title = ContentNode.Attributes["title"].Value;
Image.Width = Convert.ToInt32 ( ContentNode.Attributes["width"].Value);
Image.Height = Convert.ToInt32 (ContentNode.Attributes["height"].Value);
SubPod.PodImage = Image;
}
Pod.SubPods.Add(SubPod);
}
WA_QueryResult.Pods.Add(Pod);
}
return WA_QueryResult;
}
#endregion
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace F.IA.WolframAlpha
{
public class WolframAlphaAssumption
{
private string WA_Word;
private List<string> WA_Categories = new List<string>();
public string Word
{
get { return WA_Word; }
set { WA_Word = value; }
}
public List<string> Categories
{
get { return WA_Categories; }
set { WA_Categories = value; }
}
}
}