الان ناتي الى النموذج الثاني Form2 و هو قلب برنامجنا الذي سيقوم بحفظ صفحات الموقع لدينا
ساعرض مجموعة من الصور هنا مع شرحها المرفق بالتمسيات للعناصر الموجودة عليها و سندخل لاحقا بالشرح
الصور مقسمة على مجموعات كما تتضح في النموذج اعلاه
بعد التوكل على الله نبدأ
سنقوم باستيراد بعض مجالات الاسماء للتعامل معها خلال الكود
و بعض المتغيرات في بداية النموذج سنعرف الحاجة منها من خلال الشرح
حدث تحميل النموذج
تم شرحه سابقا عند التعامل مع النموذج Form1 مع زيادة طفيفة تتعلق بالجزئية CreaeDt
و هو اجراء بسيط لانشاء جدول سنحتاجه خلال العمل كما يلي
اجراء ربط الكائنات BindingFileds
السيناريو المتبع في العمل سيكون كالتالي
بعد تحميل النموذج سنكون امام عمليات اضافة للاصناف و الفروع المشتقة منها و كذلك المقالات المشتقة من كل فرع
وهي عملية روتينية ناقشناها في البند السابق عند التعامل مع Form1
الجديد في الموضوع اننا سنكون امام صفحات HTML سنقوم بتخزينها في قاعدة البيانات من صفحة المستعرض مباشرة
و سنقوم ايضا بتخزين المرفقات المرتبطة بالمقال المعروض في المتصفح
طبعا التخزين ليس ضمن القاعدة بل في مجلد ضمن مسار البرنامج و اسمه AttachMents
بينما سيتم تخزين اسم الملف و مساره فقط في جدول في القاعدة
سيتم الدخول تلقائيا للموقع وفق اعدادات مسبقة انت تقوم بادخالها في نموذج خاص سنناقشه لاحقا
على اي حال لن اسهب كثيرا في الشرح هنا لانني ساقوم بالشرح مع كل خطوة تستلزم الشرح
ساضع الاكواد الخاصة بالادوات (الحذف و الحفظ و التعديل) بشكل عادي دون شرحها لاننا اصبحنا نعرف شرحها كما سبق
هذا الكود يحتاج القليل من الشرح وهو كالتالي
عمليا عند اضافة مقال انا اقوم باضافته من المتصفح
لذلك ساختبر اذا كان المتصفح فعلا يحتوي على معلومات للصفحة المعروضة ؟ ساشرحه في الاسفل مع اجراء تحميل الصفحة
اذا كان المتصفح يحوي فعلا على معلومات ساقوم عندها باضافة اسم الموضوع و رابطه ايضا الى جدول المقالات
من خلال الصفحة المعروضة في المتصفح
عملية الاضافة لن تتم هكذا و الا اصبح لدي كم كبير من الصفحات المتشابهة
لذا جعلت عملية الاضافة تتم بعد التاكد ان الصفحة الحالية ليست مخزنه لدي في القاعدة وفق رابط الصفحة
سانتقل الان الى حدث اكتمال تحميل الصفحة في المستعرض لارتباطه بالكود السابق
عند اكتمال تحميل الصفحة انا قمت بوضع كود يقوم بنسخ محتويات الصفحة الى المتغير النصي sourceString
وهو مشمول في الاجراء التالي
اعرف انني سادخل في متاهة شرح لاننا سنتفرع من اجراء الى اخر و كلها ترتبط ببعضها لذا وجب عليك ان تركز معي و ان تعذرني ان فاتني شرح جزئية معينة.
كما تلاحظ انا قمت بنسخ محتويات الصفحة الى المتغير sourceString
مع بعض الاسطر التي تخص المستعرض مثل عرض اسم الموضوع الحالي في اسفل البرنامج و اعلاه
ثم اختبرت طول المتغير النصي لاقوم بتمكين عملية الاضافة من عدمها
للمعلومات ان طول النص الافتراضي للمستعرض هو 13 على ما اعتقد لانه يحتوي على Tag
<\HTML><HTML> فارغ بدون محتويات و يبدأ بالتوسع مع وجود معلومات فعلية داخله
الكود ايضا يحتوي على دالة اخرى CollectAttachments باختصار مهمتها جلب المرفقات عند اكتمال تحميل الصفحة ساشرحه عند وروده
نكمل باقي عمليات الاضافة
اما عملية اضافة معلومات المرفقات الى جدول المرفقات في القاعدة فهي عملية متزامنه مع تحميل المرفق الى مجلد التخزين سناتي اليها لاحقا
عمليات الحذف سنؤجل الحديث عنها الان لانها عمليه طويله تجري باتجاهين القاعدة من جهة و الملفات المخزنة من جهة اخرى
نكمل مع باقي الاكواد
الكود السابق للدخول الى صفحة المطلوبة وهو يختبر اولا ان الرابط المدخل هو تنسيق صحيح لروابط المواقع
ثم بعدها ينتقل الى دالة خاصة SiteLogin و هي لب العمل في البرنامج وهي تقوم بتسجيل الدخول الى الموقع ثم الانتقال الى الصفحة المطلوبة
الشرح
الكود السابق يسيتخدم مكاتب API ساضعها هنا
بعد دخولنا و عرض الصفحة اصبحنا الان امام صفحة معروضه في المتصفح
سنقوم الان بالتقاط المرفقات وفق الاجراء التالي
و هو اجراء عادي يستخدم المكتبة RegularExpressions للبحث في مستند HTML عن العناصر التي تحتوي على المرفقات و من ثم الحصول على اسم المرفق ان امكن ؟؟؟؟ و كذلك الرابط
و بعدها ندخل اسم المرفق و رابطه في جدول خاص لنستخدمه لاحقا.
اسم المرفق؟؟؟؟ العملية كثيرا شاقة مع اختلاف بنية المواقع و كثرة استخدام السكربتات من كل شكل و لون و الكثير الكثير جعلني اعيد صياغة الكود عشرات المرات هنا و مازالت المفاجئات تتكرر
بعد تعبئة الجدول سنقوم باضافة عناصره الى ListBox1 ليصبح لدينا شكل سهل و بسيط للتعامل مع الملفات و تحميلها فقط من خلال تحديدها من ListBox1 و من ثم زر Download .
ماذا بعد ذلك
الان سندخل الى كود اضافة المرفقات في القاعدة و تحميل الملف و تخزينه في مجلد التخزين
يتبع.....
ساعرض مجموعة من الصور هنا مع شرحها المرفق بالتمسيات للعناصر الموجودة عليها و سندخل لاحقا بالشرح
الصور مقسمة على مجموعات كما تتضح في النموذج اعلاه
بعد التوكل على الله نبدأ
سنقوم باستيراد بعض مجالات الاسماء للتعامل معها خلال الكود
كود :
Imports System.Data.OleDb
Imports System.Net
Imports System.IO
Imports System.Text.RegularExpressions
Imports System.Text
Imports System.Runtime
Imports System.Runtime.InteropServicesو بعض المتغيرات في بداية النموذج سنعرف الحاجة منها من خلال الشرح
كود :
Public Class Form2
Dim A, B, C, D As Integer
Dim sourceString As String
Dim cookies As New CookieContainer()
Dim Dt As New DataTable
Dim PathStr As String
Dim result As String = String.Emptyحدث تحميل النموذج
كود :
Private Sub Form2_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Try
Me.KindBindingSource.DataSource = LoadDataSet()
Me.KindBindingSource.DataMember = "Kind"
'
Me.PostBindingSource.DataSource = KindBindingSource
Me.PostBindingSource.DataMember = "Kind_post"
'
Me.InfoBindingSource.DataSource = PostBindingSource
Me.InfoBindingSource.DataMember = "Kind_Info"
'
Me.AttachBindingSource.DataSource = InfoBindingSource
Me.AttachBindingSource.DataMember = "Info_Attach"
'
BindingFileds()
'
CreaeDt()
BindingNavigatorAddNewItem3.Enabled = False
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Subتم شرحه سابقا عند التعامل مع النموذج Form1 مع زيادة طفيفة تتعلق بالجزئية CreaeDt
و هو اجراء بسيط لانشاء جدول سنحتاجه خلال العمل كما يلي
كود :
''' <summary>
''' اجراء بناء جدول خاص لتحميل المرفقات
''' </summary>
''' <remarks></remarks>
Private Sub CreaeDt()
Dt = New DataTable
Dt.Clear()
Dim Urlcol As New DataColumn("Urlcol", System.Type.GetType("System.String"))
Dim Namecol As New DataColumn("Namecol", System.Type.GetType("System.String"))
Dt.Columns.Add(Urlcol)
Dt.Columns.Add(Namecol)
End Subاجراء ربط الكائنات BindingFileds
كود :
'ربط الكائنات
Private Sub BindingFileds()
Try
Me.KindTextBox.DataBindings.Add(New Binding("Text", KindBindingSource, "Kind"))
Me.Not1TextBox.DataBindings.Add(New Binding("Text", KindBindingSource, "Not1"))
'
Me.ponameTextBox.DataBindings.Add(New Binding("Text", PostBindingSource, "poname"))
'
Me.InfonameTextBox.DataBindings.Add(New Binding("Text", InfoBindingSource, "Infoname"))
Me.UrlInfoTextBox.DataBindings.Add(New Binding("Text", InfoBindingSource, "UrlInfo"))
'
ComboBox1.DataSource = KindBindingSource
ComboBox1.DisplayMember = "kind"
ComboBox1.ValueMember = "Id"
'
ComboBox2.DataSource = PostBindingSource
ComboBox2.DisplayMember = "poname"
ComboBox2.ValueMember = "id_k"
'
ComboBox3.DataSource = InfoBindingSource
ComboBox3.DisplayMember = "Infoname"
ComboBox3.ValueMember = "IdInfo"
'
ListBox2.DataSource = AttachBindingSource
ListBox2.DisplayMember = "AttachName"
ListBox2.ValueMember = "AttachPath"
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Subالسيناريو المتبع في العمل سيكون كالتالي
بعد تحميل النموذج سنكون امام عمليات اضافة للاصناف و الفروع المشتقة منها و كذلك المقالات المشتقة من كل فرع
وهي عملية روتينية ناقشناها في البند السابق عند التعامل مع Form1
الجديد في الموضوع اننا سنكون امام صفحات HTML سنقوم بتخزينها في قاعدة البيانات من صفحة المستعرض مباشرة
و سنقوم ايضا بتخزين المرفقات المرتبطة بالمقال المعروض في المتصفح
طبعا التخزين ليس ضمن القاعدة بل في مجلد ضمن مسار البرنامج و اسمه AttachMents
بينما سيتم تخزين اسم الملف و مساره فقط في جدول في القاعدة
سيتم الدخول تلقائيا للموقع وفق اعدادات مسبقة انت تقوم بادخالها في نموذج خاص سنناقشه لاحقا
على اي حال لن اسهب كثيرا في الشرح هنا لانني ساقوم بالشرح مع كل خطوة تستلزم الشرح
ساضع الاكواد الخاصة بالادوات (الحذف و الحفظ و التعديل) بشكل عادي دون شرحها لاننا اصبحنا نعرف شرحها كما سبق
كود :
'زر اضافة نوع
Private Sub BindingNavigatorAddNewItem_Click(sender As System.Object, e As System.EventArgs) Handles BindingNavigatorAddNewItem.Click
Try
KindBindingSource.CancelEdit()
KindBindingSource.AddNew()
A = KindBindingSource.Position
KindTextBox.Focus()
Catch ex As OleDb.OleDbException
MsgBox(ex.ToString)
End Try
End Subكود :
'عند اضافة فرع
Private Sub InfoBindingSource_AddingNew(sender As Object, e As System.ComponentModel.AddingNewEventArgs) Handles InfoBindingSource.AddingNew
Try
KindBindingSource.EndEdit()
Catch ex As OleDb.OleDbException
MsgBox(ex.ToString)
End Try
End Subكود :
'زر اضافة فرع
Private Sub BindingNavigatorAddNewItem1_Click(sender As System.Object, e As System.EventArgs) Handles BindingNavigatorAddNewItem1.Click
Try
PostBindingSource.CancelEdit()
PostBindingSource.AddNew()
B = PostBindingSource.Position
ponameTextBox.Focus()
Catch ex As OleDb.OleDbException
MsgBox(ex.ToString)
End Try
End Subكود :
'عند اضافة مقال
Private Sub PostBindingSource_AddingNew(sender As Object, e As System.ComponentModel.AddingNewEventArgs) Handles PostBindingSource.AddingNew
Try
Me.KindBindingSource.EndEdit()
ponameTextBox.Focus()
Catch ex As OleDb.OleDbException
MsgBox(ex.ToString)
End Try
End Subكود :
'زر اضافة مقال
Private Sub BindingNavigatorAddNewItem3_Click(sender As System.Object, e As System.EventArgs) Handles BindingNavigatorAddNewItem3.Click
Try
If sourceString = String.Empty Then
MsgBox("لا يوجد مقالات محملة")
Exit Sub
End If
InfoBindingSource.CancelEdit()
InfoBindingSource.AddNew()
InfonameTextBox.Text = WebBrowser1.DocumentTitle
UrlInfoTextBox.Text = WebBrowser1.Url.AbsoluteUri
'
BindingNavigatorAddNewItem3.Enabled = False
'===================
Dim w1 As Integer = 0
Using Con
Dim sw1 As String = "Select Count(IdInfo) AS IdCount From Info Where UrlInfo Like '" & UrlInfoTextBox.Text & "' "
Dim MatchCommand As New OleDbCommand(sw1, Con)
If Con.ConnectionString = Nothing Then Con.ConnectionString = ConnectionString
Con.Open()
'
w1 = MatchCommand.ExecuteScalar
'
End Using
'
If w1 >= 1 Then
MsgBox(" هذه المقالة موجودة و متوفرة في القاعدة لن يتم حفظها ", MsgBoxStyle.Exclamation + MsgBoxStyle.MsgBoxRight + MsgBoxStyle.OkOnly, "تخزين المقال ")
InfoBindingSource.CancelEdit()
Exit Sub
End If
'==================
C = InfoBindingSource.Position
Catch ex As OleDb.OleDbException
MsgBox(ex.ToString)
End Try
End Subهذا الكود يحتاج القليل من الشرح وهو كالتالي
عمليا عند اضافة مقال انا اقوم باضافته من المتصفح
لذلك ساختبر اذا كان المتصفح فعلا يحتوي على معلومات للصفحة المعروضة ؟ ساشرحه في الاسفل مع اجراء تحميل الصفحة
اذا كان المتصفح يحوي فعلا على معلومات ساقوم عندها باضافة اسم الموضوع و رابطه ايضا الى جدول المقالات
من خلال الصفحة المعروضة في المتصفح
عملية الاضافة لن تتم هكذا و الا اصبح لدي كم كبير من الصفحات المتشابهة
لذا جعلت عملية الاضافة تتم بعد التاكد ان الصفحة الحالية ليست مخزنه لدي في القاعدة وفق رابط الصفحة
سانتقل الان الى حدث اكتمال تحميل الصفحة في المستعرض لارتباطه بالكود السابق
عند اكتمال تحميل الصفحة انا قمت بوضع كود يقوم بنسخ محتويات الصفحة الى المتغير النصي sourceString
وهو مشمول في الاجراء التالي
كود :
'اكتمال تحميل الصفحة
Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
Try
sourceString = WebBrowser1.DocumentText
'
TxtUrl.Text = e.Url.ToString
ToolStripStatusLabel2.Text = " / " & WebBrowser1.DocumentTitle
Me.Text = WebBrowser1.DocumentTitle
CollectAttachments(ListBox1)
If sourceString = String.Empty Or sourceString.Length <= 14 Then
BindingNavigatorAddNewItem3.Enabled = False
Else
BindingNavigatorAddNewItem3.Enabled = True
Exit Sub
End If
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Subاعرف انني سادخل في متاهة شرح لاننا سنتفرع من اجراء الى اخر و كلها ترتبط ببعضها لذا وجب عليك ان تركز معي و ان تعذرني ان فاتني شرح جزئية معينة.
كما تلاحظ انا قمت بنسخ محتويات الصفحة الى المتغير sourceString
مع بعض الاسطر التي تخص المستعرض مثل عرض اسم الموضوع الحالي في اسفل البرنامج و اعلاه
ثم اختبرت طول المتغير النصي لاقوم بتمكين عملية الاضافة من عدمها
للمعلومات ان طول النص الافتراضي للمستعرض هو 13 على ما اعتقد لانه يحتوي على Tag
<\HTML><HTML> فارغ بدون محتويات و يبدأ بالتوسع مع وجود معلومات فعلية داخله
الكود ايضا يحتوي على دالة اخرى CollectAttachments باختصار مهمتها جلب المرفقات عند اكتمال تحميل الصفحة ساشرحه عند وروده
نكمل باقي عمليات الاضافة
كود :
'عند اضافة مرفق
Private Sub AttachBindingSource_AddingNew(sender As Object, e As System.ComponentModel.AddingNewEventArgs) Handles AttachBindingSource.AddingNew
Try
InfoBindingSource.EndEdit()
Catch ex As OleDb.OleDbException
MsgBox(ex.ToString)
End Try
End Subاما عملية اضافة معلومات المرفقات الى جدول المرفقات في القاعدة فهي عملية متزامنه مع تحميل المرفق الى مجلد التخزين سناتي اليها لاحقا
عمليات الحذف سنؤجل الحديث عنها الان لانها عمليه طويله تجري باتجاهين القاعدة من جهة و الملفات المخزنة من جهة اخرى
نكمل مع باقي الاكواد
كود :
'تصفح
Private Sub BtnBrowse_Click(sender As System.Object, e As System.EventArgs) Handles BtnBrowse.Click
Try
If Not Regex.IsMatch(TxtUrl.Text, "^((ht|f)tp(s?)\:\/\/|~/|/)?([\w]+:\w+@)?([a-zA-Z]{1}([\w\-]+\.)+([\w]{2,5}))(:[\d]{1,5})?((/?\w+/)+|/?)(\w+\.[\w]{3,4})?((\?\w+=\w+)?(&\w+=\w+)*)?") Then
MessageBox.Show("موقع غير صحيح")
Exit Sub
Else
SiteLogin(TxtUrl.Text.Trim)
End If
Catch ex As Exception
Return
End Try
End Subالكود السابق للدخول الى صفحة المطلوبة وهو يختبر اولا ان الرابط المدخل هو تنسيق صحيح لروابط المواقع
ثم بعدها ينتقل الى دالة خاصة SiteLogin و هي لب العمل في البرنامج وهي تقوم بتسجيل الدخول الى الموقع ثم الانتقال الى الصفحة المطلوبة
كود :
Private Sub SiteLogin(ByVal Url As String)
'رابط الدخول من الاعدادت
Dim LoginUrl As String = My.Settings.LoginUrl
'حاوية الكوكيز
Dim cookieContainer As New CookieContainer()
'انشاء طلب للدخول
Dim LoginRequest As HttpWebRequest = DirectCast(WebRequest.Create(LoginUrl), HttpWebRequest)
LoginRequest.CookieContainer = New CookieContainer
LoginRequest.ContentType = "application/x-www-form-urlencoded"
LoginRequest.Method = "POST"
LoginRequest.KeepAlive = True
LoginRequest.AllowAutoRedirect = True
LoginRequest.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1"
'البارمترات من الاعدادت
Dim formParams As String = My.Settings.Parmms
Dim bytes As Byte() = Encoding.UTF8.GetBytes(formParams)
'كتابة البيانات
LoginRequest.ContentLength = bytes.Length
Using os As Stream = LoginRequest.GetRequestStream()
os.Write(bytes, 0, bytes.Length)
End Using
'تحصيل الكوكيز من الموقع و تخزينه في الحاوية
cookieContainer = GetUriCookieContainer(New Uri(LoginUrl))
'جعل حاوية الطلب تحتضن الكوكيز
LoginRequest.CookieContainer = cookieContainer
'حاوية عامة للكوكيز على مستوى كل الطلبات
cookies = New CookieContainer
cookies = cookieContainer
'استقبال الرد و تخزين الكوكيز
Dim cookdisc As String
Using httpWebResponse = DirectCast(LoginRequest.GetResponse(), HttpWebResponse)
cookies.Add(httpWebResponse.Cookies)
For Each cook As Cookie In httpWebResponse.Cookies
result += cook.Name + "=" + cook.Value & ";"
cookdisc = cook.Name + "=" + cook.Value & ";"
InternetSetCookie(Url, cookdisc, cook.Expires)
Next
End Using
WebBrowser1.Navigate(Url)
End Subالشرح
- متغير نصي يحمل رابط صفحة الدخول من الاعدادات
- انشاء حاوية كوكيز تقوم باحتضان الكوكيز اثناء عملية الطلب و الرد
- انشاء طلب مع اعطائه رابط صفحة الدخول
- تفريغ حاوية الكوكيز الخاصة بالطلب
- بعض المعلومات المطلوب ارسالها مع الطلب و هي تعلميات قياسية خاصة بصفحات الويب يمكنك ايجاد هذه المعلومات عند فتح مصدر اي صفحة ويب و هي كثيرة ليس المكان لشرحها
- طريقة الطلب هي ادخال معلومات Post
- المحافظة على الطلب حي يرزق مع تفعيل الارتداد و اعادة التوجيه وفق رد الملقم
- معلومات قياسية اخرى تتعلق بالمتصفحات يمكنك الاستغناء عنها في بعض المواقع UserAgent
- FormsParms متغير نصي يحمل معلومات الادخال الضرورية في الموقع و ناخذها من الاعدادات
- مصفوفة من النوع Byte ستحمل بيانات الدخول وفق الترميز Utf8 الى الموقع
- بدأ عملية كتابة بيانات المصفوفة في الموقع
- GetUriCookieContainer هي دالة خاصة ستقوم بجلب الكوكيز من الموقع بعد استقبال رد المصادقة على الدخول و هي تستخدم مكاتب API .
- ملئ حاوية الكوكيز الخاصة بالطلب بالكوكيز التي حصلنا عليها وفق الدالة السابقة و كذلك ملئ الحاوية العامة التي على مستوى البرنامج بالكوكيز اللازمة cookies
- الاكواد اللاحقة يمكنك الاستغناء عنها اذ انني احببت ابقائها لتعرف طريقة الحصول على كل قيم الكوكيز و تستفيد منها كأن تخزنها او تعرضها؟
- اخيرا التوجه الى الصفحة المطلوبة بعد ان تمت المصادقة على دخولنا
كود :
InternetSetCookie(Url, cookdisc, cook.Expires)كود :
''' <summary>
''' اجراء استخدمه عند الحاجة و هو للحصول على الكوكيز من الرابط
''' </summary>
''' <param name="uri">الرابط</param>
''' <returns>يعود بحاوية الكوكيز</returns>
''' <remarks>APi الدالة تستخدم مكاتب</remarks>
Public Shared Function GetUriCookieContainer(uri As Uri) As CookieContainer
Dim cookies As CookieContainer = Nothing
Dim datasize As Integer = 8192 * 16
Dim cookieData As New StringBuilder(datasize)
'
If Not InternetGetCookieEx(uri.ToString(), Nothing, cookieData, datasize, InternetCookieHttponly, IntPtr.Zero) Then
If datasize < 0 Then
Return Nothing
End If
cookieData = New StringBuilder(datasize)
If Not InternetGetCookieEx(uri.ToString(), Nothing, cookieData, datasize, InternetCookieHttponly, IntPtr.Zero) Then
Return Nothing
End If
End If
If cookieData.Length > 0 Then
cookies = New CookieContainer()
cookies.SetCookies(uri, cookieData.ToString().Replace(";"c, ","c))
End If
Return cookiesالكود السابق يسيتخدم مكاتب API ساضعها هنا
كود :
#Region "Get Set Cookies By APi"
<DllImport("wininet.dll", CharSet:=CharSet.Auto, SetLastError:=True)>
Private Shared Function InternetSetCookie(lpszUrlName As String, lpszCookieName As String, lpszCookieData As String) As Boolean
End Function
Private Const InternetCookieHttponly As Int32 = &H2000
<DllImport("wininet.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
Private Shared Function InternetGetCookieEx(pchURL As String, pchCookieName As String, pchCookieData As StringBuilder, ByRef pcchCookieData As UInteger, dwFlags As Integer, lpReserved As IntPtr) As Boolean
End Function
#End Regionبعد دخولنا و عرض الصفحة اصبحنا الان امام صفحة معروضه في المتصفح
سنقوم الان بالتقاط المرفقات وفق الاجراء التالي
كود :
''' <summary>
''' اجراء تحصيل المرفقات من الصفحة و تجميعها في اللست بوكس
''' </summary>
''' <param name="list"></param>
''' <remarks></remarks>
Private Sub CollectAttachments(ByVal list As ListBox)
Try
Dt.Rows.Clear()
ProgressBar1.Value = 0
If (WebBrowser1.Document IsNot Nothing) Then
Dim Elems As HtmlElementCollection
Dim WebOC As WebBrowser = WebBrowser1
'
'
Elems = WebOC.Document.GetElementsByTagName("a")
For Each elem As HtmlElement In Elems
Dim NameStr As String = elem.GetAttribute("href")
If ((NameStr IsNot Nothing) And (NameStr.Length <> 0)) Then
'(.zip/.rar/.pdf) This Only For CodeProject Now
If NameStr.ToLower().Contains("attachment.php?") Or
NameStr.ToLower().Contains(".zip") Or
NameStr.ToLower().Contains(".rar") Or
NameStr.ToLower().Contains(".doc") Or
NameStr.ToLower().Contains(".docx") Or
NameStr.ToLower().Contains(".pdf") Then
Dim siteUri As New Uri(NameStr)
Dim ContentStr As String = elem.InnerText
'===========
If siteUri.AbsoluteUri.LastIndexOf("/") And Not (NameStr.ToLower().Contains("attachment.php?")) Then
ContentStr = siteUri.AbsoluteUri.Substring(siteUri.AbsoluteUri.LastIndexOf("/") + 1)
End If
Dim row As DataRow = Dt.NewRow
row("Urlcol") = siteUri
row("Namecol") = ContentStr
Dt.Rows.Add(row)
'
list.DataSource = Dt
list.DisplayMember = "Namecol"
list.ValueMember = "Urlcol"
End If
End If
Next
End If
Catch ex As WebException
MsgBox(ex.ToString)
End Try
End Subو بعدها ندخل اسم المرفق و رابطه في جدول خاص لنستخدمه لاحقا.
اسم المرفق؟؟؟؟ العملية كثيرا شاقة مع اختلاف بنية المواقع و كثرة استخدام السكربتات من كل شكل و لون و الكثير الكثير جعلني اعيد صياغة الكود عشرات المرات هنا و مازالت المفاجئات تتكرر
بعد تعبئة الجدول سنقوم باضافة عناصره الى ListBox1 ليصبح لدينا شكل سهل و بسيط للتعامل مع الملفات و تحميلها فقط من خلال تحديدها من ListBox1 و من ثم زر Download .
ماذا بعد ذلك
الان سندخل الى كود اضافة المرفقات في القاعدة و تحميل الملف و تخزينه في مجلد التخزين
يتبع.....
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال


