通过编程自动化增加CSDN博客的访问量

  • Post author:
  • Post category:其他


前段时间经过观察,我发现,和大多数的博客一样,CSDN在每篇博客文章的上方,都有一个阅读量。这个阅读量的增加,是通过Web用户在浏览器端输入这篇文章的url地址,然后发送请求到服务器端,这时,阅读量就会加1,跟访问者是否登录没有关系。但是需要注意的是,前后的两次请求不能是同一个Session,也就是说,需要重新启动一个浏览器窗口。还有就是,前后两次请求不能间隔时间太短,否则无法刷访问量。

我们可以写一个控制台程序,然后每隔几秒钟就启动一个线程,这个线程的作用,就是启动浏览器访问指定页面,然后Sleep一段时间后,关闭浏览器。一段时间后,在开启浏览器,如此重复,直到刷出指定的次数。


static void Main(string[] args)
        {

            for (int i = 0; i < 1000; i++)
            {
                Util util = new Util();
                util.StartThread();
                Thread.Sleep(90000);
                util.Close();
            }
        }


	public class Util
    	{
        	public void StartThread()
        	{
            		ThreadStart start = new ThreadStart(StartIE);
            		Thread thread = new Thread(start);
            		thread.Start();
            
       		}

	private void StartIE()
        {
            Process.Start("http://blog.csdn.net/sundacheng1989/article/details/7645498");
        }

        public void Close()
        {
            System.Diagnostics.Process[] myProcesses = System.Diagnostics.Process.GetProcesses();

            foreach (System.Diagnostics.Process myProcess in myProcesses)
            {
                if (myProcess.ProcessName.ToUpper() == "IEXPLORE")
                {
                    myProcess.Kill();
                }
            }
        }
    }

2015年11月更新:

上边的那些代码是刚刚接触C#的时候写的,对于很多地方还不是很明白,所以很乱。最近有时间了,又重写了一下这方面的东西。其实原理很简单,就是CSDN对于某篇文章的访问量的计数原则很简单,就是有人访问了这个页面,页面的访问量就加1.

基于此,使用ASP.NET Web API的HttpClient重写了这个工具。涉及到了一些多线程以及异步同步的基础。相关代码如下

using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace VisitAmountIncreaser
{
    class Program
    {
        static void Main()
        {
            Console.WriteLine("The application is staring!");
            //string url = Console.ReadLine();
            string url = "http://blog.csdn.net";
            int threadAcount = 2;
            StartTask(url);
            string command = Console.ReadLine();
            if (string.CompareOrdinal(command, "X") == 0)
            {
                Console.WriteLine("Application will quit after 30 seconds!");
                Thread.Sleep(30000);
            }
        }

        static async void StartTask(string url)
        {
            while (true)
            {
                await RunVisit(url);
            }
        }

        static async Task RunVisit(string url)
        {
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri(url);
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/html"));

                try
                {
                    HttpResponseMessage response = await client.GetAsync("sundacheng1989/article/details/7945542");
                    response.EnsureSuccessStatusCode();    // Throw if not a success code.

                    string content = await response.Content.ReadAsStringAsync();

                    string result = GetStringInBetween(content, "<span class=\"link_view\" title=\"阅读次数\">", "</span>");
                    Console.WriteLine(result);
                }
                catch (HttpRequestException e)
                {
                    Console.WriteLine(e.Message);
                }
            }
        }

        public static string GetStringInBetween(string strSource, string strStart, string strEnd)
        {
            if (strSource.Contains(strStart) && strSource.Contains(strEnd))
            {
                int Start = strSource.IndexOf(strStart, 0, System.StringComparison.Ordinal) + strStart.Length;
                int End = strSource.IndexOf(strEnd, Start, System.StringComparison.Ordinal);
                return strSource.Substring(Start, End - Start);
            }
            else
            {
                return "";
            }
        }
    }
}

其实,当运行这个console程序时候,我们可以把这个exe复制多个,然后同时运行,那么就是多个进程同时干这件事了。在本机测试后,这段代码运行没有问题。

代码已经打包,下载地址:

http://files.cnblogs.com/files/Robin-Sun/VisitAmountIncreaser.zip




版权声明:本文为sundacheng1989原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。