前段时间经过观察,我发现,和大多数的博客一样,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 = "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();
-
- 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