@using System.IO; @using System.Web; @using System.Net; @using System.Xml; @using System.Collections.Generic; @functions { /* ASP.NET Web Pages C# sample code for Copyscape Premium API Compatible with ASP.NET Web Pages 2.0 or later (with Razor View Engine) You may install, use, reproduce, modify and redistribute this code, with or without modifications, subject to the general Terms and Conditions on the Copyscape website. For any technical assistance please contact us via our website. 07-May-2013: First version Copyscape (c) Indigo Stream Technologies 2013 - http://www.copyscape.com/ Instructions for use: 1. Set the constants COPYSCAPE_USERNAME and COPYSCAPE_API_KEY below to your details. 2. Call the appropriate API function, following the examples below. 3. The API response is in XML, which in this sample code is parsed and returned as an XMLElement. 4. To run the examples provided, please set run_examples in the next line to true: */ public static bool run_examples = false; /* Error handling: * If a call failed completely (e.g. HttpWebRequest failed to connect), functions return null. * If the API returned an error, the response XmlElement will contain an 'error' node. */ /* A. Constants you need to change */ const string COPYSCAPE_USERNAME = "your-copyscape-username"; const string COPYSCAPE_API_KEY = "your-copyscape-api-key"; const string COPYSCAPE_API_URL = "http://www.copyscape.com/api/"; /* B. static public functions for you to use (all accounts) */ static public XmlElement copyscape_api_example_search() { Dictionary urlparams = new Dictionary(); urlparams.Add( "x", "1" ); return copyscape_api_call( "csearch", urlparams ); } static public XmlElement copyscape_api_url_search_internet( string url, int full=0 ) { return copyscape_api_url_search( url, full, "csearch" ); } static public XmlElement copyscape_api_text_search_internet( string text, string encoding, int full=0 ) { return copyscape_api_text_search( text, encoding, full, "csearch" ); } static public XmlElement copyscape_api_check_balance() { return copyscape_api_call( "balance" ); } /* C. static public functions for you to use (only accounts with private index enabled) */ static public XmlElement copyscape_api_url_search_private( string url, int full=0 ) { return copyscape_api_url_search( url, full, "psearch" ); } static public XmlElement copyscape_api_url_search_internet_and_private( string url, int full=0 ) { return copyscape_api_url_search( url, full, "cpsearch" ); } static public XmlElement copyscape_api_text_search_private( string text, string encoding, int full=0 ) { return copyscape_api_text_search( text, encoding, full, "psearch" ); } static public XmlElement copyscape_api_text_search_internet_and_private( string text, string encoding, int full=0 ) { return copyscape_api_text_search( text, encoding, full, "cpsearch" ); } static public XmlElement copyscape_api_url_add_to_private( string url, string id=null ) { Dictionary urlparams = new Dictionary(); urlparams.Add( "q", url ); if (id != null) urlparams.Add( "i", id ); return copyscape_api_call( "pindexadd", urlparams ); } static public XmlElement copyscape_api_text_add_to_private( string text, string encoding, string title=null, string id=null ) { Dictionary urlparams = new Dictionary(); urlparams.Add( "e", encoding ); if (title != null) urlparams.Add( "a", title ); if (id != null) urlparams.Add( "i", id ); return copyscape_api_call( "pindexadd", urlparams, text ); } static public XmlElement copyscape_api_delete_from_private( string handle ) { Dictionary urlparams = new Dictionary(); urlparams.Add( "h", handle ); return copyscape_api_call( "pindexdel", urlparams); } public static HtmlString wrap_title( string title ) { return new HtmlString(""+HttpContext.Current.Server.HtmlEncode(title)+":"); } public static HtmlString wrap_node( XmlNode node ) { return new HtmlString("
"+node_recurse(node)+"

" ); } private static string node_recurse( XmlNode node, int depth=0 ) { string ret = ""; if (node == null) return ret; if (node.NodeType == XmlNodeType.Text) ret += HttpContext.Current.Server.HtmlEncode(node.Value); else ret += "\n" + new string('\t',depth) + HttpContext.Current.Server.HtmlEncode(node.Name) + ": "; if (node.HasChildNodes) { for (int i=0; i < node.ChildNodes.Count; i++) ret += node_recurse( node.ChildNodes[i], depth+1 ); } return ret; } /* D. Functions used internally */ static private XmlElement copyscape_api_url_search( string url, int full=0, string operation="csearch") { Dictionary urlparams = new Dictionary(); urlparams.Add( "q", url ); if (full != 0) urlparams.Add( "c", full.ToString() ); return copyscape_api_call( operation, urlparams ); } static private XmlElement copyscape_api_text_search( string text, string encoding, int full=0, string operation="csearch" ) { Dictionary urlparams = new Dictionary(); urlparams.Add( "e", encoding ); if (full != 0) urlparams.Add( "c", full.ToString() ); return copyscape_api_call( operation, urlparams, text ); } static private XmlElement copyscape_api_call( string operation, Dictionary urlparams=null, string postdata=null ) { string url = COPYSCAPE_API_URL + "?u=" + HttpUtility.UrlEncode(COPYSCAPE_USERNAME) + "&k=" + HttpUtility.UrlEncode(COPYSCAPE_API_KEY) + "&o=" + HttpUtility.UrlEncode(operation); if (urlparams != null) { foreach (KeyValuePair kvp in urlparams) url += ( "&" + HttpUtility.UrlEncode(kvp.Key) + "=" + HttpUtility.UrlEncode(kvp.Value) ); } Uri uri = new Uri(url); string output = null; HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri); request.Method = (postdata==null) ? WebRequestMethods.Http.Get : WebRequestMethods.Http.Post; request.ContentType = "application/x-www-form-urlencoded"; if (postdata != null) { StreamWriter writer = new StreamWriter(request.GetRequestStream(), System.Text.Encoding.UTF8); writer.Write(postdata); writer.Close(); } HttpWebResponse response = (HttpWebResponse)request.GetResponse(); StreamReader reader = new StreamReader(response.GetResponseStream()); output = reader.ReadToEnd(); response.Close(); if (output.Length > 0) { XmlDocument doc = new XmlDocument(); doc.LoadXml(output); return (XmlElement)doc.SelectSingleNode("/*"); } return null; } } @{ /* E. Some examples of use */ if (run_examples == true) { string exampletext = "We hold these truths to be self-evident, that all men are created equal, that they are endowed by their "+ "Creator with certain unalienable rights, that among these are Life, Liberty, and the pursuit of Happiness. That to "+ "secure these rights, Governments are instituted among Men, deriving their just powers from the consent of the "+ "governed. That whenever any Form of Government becomes destructive of these ends, it is the Right of the People to "+ "alter or to abolish it, and to institute new Government, laying its foundation on such principles and organizing "+ "its powers in such form, as to them shall seem most likely to effect their Safety and Happiness. Prudence, indeed, "+ "will dictate that Governments long established should not be changed for light and transient causes; and "+ "accordingly all experience hath shown, that mankind are more disposed to suffer, while evils are sufferable, than "+ "to right themselves by abolishing the forms to which they are accustomed. But when a long train of abuses and "+ "usurpations, pursuing invariably the same Object evinces a design to reduce them under absolute Despotism, it is "+ "their right, it is their duty, to throw off such Government, and to provide new Guards for their future security. "+ "Such has been the patient sufferance of these Colonies; and such is now the necessity which constrains them to "+ "alter their former Systems of Government. The history of the present King of Great Britain is a history of "+ "repeated injuries and usurpations, all having in direct object the establishment of an absolute Tyranny over these "+ "States. To prove this, let Facts be submitted to a candid world. He has refused his Assent to Laws, the most "+ "wholesome and necessary for the public good. "+ "We, therefore, the Representatives of the United States of America, in General Congress, Assembled, "+ "appealing to the Supreme Judge of the world for the rectitude of our intentions, do, in the Name, and by Authority "+ "of the good People of these Colonies, solemnly publish and declare, That these United Colonies are, and of Right "+ "ought to be free and independent states; that they are Absolved from all Allegiance to the British Crown, and that "+ "all political connection between them and the State of Great Britain, is and ought to be totally dissolved; and "+ "that as Free and Independent States, they have full Power to levy War, conclude Peace, contract Alliances, "+ "establish Commerce, and to do all other Acts and Things which Independent States may of right do. And for the "+ "support of this Declaration, with a firm reliance on the Protection of Divine Providence, we mutually pledge to "+ "each other our Lives, our Fortunes, and our sacred Honor."; @wrap_title( "Response for a simple URL Internet search" ); @wrap_node( copyscape_api_url_search_internet("http://www.copyscape.com/example.html") ); @wrap_title( "Response for a URL Internet search with full comparisons for the first two results" ); @wrap_node( copyscape_api_url_search_internet("http://www.copyscape.com/example.html", 2) ); @wrap_title( "Response for a simple text Internet search" ); @wrap_node( copyscape_api_text_search_internet(exampletext, "ISO-8859-1") ); @wrap_title( "Response for a text Internet search with full comparisons for the first two results" ); @wrap_node( copyscape_api_text_search_internet(exampletext, "ISO-8859-1", 2) ); @wrap_title( "Response for a check balance request" ); @wrap_node( copyscape_api_check_balance() ); @wrap_title( "Response for a URL add to private index request" ); @wrap_node( copyscape_api_url_add_to_private("http://www.copyscape.com/example.html") ); @wrap_title( "Response for a text add to private index request" ); XmlElement response = copyscape_api_text_add_to_private( exampletext, "ISO-8859-1", "Extract from Declaration of Independence", "EXAMPLE_1234" ); @wrap_node( response ); string handle = (response != null && response["handle"] != null) ? response["handle"].InnerText : ""; @wrap_title( "Response for a URL private index search" ); @wrap_node( copyscape_api_url_search_private("http://www.copyscape.com/example.html") ); @wrap_title( "Response for a delete from private index request" ); @wrap_node( copyscape_api_delete_from_private(handle) ); @wrap_title( "Response for a text search of both Internet and private index with full comparisons for the first result (of each type)" ); @wrap_node( copyscape_api_text_search_internet_and_private(exampletext, "ISO-8859-1", 1) ); } }