Счетчики на Web-страничках.
На этой страничке, я расскажу об одной маленькой хитрости - как можно показать на своей страничке всякие полезные счетчики - либо аналогичные Spylog/Liveinternet либо еще более полезные какие-то свои собственные счетчики. Кроме того, получение нормальных отчетов по счетчикам Spylog/Liveinternet платное. Программисту тупо платить даже $50 в месяц за какие-то там отчеты, которые можно и самому выпустить элементарно по своим собственным данным в своей собственной базе. |
Основная проблема при показе счетчика, чтобы браузер сам включил в текст странички счетчик прямо на клиенте. Для этого есть множество причин:
- Странички часто бывают статические (чистый HTML) и никакого серверного кода не существует в принципе.
- Серверные технологии настолько разные, что изготовить некий публичный аналог Spylog/Liveinternet для множества различных серверных технологий практически невозможно.
- Сайт может быть очень большим (как например вот этот мой информационный сайт из многих тысяч страниц) - и изготовление такого сайта на серверной технологии вообще нецеллесообразно в силу немыслимо долгой компиляции и работы.
- Счетчики, выполненные текстом будут подвержены искажению стилями странички - потеряют цвет, размер, расползутся по страничке.
Следовательно, счетчики должны включаться непосредственно в HTML-код отрабатыватся именно на стороне клиента - в браузере. Вопрос заключается в том, как это сделать. Для этого существуют три пути:
- Исхитриться и сделать с помощью AJAX запрос из браузера за данными для счетчика непосредственно в базу на сервере, а потом javascript-ом вписать результат запроса в базу (счетчик) текстом в нужное место странички. Это наиболее бестолковый путь - потому что придется на клиенте показывать коннект к базу, да и текстовые данные счетчика могут потерять форматирование из-за пользовательских стилей странички. Кроме того, javascript не будет обращаться к другому домену, поэтому для публичных счетчиков этот путь невозможен в принципе.
- Можно показать счетчик во фрейме. Фремы - лучшее решение во многих случаях. Так обычно показывают сложные комбинированные рекламные баннеры чужого сайта или, например, карты Google Maps. Так показывают флеш-ролики, чтобы не задерживать загрузку основного текста странички, например Настройка производительности SQL-сервера. Так показывают флеш-ролики, которыем можно комментировать, чтобы не постбечилась вся основная страничка и ролик не перезагружался с начала. Без фреймов показ комментируемых неперезагружаемых роликов тормозит безумно - Мультимедиа на Web-страничках. Поэтому фреймы - самый удобный, а часто единственный путь решения многих задач.
- Наконец, можно просто показать рисунок с нужным сформированным изображением с данными счетчика. Этот третий путь - обычно самый целлесообразный для счетчиков. Так поступают фирмы-владельцы счетчиков Spylog/Liveinternet/mail.ru, так поступают почти все, например погодные информеры meteonova сделаны так же. Так же поступил и я - для показа количества комментариев в гостевой книге к этой страничке - включив в HTML-код странички следующий код:
<img border="0" src="//forum.vb-net.com/GetTopicCount.png?id=11BA946C-3194-4FDF-B1DD-238EC837A0F4" />
Теперь я покажу свой код хандлера GetTopicCount.ashx, который формирует картинку с изображением счетчика комментариев. Более сложные картинки, такие как Spylog/Liveinternet/mail.ru/meteonova изготавливаются ровно точно так же, за исключением того, что у них в объекте Drawing.Graphics рисуется что-то еще, а у меня в этом коде рисуется командой G.DrawString лишь одна строка с текстом:
1: <%@ WebHandler Language="VB" Class="GetTopicCount" %>
2:
3: Imports System
4: Imports System.Web
5:
6: Public Class GetTopicCount : Implements IHttpHandler
7: Dim ImageHeigth As Integer = 10
8: Dim ImageWidth As Integer = 10
9:
10: Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
11: context.Response.ContentType = "image/gif"
12: Dim X As New Drawing.Bitmap(ImageWidth + 10, ImageHeigth)
13: Dim G As Drawing.Graphics = Drawing.Graphics.FromImage(X)
14: 'background-color:#FDF5E6;
15: G.Clear(System.Drawing.Color.FromArgb(Convert.ToInt32("FD", 16), Convert.ToInt32("F5", 16), Convert.ToInt32("E6", 16)))
16: Try
17: If context.Current.Request.QueryString("id") IsNot Nothing Then
18: If context.Current.Request.QueryString("id") <> "" Then
19: Dim TopicGuid As Guid
20: TopicGuid = New Guid(context.Current.Request.QueryString("id"))
21: 'есть параметр и он ГУИД
22: Dim CN As New System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings("SQLServer_ConnectionStrings").ConnectionString)
23: CN.Open() 'здесь иногда валится по таймауту или из-за исчерпания пула подключений (задаются Max Pool Size в коннекшн-стринге)
24: Dim CMD1 As New System.Data.SqlClient.SqlCommand("select count(*) as TOPIC_COUNT from forum with (nolock) where ToTopic = '" & TopicGuid.ToString & "'", CN)
25: Dim TOPIC_COUNT As Integer = CMD1.ExecuteScalar
26: CN.Close()
27: G.DrawString(TOPIC_COUNT.ToString, New Drawing.Font("", ImageHeigth, Drawing.FontStyle.Regular, Drawing.GraphicsUnit.Pixel), Drawing.Brushes.Blue, 0, -2)
28: Else
29: G.DrawString("000", New Drawing.Font("", ImageHeigth, Drawing.FontStyle.Regular, Drawing.GraphicsUnit.Pixel), Drawing.Brushes.Blue, 0, -2)
30: End If
31: Else
32: G.DrawString("000", New Drawing.Font("", ImageHeigth, Drawing.FontStyle.Regular, Drawing.GraphicsUnit.Pixel), Drawing.Brushes.Blue, 0, -2)
33: End If
34: Catch ex As Exception
35: G.DrawString("000", New Drawing.Font("", ImageHeigth, Drawing.FontStyle.Regular, Drawing.GraphicsUnit.Pixel), Drawing.Brushes.Blue, 0, -2)
36: End Try
37: X.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Gif)
38: End Sub
39:
40: Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
41: Get
42: Return False
43: End Get
44: End Property
45:
46: End Class
Вы легко сможете преобразовать этот код для изготвления более сложного информера. В моем коде ID идентифицирует конкретную страничку моего сайта, вы можете им идентифицировать не только страничку, но и клиента.
Точно таким же кодом формируются не только всевозможные счетчики и информеры, но и капчи, которыми удостоверяются кто именно пытается логинится в сайт - робот или человек. Например такие как капчи, которые вы видите user.votpusk.ru, asp-net.ru, terminal.gisis.ru или любые другие.
А вот для того, чтобы программист не чуствовал себя идиотом, который платит не за что - можно отчеты, которые создают счетчики Spylog/Liveinternet/mail/yandex - создавать самому. Для этого всего-навсего необходимо в этом хандлере счетчика добавить две-три строчки, которые положат в базу любой из параметров, которые приносит с собой браузер или определяет драйвер IIS. А потом выпустить любой нужный вам отчет уже по данным в своей базе:
Для просмотра параметров WebRequest'а я создал публичный сервис : //www.vb-net.com/RequestTest.ashx, которым вы тоже можете воспользоваться. С ппмощью этого сервиса интернет-серферы могут посмотреть какие параметры приносит их браузер на любой Web-сервер, а программисты могут отобрать интересущие параметры для сохранения себе в базу для дальнейшего формирования по этим сведениям отчетов. (В принципе таких публичных сервисов у меня создано достаточно много, например здесь Шлюзы к платежным системам интернет-денег я описал технику применения похожего сервиса //www.vb-net.com/PostTest.ashx.)
|