zoukankan      html  css  js  c++  java
  • 园林空气净化器永久测试版

    首先这是一个用Jumony技术驱动的好玩的东西,需要先下载Jumony M1然后添加引用。

    其次只提供源代码,不负责任何技术支持,遇到任何问题请自己去修改。

    这款净化器的主要功能就是降糖降脂,促进新陈代谢,有益身心健康,但有造成页面崩溃等严重副作用,大家慎重选择。

    如何使用?

    首先编译成一个控制台程序,运行。然后修改host文件,加入127.0.0.1 www.cnblogs.com。最后关掉浏览器,重新打开www.cnblogs.com就可以了。

    该程序在有UAC控制的系统中,需要以管理员身份运行。

    源代码如下:

    using System;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Runtime.Serialization;
    using System.Runtime.Serialization.Json;
    using System.Text;
    using System.Text.RegularExpressions;
    using Ivony.Fluent;
    using Ivony.Web.Html;
    using Ivony.Web.Html.HtmlAgilityPackAdaptor;
    using HtmlAgilityPack;
    using System.Threading;
    namespace CnblogsCleaner
    {
      class Program
      {

        static void Main( string[] args )
        {

          var listener = new HttpListener();
          listener.Prefixes.Add( "http://*/" );

          listener.Start();

          while ( true )
          {
            var context = listener.GetContext();
            //ProcessContext( context );
            ((Actiondelegate { ProcessContext( context ); }).BeginInvoke( nullnull );


          }
        }


        private static void ProcessContext( HttpListenerContext context )
        {

          try
          {


            if ( !context.Request.Url.Host.EndsWith( "cnblogs.com" ) )
              return;

            var builder = new UriBuilder( context.Request.Url );

            builder.Host = "222.92.117.56";

            Console.WriteLine( context.Request.Url );

            var match = userBlogUrlRegex.Match( context.Request.Url.AbsoluteUri );

            if ( blockedUsers.Contains( match.Groups["username"].Value ) )
            {
              context.Response.StatusCode = 200;
              context.Response.ContentEncoding = Encoding.UTF8;
              using ( var writer = new StreamWriter( context.Response.OutputStream, Encoding.UTF8 ) )
              {
                writer.WriteLine( "此页面有害身心健康,已被园林空气净化器净化,如需查看,请关闭净化器。" );
              }
            }




            var request = (HttpWebRequestHttpWebRequest.Create( builder.Uri );
            request.Method = context.Request.HttpMethod;
            request.ProtocolVersion = context.Request.ProtocolVersion;
            request.AllowAutoRedirect = false;
            request.Timeout = (intnew TimeSpan( 0, 0, 10 ).TotalMilliseconds;


            request.Host = context.Request.Url.Host;

            foreach ( var key in context.Request.Headers.AllKeys )
            {
              SetHeader( request, key, context.Request.Headers.Get( key ) );
            }



            if ( context.Request.ContentLength64 > 0 )
            {

              using ( var stream = request.GetRequestStream() )
              {
                var buffer = new byte[context.Request.ContentLength64];
                context.Request.InputStream.Read( buffer, 0, buffer.Length );
                stream.Write( buffer, 0, buffer.Length );
              }

            }


            HttpWebResponse response;

            try
            {
              response = (HttpWebResponse) request.GetResponse();
            }
            catch ( WebException e )
            {
              response = (HttpWebResponse) e.Response;

              if ( e.Status != WebExceptionStatus.Success )
              {
                Console.WriteLine( "{0} {1}...", context.Request.Url, e.Status.ToString() );
                context.Response.Close();

                if ( response != null )
                  response.Close();

                return;
              }

              //return;
            }

            using ( response )
            {

              Console.WriteLine( "{0} response...", context.Request.Url );


              context.Response.StatusCode = (int) response.StatusCode;
              context.Response.StatusDescription = response.StatusDescription;

              foreach ( var key in response.Headers.AllKeys )
              {
                if ( key.Equals( "Content-Length"StringComparison.InvariantCultureIgnoreCase ) )
                  continue;

                if ( key.Equals( "Location"StringComparison.InvariantCultureIgnoreCase ) )
                {
                  context.Response.Redirect( response.Headers.Get( key ) );
                  continue;
                }

                context.Response.Headers.Add( key, response.Headers.Get( key ) );
              }


              MemoryStream memoryBuffer = new MemoryStream();

              if ( response.ContentLength > 0 )
              {

                using ( var stream = response.GetResponseStream() )
                {
                  byte[] buffer = new byte[1024];
                  while ( true )
                  {
                    int length = stream.Read( buffer, 0, buffer.Length );
                    if ( length == 0 )
                      break;

                    memoryBuffer.Write( buffer, 0, length );
                  }
                }


                memoryBuffer.Seek( 0, SeekOrigin.Begin );


                try
                {
                  if ( response.ContentType.StartsWith( "text/" ) )
                  {
                    var encoding = Encoding.GetEncoding( response.CharacterSet );
                    var content = new StreamReader( memoryBuffer, encoding ).ReadToEnd();

                    Console.WriteLine( content );

                    if ( response.ContentType.Split( ';' )[0] == "text/html" )
                    {
                      content = Cleanup( context.Request.Url, content );

                      memoryBuffer = new MemoryStream( encoding.GetBytes( content ) );
                    }

                  }

                  if ( context.Request.Url.Equals( new Uri"http://www.cnblogs.com/ws/BlogPost.asmx/GetSiteHomePosts" ) ) || context.Request.Url.Equals( new Uri"http://www.cnblogs.com/ws/BlogPost.asmx/GetHeadline" ) ) )
                  {

                    var serializer = new DataContractJsonSerializertypeofCnblogsJsonType ) );

                    var data = (CnblogsJsonType) serializer.ReadObject( memoryBuffer );

                    data.d = Cleanup( context.Request.Url, data.d );

                    memoryBuffer = new MemoryStream();

                    serializer.WriteObject( memoryBuffer, data );

                  }
                }
                catch ( Exception e )
                {
                  Console.WriteLine( e );
                }

                memoryBuffer.WriteTo( context.Response.OutputStream );
              }
            }
          }
          catch ( Exception e )
          {
            Console.WriteLine( e );
          }

          context.Response.Close();
        }

        [DataContract]
        private class CnblogsJsonType
        {
          [DataMember]
          public string d { getset; }
        }


        private static void SetHeader( HttpWebRequest request, string key, string value )
        {
          switch ( key )
          {
            case "Accept":
              request.Accept = value;
              break;
            case "Connection":
              if ( value.Equals( "Keep-Alive"StringComparison.InvariantCultureIgnoreCase ) )
              {
                request.KeepAlive = true;
                break;
              }
              if ( value.Equals( "Closed"StringComparison.InvariantCultureIgnoreCase ) )
                break;
              request.Connection = value;
              break;
            case "Content-Length":
              //request.ContentLength = long.Parse( value );
              break;
            case "Content-Type":
              request.ContentType = value;
              break;
            case "Date":
              request.Date = DateTime.Parse( value );
              break;
            case "Expect":
              request.Expect = value;
              break;
            case "Host":
              //request.Host = value;
              break;
            case "If-Modified-Since":
              request.IfModifiedSince = DateTime.Parse( value );
              break;
            case "Range":
              throw new NotSupportedException();
            case "Referer":
              request.Referer = value;
              break;
            case "Transfer-Encoding":
              request.TransferEncoding = value;
              break;
            case "User-Agent":
              request.UserAgent = value;
              break;
            case "Proxy-Connection":
              throw new NotSupportedException();
            case "Accept-Encoding":
              break;
            default:
              request.Headers.Set( key, value );
              break;
          }
        }


        private static readonly Regex userBlogUrlRegex = new Regex@"(^http://www.cnblogs.com/(?<username>\w+)/(?<resource>.*)$)|(^http://(?<username>\w+).cnblogs.com/(?<resource>.*)$)"RegexOptions.Compiled );

        private static readonly string[] blockedUsers = new[] { "firelong""huasheng" };

        private static string Cleanup( Uri url, string content )
        {

          var rawDocument = new HtmlDocument();
          rawDocument.LoadHtml( content );
          var document = rawDocument.AsDocument();


          document.Find( "A" ).Select( element => element.Attribute( "href" ) ).Where( attribute => attribute.Value() != null ).ToArray()
            .ForAll( attribute =>
              {
                var href = new Uri( url, attribute.Value() ).AbsoluteUri;

                var match = userBlogUrlRegex.Match( href );

                if ( blockedUsers.Contains( match.Groups["username"].Value ) )
                {

                  if ( match.Groups["resource"].Value != "" )
                  {
                    var element = FindContainer( attribute.Element );
                    element.Remove();
                  }
                  else
                    attribute.Element.Remove();
                }


              } );


          return document.OuterHtml();
        }

        private static IHtmlElement FindContainer( IHtmlElement element )
        {

          var container = element;

          while ( true )
          {
            var parent = container.Parent;
            if ( parent == null )
              break;

            if ( parent.Find( "A" ).Select( e => e.Attribute( "href" ).Value() ).ToArray().NotNull().Count( href => userBlogUrlRegex.IsMatch( href ) ) > 1 )
              return container;

            container = parent as IHtmlElement;
            if ( container == null )
              break;
          }

          return element;
    
  • 相关阅读:
    MongoDB
    Mac下将Python2.7改为Python3
    Kafka
    Server 基础概念 备忘
    应用内支付
    Sign in with apple
    Linux三剑客grep/sed/awk
    React-Native中使用到的一些JS特性
    Date Picker控件:
    Picker View控件:
  • 原文地址:https://www.cnblogs.com/Ivony/p/1814751.html
Copyright © 2011-2022 走看看