الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

هدية للمنتديات العربية, طريقة وضع خريطة داخل موقعك وإظهار Ip الخاص بالزوار المتواجدين عليها

بدأه rozester في 23 يوليو 2009 · 10 رد · 3,241 مشاهدة · في ASP.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكــم ورحمـة الله وبركاتــه ،،

1- مقدمة:

في البداية لاحظت أن الكثيرين من مديري المواقع (Webmasters) يتساءلون باستمرار عن كيفية رصد الزوار المتواجدين للموقع, وكان أقصى حلمهم أن يعرفوا الأي بي ثم بعد ذلك يقومون بفتح مواقع أخرى لمعرفة الدولة/المدينة, ويوجد الكثير من هذه المواقع تقدم هذه الخدمة بشكل مجاني, ويوجد من يقدمها نظير مبالغ خيالية.

على سبيل المثال:

http://cqcounter.com/whois/

وموقع

http://www.ip2location.com/

2- ما هو الحل الأمثل لرصد إحداثيات الزوار لموقعك دون الاستعانة بمواقع خارجية ؟

قبل أن نتكلم عن هذا الحل أود أن أقول أن هذه الفكرة ليست جديدة بل هي موجودة على المنتديات الأجنبية, ولكن للأسف فإننا كمبرمجين عرب لا نكلف أنفسنا كثيراً بالبحث فيها والموقع الشهير

http://www.codeproject.com

يعد موقع رائد في مجال البرمجة على مستوى العالم ويجب على أي مبرمج متابعة الجديد فيه باستمرار

المهم

كيف تظهر الخريطة داخل موقعك ؟

يوجد طريقتين شهيرتين للتعامل مع الخرائط:-

1- Google Map:

post-75999-1248317254_thumb.png

وذلك عن طريق الاشتراك - مجاني - داخل الجوجل, ثم يقوم الجوجل بتزويدك بـ API الخاص بالخرائط لتضعها في موقعك

حقيقة أنا لم أجربها بعد, لأن الاشتراك لا يمكن تجربته على الأجهزة العادية, بل يجب نشر الموقع على شبكة الانترنت حتى يمكنك أن تجربها

2- Virtual Earth:

post-75999-1248317264_thumb.png

وهي منتج مجاني من شركة مكروسوفت يعتمد على تقنية الـ Ajax + Java Script يعني يمكن تطبيقها حتى على المواقع التي تعمل بالـ PHP وليس شرطاً أن تعمل على تقنية الدوت نت

وهذا هو الموقع الرئيسي للـ Virtual Earth

http://www.microsoft.com/virtualearth/

أما هذا فهو موقع الخرائط لكي تشاهدها مباشرة:

http://www.microsoft.com/maps/isdk/ajax/

إذا فتحتم الرابط السابق فستشاهدون العديد من الخرائط 2D, 3D أو حتي صور الستالايت, وستجدون أيضا الـ Source Code الخاص بها وهو جافا سكريبت كما قلنا سابقا.

يمكنك نسخ الكود الموجود من الرابط السابق ووضعه حتى في صفحة HTML عادية جدا, لا تندهش نعم صفحة HTML

جرب هذا الكود واحفظه بصيغة HTML وشاهد الخريطة

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
   <head>
      <title></title>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
      <script type="text/javascript" src="http://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.2"></script>
      <script type="text/javascript">
      var map = null;

      function GetMap()
      {
         map = new VEMap('myMap');
         map.LoadMap();
      }   
      </script>
   </head>
   <body onload="GetMap();">
      <div id='myMap' style="position:relative; width:400px; height:400px;"></div>
   </body>
</html>

كما شاهدتم فإن الكود سهل وبسيط وليس فيه أي صعوبة

3- كيف يمكن استعمال الخريطة السابقة لإظهار إحداثيات الزوار والمستخدمين الحاليين لموقعك ؟

قبل البداية في هذا الشرح أود أن أوكد أن هذا المشروع مصمم من قبل على المواقع الأجنبية ولكن الـ Source Code الخاص به كان صعباً جداً على الكثير من المبرمجين وخاصة المحترفين ومن أراد أن يشاهد الكود الأصلي فهذا هو الرابط:

http://www.codeproject.com/KB/ajax/WhosOnlineAspNet.aspx

هذا الرابط للمحترفين فقط, أما المثال الذي سنوضحه فهو يؤدي نفس العمل تماما ولكن بكود أقل تعقيداً, وقد ظللت أعمل عليه يوم كامل لكي يظل محافظاً على نفس الكفاءة, نسأل الله القبول

تعال نتابع خطوة بخطوة

أ- افتح الدوت نت (2005, 2008, VB, C#) وصمم موقع جديد, ولا توجد مشكلة إذا وضعت ماستر بيج, وضع ملف Global.asax

ب- إذهب إلى ملف Global.asax واكتب الأكواد التالية:

الكود الخاص بفتح السيشن

protected void Session_Start(object sender, EventArgs e)
        {
            XmlDocument xHostIPLookup;
            XmlNamespaceManager xnsManager;
            XmlNode xnHostIP;
            string sCountryName;
            string sCityName;
            string sCoordinates;
            Hashtable hUserInfo;

            hUserInfo = new Hashtable();

            Session.Timeout = 10;

            if (!Session.IsNewSession)
            {
                return;
            }

            if (Application["CurrentUsers"] == null)
            {
                Application["CurrentUsers"] = new ArrayList();
            }

            for (int i = 0; i < ((ArrayList)(Application["CurrentUsers"])).Count; i++)
            {
                if (((Hashtable)(((ArrayList)(Application["CurrentUsers"]))))["SessionID"].ToString() == Session.SessionID)
                {
                    return;
                }
            }

            try
            {
                Application.Lock();

                xHostIPLookup = new XmlDocument();
                xHostIPLookup.Load("http://api.hostip.info/?ip=" + Request.UserHostAddress);

                xnsManager = new XmlNamespaceManager(xHostIPLookup.NameTable);
                xnsManager.AddNamespace("gml", "http://www.opengis.net/gml");

                xnHostIP = xHostIPLookup.DocumentElement.SelectSingleNode("gml:featureMember", xnsManager).FirstChild;

                if (xnHostIP != null)
                {
                    sCityName = xnHostIP.ChildNodes[0].InnerText;
                    sCountryName = xnHostIP.ChildNodes[1].InnerText;

                    if (xnHostIP.ChildNodes.Count > 3 && xnHostIP.ChildNodes[4] != null)
                    {
                        sCoordinates = xnHostIP.ChildNodes[4].InnerText;
                        //sCoordinates = "46,26"; إحداثيات مدينة الرياض للتجربة
                        if (sCoordinates != string.Empty)
                        {
                            hUserInfo["SessionID"] = Session.SessionID;
                            hUserInfo["IPAddress"] = Request.UserHostAddress;
                            hUserInfo["Location"] = sCityName + " " + sCountryName;
                            hUserInfo["Coordinates"] = sCoordinates;

                            ((ArrayList)(Application["CurrentUsers"])).Add(hUserInfo);
                        }
                    }
                    // الإحداثيات مجهولة
                    else
                    {
                        hUserInfo["SessionID"] = Session.SessionID;
                        hUserInfo["IPAddress"] = Request.UserHostAddress;
                        hUserInfo["Location"] = sCityName + " " + sCountryName + " Unknown Coordinates";
                        hUserInfo["Coordinates"] = "0,0";

                        ((ArrayList)(Application["CurrentUsers"])).Add(hUserInfo);
                    }
                }
            }
            catch (Exception Exc)
            { 
                //service is unavialable, ignore error.
            }
            finally
            {
                Application.UnLock();
            }
        }

أما هذا فهو الكود الخاص بغلق السيشن

protected void Session_End(object sender, EventArgs e)
        {
            try
            {
                Application.Lock();

                if (Application["CurrentUsers"] != null)
                {
                    for (int i = 0; i < ((ArrayList)(Application["CurrentUsers"])).Count; i++)
                    {
                        if (((Hashtable)(((ArrayList)(Application["CurrentUsers"]))))["SessionID"].ToString() == Session.SessionID)
                        {
                            ((ArrayList)(Application["CurrentUsers"])).RemoveAt(i);
                        }
                    }
                }
            }
            catch (Exception Exc)
            {
                // move on
            }
            finally
            {
                Application.UnLock();
            }
        }

أرجو ألا تنزعجوا من تعقيد الكود, لو رأيتم الكود الأصلي فستنسون هذا الموضوع من أصله :D

جـ- اذهب إلى صفحة الـ Default.aspx وضع هذا الكود داخلها

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WhoIsOnline.aspx.cs" Inherits="WhoIsOnline.WhoIsOnline" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">

    <title>Who is Online</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

    <script type="text/javascript" src="http://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.2"></script>

    <script type="text/javascript">
          var map = null;
          function GetMap()
          {         
                map = new VEMap('myMap');
                map.LoadMap(null,1);
          }
    </script>

    <style type="text/css">
        .ero
        {
            z-index: 100002 !important;
        }
        .ero-progressAnimation
        {
            z-index: 100002 !important;
        }
        .VE_Message
        {
            z-index: 100002 !important;
        }
    </style>
</head>
<body onload="GetMap();ShowPins();">
    <form id="frmWhoIsOnline" runat="server">
<asp:Literal ID="ltrlUsersOnLine" runat="server"></asp:Literal>
    <center>
        <div id="myMap" style="position: relative; top: 0px; left: 0px; width: 800px; height: 800px;">
        </div>
    </center>
    </form>
</body>
</html>

انتبه جيدا لأهمية هذا السطر

<body onload="GetMap();ShowPins();">

لأنه هو الذي يعرض الخريطة ويظهر الإحداثيات عليها

د- اذهب إلى الحدث الخاص بـ Page_Load الخاص بصفحة Default وضع هذا الكود:

protected void Page_Load(object sender, EventArgs e)
        {
            StringBuilder sb;

            // عدد المتواجدين حاليا
            ltrlUsersOnLine.Text = ((ArrayList)(Application["CurrentUsers"])).Count.ToString();

            // ضبط الدالة الخاصة بإحداثيات المستخدم
            sb = new StringBuilder();
            sb.AppendLine("function ShowPins()");
            sb.AppendLine("{");
            for (int i = 0; i < ((ArrayList)(Application["CurrentUsers"])).Count; i++)
            {
                sb.AppendLine("var pinID = " + (i + 1).ToString() + ";");
                sb.AppendLine("var pin = new VEPushpin(");
                sb.AppendLine("pinID, ");

                // انتبه جيداً
                // هنا يتم عكس أو قلب الإحداثيات
                // Coordinates(Y, X)
                sb.AppendLine("new VELatLong(" +
                              ((Hashtable)(((ArrayList)(Application["CurrentUsers"]))))["Coordinates"].ToString().Split(new char[] { ',' })[1] + 
                              "," + 
                              ((Hashtable)(((ArrayList)(Application["CurrentUsers"]))))["Coordinates"].ToString().Split(new char[] { ',' })[0] + "), ");

                sb.AppendLine("null, ");
                sb.AppendLine("'" + ((Hashtable)(((ArrayList)(Application["CurrentUsers"]))))["IPAddress"].ToString() + "', ");
                sb.AppendLine("'" +
                              ((Hashtable)(((ArrayList)(Application["CurrentUsers"]))))["Location"].ToString().Replace("'", "’") + "','pinEvent', 'Century 16'");
                sb.AppendLine(");");
                sb.AppendLine("");
                sb.AppendLine("map.AddPushpin(pin);");
            }
            sb.AppendLine("}");

            // هذا مثال لنتيجة الدالة الموجودة بالأعلى 
            //function ShowPins()
            //{
            //      var pinID = 1;
            //      var pin = new VEPushpin(
            //                      pinID, 
            //                      new VELatLong(0,0), 
            //                      null, 
            //                      '127.0.0.1', 
            //                      '(Private Address) (Private Address) Unknown Coordinates','pinEvent', 'Century 16'
            //                      );
            //      map.AddPushpin(pin);
            //}

            Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "MapScript", sb.ToString(), true);
        }

خلاص لقد انتهي العمل ولكنك لن تستطيع تجريب هذا المشروع بشكل فعال مثلما لو وضعته على الانترنت, هذه الصورة توضح شكل الناتج النهائي:

whosonline.gif

إذا أردت أن تجربه لقد وضعته على موقعي:

http://www.fleed.net

4- الخاتمة:

الموضوع لايزال في البداية وهناك استفسارات سأجيب عنها لاحقاً إن شاء الله, المشروع مرفق

نسأل الله القبول

WhoIsOnline.rar

1

Oracle Certified Professional Java Programmer 6 (SCJP)

#2

مشكور على هذه المقالة الرائعة .

#3

أخي العزيز موضوع رائع

لعل و سأحتاج الى هذا الموضوع لتنفيذه ..

عسى لله أن يسدد خطاك ..

#4

السلام عليكــم ورحمـة الله وبركاتــه ،،

أخى العزيز

rozester

شرحك ممتاز والفكره كويسه جدا بس لما دخلت على موقعك علشان أشوف التنفيذ لقيه حاطط البوينت فى السنتر بتاع الخرطه وبيقول إن ا لمكان غير معروف فى السعوديه انا فى الخبر ولما عملت زووم على السعوديه لابوينت الحمرا اختفت لنها كانت مش فى المكان الصحيح

هل ليها تعديل أو حل ؟

شكراً على تعبك

#5

جزاكم الله خيرا

بالنسبة للاستفسار الخاص بالأخ زخارياس

نعم انت على حق, لأن هناك قصور في لموقع الذي احضر منه الإحداثيات -لأنه مجاني-, حيث إن قاعدة البيانات الخاصة به لا تدعم الشرق الأوسط بشكل كافي

وإذا أردت أن تشاهد نفسك على الخريطة بالضبط قم بزيارة هذا الموقع

http://hostip.info

وأضف الأي بي والمكان المناظر له, بالخبر مثلا أو الدمام

وستجد أنك قد ظهرت على الخريطة بكل سهولة

مشكورين

تم تعديل هذه المشاركة بواسطة rozester في 23 يوليو 2009 في 11:56

1

Oracle Certified Professional Java Programmer 6 (SCJP)

#6

أشكرك على إهتمامك وربنا يعوض تعبك خير

لأن الله لا ينسى تعب المحبه

#7

السلام عليكم ورحمة الله وبركاته

أود أن أوضح بعض النقاط التي قد تبدو غامضة قليلاً:-

1- إن الإحداثيات تأتي عن طريق ملف XML وليست ويب سيرفرس بالمعني التقليدي

2- شكل ملف الـ XML يأتي عن طريق ذلك الرابط http://api.hostip.info/?ip=94.5.6.4 والنتيجة كالتالي:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
- <HostipLookupResultSet version="1.0.0" xmlns="http://www.hostip.info/api" xmlns:gml="http://www.opengis.net/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.hostip.info/api/hostip-1.0.0.xsd">
  <gml:description>This is the Hostip Lookup Service</gml:description> 
  <gml:name>hostip</gml:name> 
- <gml:boundedBy>
  <gml:Null>inapplicable</gml:Null> 
  </gml:boundedBy>
- <gml:featureMember>
- <Hostip>
  <gml:name>London</gml:name> 
  <countryName>UNITED KINGDOM</countryName> 
  <countryAbbrev>UK</countryAbbrev> 
- <!--  Co-ordinates are available as lng,lat 
  --> 
- <ipLocation>
- <gml:PointProperty>
- <gml:Point srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
  <gml:coordinates>-0.1167,51.5</gml:coordinates> 
  </gml:Point>
  </gml:PointProperty>
  </ipLocation>
  </Hostip>
  </gml:featureMember>
  </HostipLookupResultSet>

3- منطقة الشرق الأوسط ليست مغاطاة بشكل كافي, لأن الموقع مجاني, وبمكنك إضافة الأي بي الخاص بك لقاعدة البيانات الموجودة بالموقع وحينئذ ستشاهد نفسك على الخريطة بسهولة.

4- يمكنك استعمال أي Web Service عالمية وليس شرطاً الموقع السابق, والطريقة كما رأيتم فإن هذه الخريطةيمكن إضافة أي دبوس عليها باستعمال الدالة الأتية:

VEPushpin وهي دالة API للخرائط يمكنك الرجوع لموقع مكرسوفت لمعرفة تفاصيل أكثر عن البارامترات التي تأخذها هذه الدالة

5- الأمر الأخير وهو طلب من الأخوة الذين يعملون بلغة PHP أن يقوموا بنفس العمل لكي تعم الفائدة للجميع, لأن هذه الخريطة ستعم فائدتها على الجميع, والأمر بسيط وليس صعب, وأرجو من الإخوة المشرفين طرح هذه الفكرة داخل منتدى الـ PHP

جزاكم الله خيراً

1

Oracle Certified Professional Java Programmer 6 (SCJP)

#8

up

أُحبُّ الصَّالِحِينَ وَلسْتُ مِنْهُمْ ××× لَعَلِّي أنْ أنَالَ بهمْ شَفَاعَهْ

وَأكْرَهُ مَنْ تِجَارَتُهُ المَعَاصِي ××× وَلَوْ كُنَّا سَواءً في البضَاعهْ

#9

السلام عليكم ورحمة الله وبركاته,

يا جماعة اود أن أخبركم بعد البحث خلال الانترنت عن الخرائط والـ api الخاصة بها وجدت أشياء كثيرة جدا كنا غافلين عنها واظن أنها ستهم العاملين في مجال الـ gis كثيرا, وكما قلت فإن الفائدة ستعم الجميع, وأود من الأعضاء الذين لهم خلفية بالـ php تحويل هذا الكود, لكي تكون الفائدة أكبر

المهم,

هذه الـ API السابقة مجانية.

انصح بتحميل الـ SDK الخاص بهذه الـ API من موقع مكروسوفت, وهي تعد دليل شامل لكل الدوال الخاصة بها, هذا هو الرابط:

http://www.microsoft.com/downloads/d...DisplayLang=en

وهناك ASP.NET Web Service جديدة بواسطة مكروسوفت وسيتطلب استدعاؤها التسجيل على موقع مكروسوفت أولا, هذا هو الرابط:

https://mappoint-css.live.com/mwssignup/

الرابط السابق سيمكنك من التسجيل, وهو مجاني أيضا لكي يمكنك استدعاء الويب سيرفس السابقة

ما الجديد في هذه الويب سيرفرس ؟

1- امكانية التعامل مع الـ Developing a Silverlight Application Using Bing Maps Web Services

http://msdn.microsoft.com/en-us/library/cc879136.aspx

2- امكانية التعامل مع الـ Developing a .NET Application Using Bing Maps Web Services

http://msdn.microsoft.com/en-us/library/dd221354.aspx

3- امكانية التعامل مع الـ Developing a Mobile Application Using Bing Maps Web Services

http://msdn.microsoft.com/en-us/library/dd483215.aspx

وهناك المزيد والمزيد في هذا الموضوع

يتبع

Oracle Certified Professional Java Programmer 6 (SCJP)

#10

تم ارفاق المشروع السابق بلغة VB.NET داخل المنتدى الخاص به

تجدونه على هذا الرابط

/index.php?showtopic=200561

Oracle Certified Professional Java Programmer 6 (SCJP)

#11

السلام عليكم ورحمة الله وبركاته

مجهود رائع أخي الفاضل وأتمنى لك التوفيق

وإن شاء الله سأحاول العمل على تطويره فهي فكرة مفيدة جدا ولا تجدها إلى في المواقع الكبيرة

وهي مفيدة جدا في المواقع التجارية والتي تهتم بالتوزيع الجغرافي للعملاء

بالتوفيق أخي الكريم ولا تحرمنا من مواضيعك المتميزة

إذا أردت أن تـجـعـلـنـي سـعـيـداً ... فـعـلـمـنـي شـيـئـاً جـديـداً

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…