تقييم الموضوع :
  • 1 أصوات - بمعدل 5
  • 1
  • 2
  • 3
  • 4
  • 5
[سلسلة التعامل مع الويب] - ارسال الطلبات HttpWebRequset
#2

[b]سادسا :- استخدام Cookies Container مع الطلبات



ماهو Cookies Container ؟؟

-هو فئة تخزن الكوكيز لكي نستعمله في طلب اخر

ابسط مثال هو انشاء موضوع جديد في المنتدى

يتطلب انشاء موضوع الى تسجيل الدخول في المنتدى

وتسجيل الدخول يتطلب ارسال طلب من برنامجنا مثلا

فالنفرض انه سوينا طلب تسجيل الدخول وتم الرد علينا بنجاح تسجيل الدخول

ثم حاولنا ان نكتب طلبا اخر لنضع موضوعا وقمنا بارسال الطلب .

الرد سيأتيك مباشرة في الصميم يقولك (إنشاء الموضوع فشل والسبب لم يتم تسجيل الدخول)

رغم أننا ارسلنا طلبا مسبقا لتسجيل الدخول ونجح ،

لكن كما نعلم ان بيانات تسجيل الدخول في جميع المواقع تخزن في الكوكيز والطلب يمكنه حفظ الكوكيز

في كائنه فقط - يعني كائن ارسال طلب تسجيل الدخول لاإرتباط له بكائن ارسال طلب انشاء الموضوع

فالذي سنفعله هو نسخ الكوكيز المرجع من الرد على طلب تسجيل الدخول الى كائن ارسال طلب إنشاء الموضوع

-

مثال على نسخ الكوكيز

PHP كود :
CookieContainer cookies = new CookieContainer();
          
            
HttpWebRequest LoginRequset = (HttpWebRequest)WebRequest.Create("http://vb4arb.com/vb/login.php");
             
LoginRequset.CookieContainer _cookies//مهم
            //...
            
HttpWebResponse LoginResponse = (HttpWebResponse)LoginRequset.GetResponse();
            
cookies.Add(LoginResponse.Cookies);
            
//... 

كما ترون اخواني كوكيز الرد سيتم حفظهما في الكائن cookies

لاحظ هذا الكود
PHP كود :
cookies.Add(LoginResponse.Cookies); 

[COLOR="#8B4513"]هو الاساس للحصول على كوكيز تسجل الدخول

فعندما ترسل طلب يحتوي على بيانات عضوية صحيح ، يتم الرد عليك بكوكيز الدخول

وهذا الكوكيز صالح لفترة معينة

لكن :- يمكننا العبث في كائن الكوكيز وتغير محتوايته ليظل للأبد ، ولكن هذا مو موضوعنا الان[/COLOR]

-

[COLOR="#8B4513"]الان يمكننا استعمال هذا الكوكيز في القيام بأي عملية في الموقع تحتاج الى تسجيل الدخول ،

كإنشاء موضوع مثلا .

ملاحظة : لن اقوم بصنع طلب لإنشاء موضوع لأن الوضع معقد قليل فهو يحتاج الى تحليل صفحات

واستخراج securityToken اي رمز الامان

هم سووه عشان لااحد يسوي مثلنا ويرسل موضوع من برنامج بواسطة الطلب

لكن يمكن جلبه بالتحليل وهذا عنوان مقالتنا القادمة ان شاء الله[/COLOR]


------


ماذا سنفعل الان ؟؟
[COLOR="#4B0082"]
بدل انشاء موضوع وتعقيد الامر عليكم بما انكم مبتدأين

فقررت ان نقوم بعرض "المتواجدون الان"

كما نعلم ان صفحة (المتواجدون الان) ستفتح لك اذا كنت مسجل دخولك

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

وكالعادة منعرضها في اداة WebBrowser رغم انه يمكننا حفظها محتوى الرد كملف او غيره[/COLOR]

----
نبدأ الان - بسم الله

[COLOR="#0000CD"]
1- قم بالذهاب الى صفحة تسجيل الدخول في المنتدى واكتب بياناتك (ولتكن صفحة المنتدى الرئيسية)

2- افتح الاداة Live http header

3- قم بالضغط على زر تسجيل الدخول

4- مباشرة قم بإلغاء القنص بعد ظهور صفحة الترحيب لك

5- نكتب طلبنا بالاعتماد على البيانات الي حصلنا عليها من الاضافة[/COLOR]


صورة :


[COLOR="#800000"]الصورة كما شرحناها سابقا ولكن شرحتها الان لتثبيت المعلومة
-

نريد في البداية أن نحصل على بيانات الطلب

كما نرى ان بيانات الطلب ظاهرة لكن استعمال replay يظهر افضل[/COLOR]





--

الان هذا هذه هي بيانات الطلب :

كود :
vb_login_username=%C7%E1%D4%C7%DF%ED+%E1%E1%E5[color=#FF0000]&[/color]vb_login_password=[color=#FF0000]&[/color]vb_login_password_hint=%DF%E1%E3%C9+%C7%E1%E3%D1%E6%D1[color=#FF0000]&[/color]cookieuser=1[color=#FF0000]&[/color]s=[color=#FF0000]&[/color]securitytoken=guest[color=#FF0000]&[/color]do=login[color=#FF0000]&[/color]vb_login_md5password=4a7d1ed414474e4033ac29ccb8653d9b[color=#FF0000]&[/color]vb_login_md5password_utf=4a7d1ed414474e4033ac29ccb8653d9b

[COLOR="#800000"]
الان نحدد الاشياء الي تتغير بين كل مستخدم واخر

بالطبع اليورزنيم والباسوورد يختلفو بين كل مستخدم واخر

افتح النوت باد وإلصف البيانات

ونحذف قيمة vb_login_username ونضع بدالها : {0}[/COLOR]
كود :
vb_login_username={0}

--
ونحدف قيمة vb_login_md5password + vb_login_md5password_utf ونضع بدالهما {1}

كود :
vb_login_md5password={1}[color=#FF0000]&[/color]vb_login_md5password_utf={1}

--
[COLOR="#000000"]بقية البارمترات هي ثوابت لاتختلف بين شخص الى اخر
فقط اليوزرنيم والباسوورد يخلتفو من مستخدم لإخر

قبل كل شيئ ، يعرف ان منتديات vbluttien تتعامل مع الباسوردات بصيغة MD5
وقد لاحظنا وجود MD5 في بارمتار الباسورد : vb_login_md5password

هذا يعني انه لايمكننا كتابة باسوورد بهذي الطريقة 89139 وإرساله مع الطلب
يعني يجب علينا تحويل الباسوورد الى صيغة MD5

قمت بالبحث في الانترنت ووجدت دالة تقوم بتحويل النص الى صيغة MD5 :[/COLOR]

PHP كود :
public static string MD5(string STR)
        {
            
ASCIIEncoding encoding = new ASCIIEncoding();
            
string str string.Empty;
            
byte[] bytes encoding.GetBytes(STR);
            
byte[] buffer2 = new MD5CryptoServiceProvider().ComputeHash(bytes);
            foreach (
byte num in buffer2)
            {
                
str str num.ToString("x2");
            }
            return 
str;
        } 
[COLOR="#FF0000"]
لاتنسى اضافة مجال الاسماء التالي:[/COLOR]
PHP كود :
using System.Security.Cryptography


نقوم بإضافة متغير عام :
PHP كود :
CookieContainer _cookies = new CookieContainer(); 


الان نقوم بكتابة طلب تسجيل الدخول ويكون كالتالي :

PHP كود :
Encoding charset getEncoding("http://vb4arb.com/vb");


            
string Password MD5("8798797");
            
string stringData string.Format("vb_login_username={0}&vb_login_password=&vb_login_password_hint=%DF%E1%E3%C9+%C7%E1%E3%D1%E6%D1&cookieuser=1&s=&securitytoken=guest&do=login&vb_login_md5password={1}&vb_login_md5password_utf={1}",
                
"شكشوك"Password);
            
byte[] postData charset.GetBytes(stringData);

            
HttpWebRequest LoginRequset = (HttpWebRequest)WebRequest.Create("http://vb4arb.com/vb/login.php?do=login");
            
LoginRequset.ContentType "application/x-www-form-urlencoded";
            
LoginRequset.Method WebRequestMethods.Http.Post;
            
LoginRequset.ContentLength postData.Length;
            
LoginRequset.CookieContainer _cookies;
            
LoginRequset.KeepAlive true;
            
System.IO.Stream wr LoginRequset.GetRequestStream();
            
wr.Write(postData0postData.Length);
            
wr.Close();
            
using (HttpWebResponse LoginResponse = (HttpWebResponse)LoginRequset.GetResponse())
            {
                
_cookies.Add(LoginResponse.Cookies);
            } 


[COLOR="#FF0000"]الاكواد شرحناها سابقا لاحاجة لشرحها


ملاحظة : استخدمت دالة getEncoding الي شرحتها في ردي السابق

ملاحظة 2 : لاحظ اننا استعملنا using ، استعملناها لكي يتم تدمير الكائن LoginResponse فور انتهاء البلوك

لأن يحصل خطا اذا سويت طلبين لنفس الموقع وماقمت بدمير الresponse

ينتهي هذا الكود بحفظ كوكيز العضوية في المتغير العام[/COLOR]
PHP كود :
_cookies.Add(LoginResponse.Cookies); 

--
--

الان نقوم باستخدام الكوكيز لنعرض صفحة[COLOR="#B22222"] "المتواجدون الان" التي تتطلب كوكيز تسجيل الدخول

نقوم بالذهاب الى صفحة المتواجدون الان ونقوم بتشغيل القنص

ثم نضغط refresh في المتصفح ليتم اعادة عرض الصفحة وإعادة الطلب[/COLOR]

صورة :



كما ترى لايوجد [COLOR="#FF0000"]post Data لأن البروتوكول المستخدم هو GET

GET كما شرحناها سابقا تستخدم لطلب عرض صفحة او ملف او.....

فنقوم الان بكتابة طلب عرض الصفحة ويكون الكود هكذا :[/COLOR]


PHP كود :
HttpWebRequest onlineRequset = (HttpWebRequest)WebRequest.Create("http://vb4arb.com/vb/online.php");
            
onlineRequset.Method "GET";
            
onlineRequset.CookieContainer _cookies//مهم
            
HttpWebResponse onlineResponse = (HttpWebResponse)onlineRequset.GetResponse();
            
webBrowser1.DocumentStream onlineResponse.GetResponseStream(); 



يكون الكود كاملا كالتالي :

PHP كود :
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Text;
using System.Windows.Forms;
using System.Security.Cryptography;

namespace 
WindowsFormsApplication1
{
    public 
partial class Form1 Form
    
{
        public 
Form1()
        {
            
InitializeComponent();
        }

        public static 
string MD5(string STR)
        {
            
ASCIIEncoding encoding = new ASCIIEncoding();
            
string str string.Empty;
            
byte[] bytes encoding.GetBytes(STR);
            
byte[] buffer2 = new MD5CryptoServiceProvider().ComputeHash(bytes);
            foreach (
byte num in buffer2)
            {
                
str str num.ToString("x2");
            }
            return 
str;
        }


        public 
Encoding getEncoding(string url)
        {
            
HttpWebRequest rq = (HttpWebRequest)WebRequest.Create(url);
            
HttpWebResponse rs = (HttpWebResponse)rq.GetResponse();
            return 
Encoding.GetEncoding(rs.CharacterSet);
        }



        
CookieContainer _cookies = new CookieContainer();

        private 
void button1_Click(object senderEventArgs e)
        {
            
Encoding charset getEncoding("http://vb4arb.com/vb");


            
string Password MD5("8798797");
            
string stringData string.Format("vb_login_username={0}&vb_login_password=&vb_login_password_hint=%DF%E1%E3%C9+%C7%E1%E3%D1%E6%D1&cookieuser=1&s=&securitytoken=guest&do=login&vb_login_md5password={1}&vb_login_md5password_utf={1}",
                
"شكشوك"Password);
            
byte[] postData charset.GetBytes(stringData);

            
HttpWebRequest LoginRequset = (HttpWebRequest)WebRequest.Create("http://vb4arb.com/vb/login.php?do=login");
            
LoginRequset.ContentType "application/x-www-form-urlencoded";
            
LoginRequset.Method WebRequestMethods.Http.Post;
            
LoginRequset.ContentLength postData.Length;
            
LoginRequset.CookieContainer _cookies//مهم
            
LoginRequset.KeepAlive true;
            
System.IO.Stream wr LoginRequset.GetRequestStream();
            
wr.Write(postData0postData.Length);
            
wr.Close();
            
using (HttpWebResponse LoginResponse = (HttpWebResponse)LoginRequset.GetResponse())
            {
                
_cookies.Add(LoginResponse.Cookies);
            }



            
//GET
            //المتواجدون الان


            
HttpWebRequest onlineRequset = (HttpWebRequest)WebRequest.Create("http://vb4arb.com/vb/online.php");
            
onlineRequset.Method "GET";
            
onlineRequset.CookieContainer _cookies//مهم
            
HttpWebResponse onlineResponse = (HttpWebResponse)onlineRequset.GetResponse();
            
webBrowser1.DocumentStream onlineResponse.GetResponseStream();

        }


    }




شغل البرنامج وستراه يظهر لك "المتواجدون الان"

لولا الكوكيز لما استطعنا الوصول لهذه الصفحة

--
--


المثال في المرفقات


--
--
--





{يتبع الجزء السابع} >>>

[/b]


الملفات المرفقة
.zip   Online Now.zip (الحجم : 94.33 ك ب / التحميلات : 111)
الرد }}}
تم الشكر بواسطة: السندبااد , أسامة , ابو ليلى , ابو ليلى


الردود في هذا الموضوع
[سلسلة التعامل مع الويب] - ارسال الطلبات HttpWebRequset - بواسطة الشاكي لله_mybb_import4784 - 06-08-13, 01:37 PM

المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  [سلسلة ادوات المبرمج] {1} - اداة مراقبة الريجستري RegFromApp الشاكي لله 2 5,480 15-09-24, 11:36 AM
آخر رد: بوحمد
  [سلسلة التحكم] {4} - التحكم عن بعد بواسطة خدمة الويب الشاكي لله 7 10,154 12-07-21, 02:34 PM
آخر رد: devante.celvin
  [سلسلة التحكم] {5} - التحكم بالمصباح بواسطة الـ USB و Arduino الشاكي لله 12 26,009 30-12-19, 01:38 AM
آخر رد: mohammed abdalsamed
  [سلسلة التحكم] {3} - خدمة الويب (Web Service) الشاكي لله 9 13,424 25-09-19, 05:47 PM
آخر رد: al9atl
  تجميعية مقالات [سلسلة التحكم] الشاكي لله 10 8,131 15-07-19, 09:14 AM
آخر رد: mrsalnet
  التعامل مع ملفات xml بلغتي C#&VB Sajad 7 14,629 08-11-17, 10:21 AM
آخر رد: nani49
  [C#.NET] سلسلة حلقات نضف كودك Devahmedsalim 1 2,900 10-10-17, 11:28 PM
آخر رد: nani49
  [سلسلة ادوات المبرمج] {2} - اداة تحليل صفحات الويب HAPXPathFinder الشاكي لله 10 9,090 30-08-17, 06:49 PM
آخر رد: ابو روضة
  [سلسلة التحكم] {2} - التحكم بواسطة Remoting الشاكي لله 8 10,970 06-12-16, 04:22 PM
آخر رد: الشاكي لله
  [سلسلة التعامل مع الويب] تحليل الصفحات باستخدام HtmlAgilityPack الشاكي لله 9 7,505 25-09-16, 12:19 PM
آخر رد: ابراهيم كركوكي

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم