Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // /* This is a Reversing Juntalis project.
- // *
- // * Copyright (C) 2010
- // * http://juntalis.com
- // */
- #region
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Net;
- using System.Text;
- using System.Text.RegularExpressions;
- using System.Web;
- using HtmlAgilityPack;
- #endregion
- namespace NSnipplr
- {
- /// <summary>
- /// Do a search for a snippet.
- /// </summary>
- public class Search
- {
- private readonly List<SnippetSearchResult> _lstResults;
- /// <summary>
- /// Constructor
- /// </summary>
- /// <param name = "query">What to search for</param>
- public Search(string query)
- {
- _lstResults = new List<SnippetSearchResult>();
- }
- /// <summary>
- /// Constructor
- /// </summary>
- public Search()
- {
- _lstResults = new List<SnippetSearchResult>();
- }
- /// <summary>
- /// </summary>
- public List<SnippetSearchResult> Results
- {
- get { return _lstResults; }
- }
- /// <summary>
- /// Execute the search
- /// </summary>
- /// <param name = "query">What to search for.</param>
- /// <param name = "language">Language to search in.</param>
- /// <returns></returns>
- public bool Execute(string query, SnippetLanguage language)
- {
- HttpWebResponse objResponse;
- string sLanguage = String.Format("{0}", language);
- string sSession;
- if (!getCookies(out sSession)) return false;
- if (doRequest(query, sLanguage, sSession, out objResponse)) {
- if (objResponse.StatusCode == HttpStatusCode.OK) {
- Stream resStream = objResponse.GetResponseStream();
- StringBuilder sb = new StringBuilder();
- byte[] buf = new byte[512];
- int count;
- do {
- if (resStream != null) count = resStream.Read(buf, 0, buf.Length);
- else return false;
- if (count == 0) continue;
- string tempString = Encoding.ASCII.GetString(buf, 0, count);
- sb.Append(tempString);
- } while (count > 0);
- objResponse.Close();
- string sResultsDirty =
- Regex.Match(sb.ToString(), "<ol class=\"snippets marg\">(?<results>.+?)</ol>",
- RegexOptions.Singleline | RegexOptions.IgnoreCase).Groups["results"].Value;
- traverseDOM("<ol>" + sResultsDirty + "</ol>");
- return true;
- }
- }
- return false;
- }
- /// <summary>
- /// Internal method for the actual HTTP web request.
- /// </summary>
- /// <param name = "query"></param>
- /// <param name = "language"></param>
- /// <param name = "cookie"></param>
- /// <param name = "response"><see cref = "WebResponse" /> of the result.</param>
- /// <returns><see cref = "bool" />Did it work?</returns>
- protected internal bool doRequest(string query, string language, string cookie, out HttpWebResponse response)
- {
- response = null;
- try {
- HttpWebRequest request = (HttpWebRequest) WebRequest.Create("http://snipplr.com/search.php");
- request.UserAgent =
- "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 ( .NET CLR 3.5.30729; .NET4.0E)";
- request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8,application/json";
- request.Headers.Set(HttpRequestHeader.AcceptLanguage, "en-us,en;q=0.5");
- request.Headers.Set(HttpRequestHeader.AcceptEncoding, "gzip,deflate");
- request.Headers.Set(HttpRequestHeader.AcceptCharset, "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
- request.Headers.Add("Keep-Alive", "115");
- request.Headers.Set(HttpRequestHeader.Cookie, @"PHPSESSID=" + cookie + ";");
- request.KeepAlive = true;
- request.Referer = "http://snipplr.com/search.php?advanced";
- request.ContentType = "application/x-www-form-urlencoded";
- request.Method = "POST";
- string postString = @"q=" + HttpUtility.UrlEncode(query) + @"&lang=" + language + @"&scope=all&btnsubmit=SEARCH";
- byte[] postBytes = Encoding.UTF8.GetBytes(postString);
- Stream stream = request.GetRequestStream();
- stream.Write(postBytes, 0, postBytes.Length);
- stream.Close();
- response = (HttpWebResponse) request.GetResponse();
- } catch (WebException e) {
- if (e.Status == WebExceptionStatus.ProtocolError) response = (HttpWebResponse) e.Response;
- else return false;
- } catch (Exception) {
- if (response != null) response.Close();
- return false;
- }
- return true;
- }
- /// <summary>
- /// Tries to request the URL: http://snipplr.com/search.php?advanced
- /// </summary>
- /// <param name = "cookies">Cookie collection returned by Snipplr</param>
- /// <returns>True if the request was successful; false otherwise.</returns>
- protected internal bool getCookies(out string cookie)
- {
- HttpWebResponse response = null;
- try {
- //Create request to URL.
- HttpWebRequest request = (HttpWebRequest) WebRequest.Create("http://snipplr.com/search.php?advanced");
- //Set request headers.
- request.UserAgent =
- "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 ( .NET CLR 3.5.30729; .NET4.0E)";
- request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8,application/json";
- request.Headers.Set(HttpRequestHeader.AcceptLanguage, "en-us,en;q=0.5");
- request.Headers.Set(HttpRequestHeader.AcceptEncoding, "gzip,deflate");
- request.Headers.Set(HttpRequestHeader.AcceptCharset, "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
- request.Headers.Add("Keep-Alive", "115");
- request.KeepAlive = true;
- request.Referer = "http://snipplr.com/search.php";
- //Get response to request.
- response = (HttpWebResponse) request.GetResponse();
- } catch (WebException e) {
- if (e.Status == WebExceptionStatus.ProtocolError) response = (HttpWebResponse) e.Response;
- else {
- cookie = null;
- return false;
- }
- } catch (Exception) {
- if (response != null) response.Close();
- cookie = null;
- return false;
- }
- cookie =
- Regex.Match(response.GetResponseHeader("Set-Cookie"), "PHPSESSID=(?<sessid>.+?);",
- RegexOptions.Singleline | RegexOptions.IgnoreCase).Groups["sessid"].Value;
- response.Close();
- return true;
- }
- /// <summary>
- /// Traverse the DOM to get results.
- /// </summary>
- /// <param name = "dirtyText">Regular expression treated response from our web request.</param>
- protected void traverseDOM(string dirtyText)
- {
- if (string.IsNullOrEmpty(dirtyText)) return;
- HtmlDocument docTraversal = new HtmlDocument();
- docTraversal.LoadHtml(dirtyText);
- // Cycle through nodes.
- foreach (HtmlNode snippet in docTraversal.DocumentNode.SelectNodes("/ol[1]/li")) {
- HtmlNode nodeSnippet = snippet.Element("h3").ChildNodes[1];
- SnippetSearchResult result = new SnippetSearchResult
- {
- Title = nodeSnippet.InnerText,
- Url = nodeSnippet.GetAttributeValue("href", string.Empty)
- };
- result.Id = Regex.Match(result.Url, @"^/view/(?<id>\d+)/.+/$", RegexOptions.IgnoreCase).Groups["id"].Value;
- result.Language = snippet.Element("span").Element("a").InnerText;
- _lstResults.Add(result);
- }
- }
- }
- /// <summary>
- /// </summary>
- public struct SnippetSearchResult
- {
- /// <summary>
- /// </summary>
- public string Title { get; set; }
- /// <summary>
- /// </summary>
- public string Language { get; set; }
- /// <summary>
- /// </summary>
- public string Url { get; set; }
- /// <summary>
- /// </summary>
- public string Id { get; set; }
- }
- /// <summary>
- /// Enum containing the languages we can search for.
- /// </summary>
- public enum SnippetLanguage
- {
- // ReSharper disable DeclarationDoesntConformToNamingConventions
- // ReSharper disable InconsistentNaming
- All = 0,
- ActionScript = 11,
- ActionScriptThree = 45,
- Apache = 46,
- AppleScript = 16,
- ASP = 29,
- Assembler = 28,
- AutoIt = 65,
- Awk = 83,
- Bash = 31,
- C = 69,
- CSharp = 19,
- Cpp = 14,
- Clojure = 80,
- ColdFusion = 38,
- CSS = 5,
- Delphi = 59,
- Diff = 30,
- Django = 57,
- DOSBatch = 64,
- EmacsLisp = 44,
- eZPublish = 49,
- Forth = 33,
- Fortran = 21,
- Gnuplot = 82,
- Groovy = 37,
- HAML = 66,
- Haskell = 77,
- HTML = 2,
- iPhone = 63,
- Java = 12,
- JavaScript = 1,
- jQuery = 76,
- LaTeX = 54,
- lighttpd = 61,
- Lisp = 17,
- Lua = 24,
- Makefile = 73,
- MatLab = 20,
- Maxscript = 74,
- Mel = 84,
- MXML = 58,
- MySQL = 75,
- NewtonScript = 39,
- ObjectiveC = 9,
- OpenFirmware = 32,
- Other = 3,
- Pascal = 27,
- Perl = 6,
- PHP = 4,
- PicBasic = 36,
- PLSQL = 72,
- Processing = 68,
- Prolog = 50,
- Pseudocode = 79,
- Python = 7,
- R = 47,
- Rails = 42,
- Regex = 34,
- Revolution = 71,
- Ruby = 8,
- SAS = 56,
- SASS = 67,
- Scala = 62,
- Scheme = 51,
- SmallTalk = 22,
- Smarty = 35,
- SML = 40,
- SPSS = 70,
- SQL = 10,
- SVN = 18,
- Symfony = 81,
- TCL = 23,
- Textpattern = 60,
- TYPO3 = 48,
- VbNET = 25,
- VHDL = 26,
- VisualBasic = 43,
- WLanguage = 41,
- PowerShell = 55,
- WinRegistry = 52,
- XHTML = 53,
- XML = 13,
- XSLT = 78
- // ReSharper restore InconsistentNaming
- // ReSharper restore DeclarationDoesntConformToNamingConventions
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement