تاریخ: چهارشنبه 19 فروردین 1394 - 19:13
|
sepehr-arbab
خوب داره پيش ميره
پست: 76
عضو شده در: 4 آبان 1391
امتياز: 853
|
عنوان: پاسخ به «موتور جستجو یـــوز جانشین گوگل خواهد شد!» |
|
|
مدت زیادی به دلایل **** نبودم عید مبارک و {} همین
از اقای سعید سوالی دارم که برایم بسیار مهم است
جناب سعید گرامی :
میشه خودتون یا اساتید برنامه نویس یوز این خط کد رو برای من trace کنید و جواب رو تا هفته دیگه 3 شنبه همینجا اعلام کنید و بگید این کد ها اصلا چی هستند؟
با احترام
کد: |
Dim StrYcook As String
Option Explicit
Private gotCookie As Boolean
Private isConnected As Boolean
Private inChat As Boolean
Private strID As String
Private strPassword As String
Private strYPart As String
Private strTPart As String
Private Sub Command1_Click()
gotCookie = False
inChat = False
isConnected = False
strID = Text1.Text
strPassword = Text2.Text
Winsock1.Connect "login.yahoo.com", "80"
End Sub
Private Sub Form_Load()
End Sub
Private Sub Winsock1_Connect()
On Error Resume Next
If gotCookie = False Then Call Winsock1.SendData(GrabCookies$(strID, strPassword, "login.yahoo.com"))
If gotCookie = True Then Call Winsock1.SendData(Login$(strID, strYPart, strTPart))
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
On Error Resume Next
Dim strData As String
Call Winsock1.GetData(strData$)
Debug.Print strData$
If gotCookie = False Then
If Mid(strData$, 10, 3) = 302 Then
strYPart$ = Split(strData$, "Y=")(1)
strYPart$ = Split(strYPart$, ";")(0)
strYPart$ = "Y=" & strYPart$ & ";"
strTPart$ = Split(strData$, "T=")(1)
strTPart$ = Split(strTPart$, ";")(0)
strTPart$ = "T=" & strTPart$
gotCookie = True
lblStatus.Caption = "Bot " & Text1.Text & " Got Cookie"
Call Winsock1.Close
Call Winsock1.Connect("scs.msg.yahoo.com", 5050)
Else
Call Winsock1.Close
Exit Sub
End If
End If
If gotCookie = True Then
Select Case Asc(Mid$(strData$, 12, 1))
Case 85
isConnected = True
lblStatus.Caption = "Bot " & Text1.Text & " Logged In"
End Select
End If
End Sub
Module1
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public Function Pause(ByVal Interval As Single) As Single
Dim x As Single
x! = Timer
Do While (Timer - x!) < Val(Interval)
DoEvents
Sleep 1
Loop
End Function
Public Function GrabCookies(strID As String, strPass As String, strServer As String) As String
GrabCookies$ = "GET /config/login?" & "login=" & strID$ & "&passwd=" & strPass$ & _
" HTTP/1.1" & vbCrLf & "Host: " & strServer$ & vbCrLf & "Accept: */*" & vbCrLf & vbCrLf
End Function
Module2
Private Function AssemblePacket(strPacket As String, packetType As Integer) As String
AssemblePacket$ = Chr$(&H59) & Chr$(&H4D) & Chr$(&H53) & Chr$(&H47) & Chr$(0) & Chr$(102) & Chr$(&H0) & Chr$(&H1) & _
Chr$(Int(Len(strPacket$) / 256)) & Chr$(Int(Len(strPacket$) Mod 256)) & Chr$(Int(packetType / 256)) & _
Chr$(Int(packetType Mod 256)) & String$(8, Chr$(&H0)) & strPacket$
End Function
Public Function Login(strYahooID As String, strYCookie As String, strTCookie As String) As String
Login$ = AssemblePacket$("0À€" & strYahooID$ & "À€2À€" & strYahooID$ & "À€1À€" & strYahooID$ & _
"24416" & strYCookie$ & " " & strTCookie$ & "98us", 550)
End Function |
از لطف شما و عزیزان یوز کمال تشکر را دارم
در انتها سال نو مبارک |
|
[ وضعيت كاربر: ]
|
تشکرها از این پست:
|
تاریخ: پنجشنبه 20 فروردین 1394 - 11:30
|
sayyid
شروع فعاليت
پست: 14
عضو شده در: 1 فروردین 1394
امتياز: 126
|
عنوان: Re: پاسخ به «موتور جستجو یـــوز جانشین گوگل خواهد شد!» |
|
|
sepehr-arbab نوشته است: |
مدت زیادی به دلایل **** نبودم عید مبارک و {} همین
از اقای سعید سوالی دارم که برایم بسیار مهم است
جناب سعید گرامی :
میشه خودتون یا اساتید برنامه نویس یوز این خط کد رو برای من trace کنید و جواب رو تا هفته دیگه 3 شنبه همینجا اعلام کنید و بگید این کد ها اصلا چی هستند؟
با احترام
کد: |
Dim StrYcook As String
Option Explicit
Private gotCookie As Boolean
Private isConnected As Boolean
Private inChat As Boolean
Private strID As String
Private strPassword As String
Private strYPart As String
Private strTPart As String
Private Sub Command1_Click()
gotCookie = False
inChat = False
isConnected = False
strID = Text1.Text
strPassword = Text2.Text
Winsock1.Connect "login.yahoo.com", "80"
End Sub
Private Sub Form_Load()
End Sub
Private Sub Winsock1_Connect()
On Error Resume Next
If gotCookie = False Then Call Winsock1.SendData(GrabCookies$(strID, strPassword, "login.yahoo.com"))
If gotCookie = True Then Call Winsock1.SendData(Login$(strID, strYPart, strTPart))
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
On Error Resume Next
Dim strData As String
Call Winsock1.GetData(strData$)
Debug.Print strData$
If gotCookie = False Then
If Mid(strData$, 10, 3) = 302 Then
strYPart$ = Split(strData$, "Y=")(1)
strYPart$ = Split(strYPart$, ";")(0)
strYPart$ = "Y=" & strYPart$ & ";"
strTPart$ = Split(strData$, "T=")(1)
strTPart$ = Split(strTPart$, ";")(0)
strTPart$ = "T=" & strTPart$
gotCookie = True
lblStatus.Caption = "Bot " & Text1.Text & " Got Cookie"
Call Winsock1.Close
Call Winsock1.Connect("scs.msg.yahoo.com", 5050)
Else
Call Winsock1.Close
Exit Sub
End If
End If
If gotCookie = True Then
Select Case Asc(Mid$(strData$, 12, 1))
Case 85
isConnected = True
lblStatus.Caption = "Bot " & Text1.Text & " Logged In"
End Select
End If
End Sub
Module1
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public Function Pause(ByVal Interval As Single) As Single
Dim x As Single
x! = Timer
Do While (Timer - x!) < Val(Interval)
DoEvents
Sleep 1
Loop
End Function
Public Function GrabCookies(strID As String, strPass As String, strServer As String) As String
GrabCookies$ = "GET /config/login?" & "login=" & strID$ & "&passwd=" & strPass$ & _
" HTTP/1.1" & vbCrLf & "Host: " & strServer$ & vbCrLf & "Accept: */*" & vbCrLf & vbCrLf
End Function
Module2
Private Function AssemblePacket(strPacket As String, packetType As Integer) As String
AssemblePacket$ = Chr$(&H59) & Chr$(&H4D) & Chr$(&H53) & Chr$(&H47) & Chr$(0) & Chr$(102) & Chr$(&H0) & Chr$(&H1) & _
Chr$(Int(Len(strPacket$) / 256)) & Chr$(Int(Len(strPacket$) Mod 256)) & Chr$(Int(packetType / 256)) & _
Chr$(Int(packetType Mod 256)) & String$(8, Chr$(&H0)) & strPacket$
End Function
Public Function Login(strYahooID As String, strYCookie As String, strTCookie As String) As String
Login$ = AssemblePacket$("0À€" & strYahooID$ & "À€2À€" & strYahooID$ & "À€1À€" & strYahooID$ & _
"24416" & strYCookie$ & " " & strTCookie$ & "98us", 550)
End Function |
از لطف شما و عزیزان یوز کمال تشکر را دارم
در انتها سال نو مبارک |
سال نوی شما هم مبارک باشه.
اولاً که من «سیّد» هستم نه سعید!
ثانیاً آخرین باری که VB کار کردم برمیگرده به حدود ۱۵ سال پیش، برای همین انتظار نداشته باشید که خیلی یادم باشه و بتونم دقیق کد رو بخونم!
ثالثاً بد نبود کدتون رو indent میکردید که بشه خوندش!
Syntax highlight هم که نداره!
ولی یه نگاه بهش انداختم، به نظر میرسه یه روبات برای یاهو هست، که ۲ تا باکس یوزر و پس داره، و یه دکمه که وقتی روش کلیک میکنید با یوزر/پس که وارد کردید به یاهو لاگین میکنه.
در واقع یه جورایی یه اسکلت برای یه برنامهی جایگزین برای یاهو مسنجر به نظر میرسه.
در نهایت: چه ربطی به موتور یوز داشت؟!! |
|
[ وضعيت كاربر: ]
|
تشکرها از این پست:
|
تاریخ: جمعه 21 فروردین 1394 - 08:32
|
sayyid
شروع فعاليت
پست: 14
عضو شده در: 1 فروردین 1394
امتياز: 126
|
عنوان: Re: پاسخ به «موتور جستجو یـــوز جانشین گوگل خواهد شد!» |
|
|
sepehr-arbab نوشته است: |
من فرصت بیشتری میدم تا بیشتر فکر کنید
زود جواب دادن دلیل بر قدرت و سرعت عمل شما نیست
صحیح و کامل جواب بدید
ممنون میشم
در ضمن کد کامل هستش و با کمی دقت میشه کامل فهمید منظورم چیه |
برای بررسی کد آدم خیلی نباید فکر کنه که شما فرصت بیشتری برای فکر کردن به من میدید! باید بررسی کنه کد رو! روی چی فکر کنم؟! شاید منظورتون این بوده که فرصت بیشتری به من میدید تا بیشتر بررسی کنم!
بعد هم مگه کنکوره که فرصت بیشتری میدید؟!
بعد هم من نگفتم کد ناقصه، گفتم indentation و syntax highlight نداره، برای همین خوندنش سخت میشه! کامنت هم که کلاً نداره!
اول یه توضیح کلی بدم:
یه form داریم که توش پنج تا کنترل هستند: دکمهی Command1، دو TextBox به نامهای Text1 و Text2، یک WinSock به نام WinSock1، و در نهایت یک Label به نام lblStatus.
این برنامه هدفش اینه که به سیستم messenger یاهو وصل بشه و باهاش صحبت کنه. در واقع همونطور که قبلاً گفتم یه اسکلت هست برای یه برنامه مثل یاهو مسنجر (مثلاً یه بات).
روش کار اینطوریه که وقتی که دکمه رو فشار میدید، میره به سرور لاگین یاهو وصل میشه و user/pass وارد شده رو میزنه و ازش کوکیهای لازم رو میگیره. بعد به سرور messaging یاهو وصل میشه و به کمک کوکیهای دریافت شده از اون سرور، توش لاگین میکنه. در واقع از سرور لاگین یاهو سوء استفاده کردیم فقط برای این که بتونیم به سرور messaging اش وصل بشیم!
در نهایت هم به نظر میرسه برای این که ۲ تا socket مختلف نیاز نباشه، از یه socket استفاده شده که با یه متغیر مشخص میشه که در حال وصل شدن به سرور اول هستیم یا سرور دوم. برای همین یه کم پیچیدگی کد بیشتر شده (یعنی اگه از ۲ تا socket مختلف استفاده میشد کد رو میشد راحتتر فهمید).
این هم تحلیل خط به خط کد (بازم بگم که من نزدیک ۱۵ ساله با VB کار نکردم، ممکنه بعضی جاها رو نتونم دقیق تحلیل کنم یا اشتباه تحلیل کنم) :
کد: |
Dim StrYcook As String
Option Explicit
Private gotCookie As Boolean
Private isConnected As Boolean
Private inChat As Boolean
Private strID As String
Private strPassword As String
Private strYPart As String
Private strTPart As String
|
اینجا یه سری متغیر تعریف شده. اون Option Explicit رو هم یادم نبود چیه، رفتم یه نگاه انداختم دیدم اگه این رو بزنید، باید تمام متغیرها رو حتماً قبل از استفاده تعریف کنید (که مثلاً جلوی اشتباه تایپی رو میگیره). در واقع برعکسش Option Explicit Off هست که به شما اجازهی تعریف implicit متغیرها رو میده.
کد: |
Private Sub Command1_Click()
gotCookie = False
inChat = False
isConnected = False
strID = Text1.Text
strPassword = Text2.Text
Winsock1.Connect "login.yahoo.com", "80"
End Sub
|
اینجا تابع کلیک روی دکمهی Command1 تعریف شده. داخل این تابع، به برخی متغیرها مقداردهی اولیه میشه، دو متغیر strID و strPassword از روی TextBox های متناظر مقداردهی میشن و در نهایت تابع Connect کنترل Winsock1 با پارامترهای login.yahoo.com و 80 فراخوانی میشه، یعنی به http://login.yahoo.com متصل میشیم.
کد: |
Private Sub Form_Load()
End Sub
|
خوب این یعنی در هنگام load شدن فرم هیچ initialization خاصی انجام نمیدیم!
کد: |
Private Sub Winsock1_Connect()
On Error Resume Next
If gotCookie = False Then Call Winsock1.SendData(GrabCookies$(strID, strPassword, "login.yahoo.com"))
If gotCookie = True Then Call Winsock1.SendData(Login$(strID, strYPart, strTPart))
End Sub
|
اینجا Connect Event کنترل Winsock1 رو handle کرده. یعنی وقتی که ارتباط با سرور برقرار شد، این تابع فراخوانی میشه (خوب بود که Error Event هم handle میشد (Winsock1_Error) و حداقل یه پیغامی چاپ میشد).
اون خط On Error Resume Next رو هم خودش گویا هست، ولی چون یادم نبود رفتم نگاه کردم، یعنی کلاً Error ها رو بیخیال! که خیلی جالب نیست! ولی برای این که سریع یه کدی زده بشه کار رو خیلی راحت میکنه.
بعدش بسته به این که متغیر gotCookie مقدار true داشته باشه یا false، تو هر کدوم یه جور رفتار میکنه. در واقع باید گفت تاریخ از اینجا به بعد به دو بخش تقسیم میشه: قبل از دریافت کوکی، بعد از دریافت کوکی. اگه قبل از دریافت کوکی باشیم، میریم سراغ سرور login.yahoo.com و اگه بعدش باشیم میریم سراغ سرور scs.msg.yahoo.com.
If اول برای حالت اول هست:
کد: |
If gotCookie = False Then Call Winsock1.SendData(GrabCookies$(strID, strPassword, "login.yahoo.com"))
|
که درخواست مورد نیاز رو توسط تابع GrabCookies میسازه و به سرور میفرسته (توضیحات اون تابع رو سر جای خودش میدم).
If دوم برای حالت دوم هست:
کد: |
If gotCookie = True Then Call Winsock1.SendData(Login$(strID, strYPart, strTPart))
|
که اطلاعات مورد نیاز برای لاگین کردن توی سرور مسنجر رو توسط تابع Login ساخته و میفرسته (توضیحات این تابع رو هم سر جای خودش میدم).
در نهایت هم قابل ذکره که اون علامت $ انتهای اسم برخی توابع و متغیرها، یعنی که نوعشون String هست (که البته این notation مدتهاست که deprecate شده ولی خوب هنوز میشه ازش استفاده کرد).
یه نکتهی دیگه این که میشد به جای If دوم، از Else استفاده کرد!
کد: |
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
|
اینجا DataArrival Event هندل شده. این تابع وقتی فراخوانی میشه که یه دیتایی روی socket مورد نظر دریافت شده باشه.
کد: |
On Error Resume Next
Dim strData As String
|
بدون شرح!
کد: |
Call Winsock1.GetData(strData$)
Debug.Print strData$
|
اینجا دادهی دریافت شده رو توی متغیر strData میریزیم و مقدار دریافتی رو توی بخش Immediate چاپ میکنیم (در واقع داره لاگ میگیره، برای بررسی بیشتر توسط کاربر در صورت برخورد با مشکل).
کد: |
If gotCookie = False Then
|
اینجا حالت اول handle میشه (یعنی به سرور لاگین وصل شدیم و میخوایم کوکی رو دریافت کنیم).
کد: |
If Mid(strData$, 10, 3) = 302 Then
|
در صورتی که لاگین موفقیتآمیز باشه، سرور لاگین یاهو ما رو به یه صفحهی دیگه redirect میکنه، که کد HTTP متناظرش ۳۰۲ هست (البته احتمالاً اونی که این کد رو نوشته قبلاً روی سرور یاهو تست کرده، چون ممکنه یه سرور در صورت موفقیت آمیز بودن لاگین، روشهای دیگهای استفاده کنه، مثلاً ممکنه ۳۰۱ بده، یا حتی ۲۰۰ بده و بعد با meta tag یا جاوا اسکریپت redirect کنه). بنابراین اینجا چک میکنیم که لاگین موفقیتآمیز بوده یا نه.
در صورت موفقیتآمیز بودن لاگین، پیغامی که توسط سرور برگردونده میشه یه پیغام HTTP هست که خط اولش (Status line) به این صورته:
HTTP/1.1 302 Found
اینجا توسط تابع Mid اون بخش عددیش استخراج شده (چون همیشه جواب توی پروتوکل HTTP به صورت HTTP/1.1 CODE DESCRIPTION هست، در نتیجه همیشه جای کد HTTP ثابت هست، یعنی آفست ۱۰، و کد جواب HTTP هم که همیشه ۳ رقمی هست (برای توضیح بیشتر به RFC 2616 و به بخش Status line مراجعه کنید)).
یه توضیح هم این که تابع Mid یک تابع One-based هست. یعنی آفستی که میگیره از یک شروع میشه، نه از صفر.
کد: |
strYPart$ = Split(strData$, "Y=")(1)
strYPart$ = Split(strYPart$, ";")(0)
strYPart$ = "Y=" & strYPart$ & ";"
strTPart$ = Split(strData$, "T=")(1)
strTPart$ = Split(strTPart$, ";")(0)
strTPart$ = "T=" & strTPart$
|
تابع Split رشتهی اول رو به کمک رشتهی دوم جدا میکنه.
اینجا در حال استخراج کوکیهای مورد نیازمون از خروجی فرستاده شده توسط سرور یاهو هستیم. خط اول بخش بعد از =Y رو میگیره و خط دوم میره تا برسه به علامت semi-colon. خط سوم هم یه =Y میذاره اولش و یه semi-colon آخرش تا کوکی آمادهی استفاده بشه. ۳ خط بعدی هم همین کار رو برای کوکی T انجام میدن.
البته میشد با regular expression خیلی قشنگتر و دقیقتر این کار رو انجام داد، ولی خوب سختتر هم بود!
متغیر رو تنظیم میکنیم که سری بعد بریم به سراغ اون یکی سرور.
کد: |
lblStatus.Caption = "Bot " & Text1.Text & " Got Cookie"
|
توی کنترل lblStatus که قراره وضعیت فعلی رو نمایش بده، مینویسیم که فلان بات کوکی رو دریافت کرد.
کارمون با سرور لاگین یاهو تموم شد، socket رو میبندیم.
کد: |
Call Winsock1.Connect("scs.msg.yahoo.com", 5050)
|
حالا به سراغ سرور اصلی میریم که روی پورت ۵۰۵۰ هست. با فراخوانی این تابع، بعد از وصل شدن به سرور، مجدداً Event قبلی (Connect) فراخوانی میشه و به خاطر true بودن مقدار متغیر gotCookie مسیر دوم اجرا میشه.
کد: |
Else
Call Winsock1.Close
Exit Sub
End If
|
این Else برای اون If ای هست که چک کرده بود لاگین موفق بوده یا نه. اگه موفق نباشه، socket بسته میشه و خدافظ! که البته اصلاً جالب نیست! حداقلش اینه که یه لاگی بگیریم که موفق نشدیم لاگین کنیم.
این هم برای If مربوط به متغیر gotCookie هست.
کد: |
If gotCookie = True Then
|
اینجا مسیر دوم هست. یعنی در حالتی که کوکی رو گرفتیم و به سرور دوم وصل شدیم، این If اجرا میشه (که باز هم اینجا هم بهتر بود از Else استفاده میکردیم).
کد: |
Select Case Asc(Mid$(strData$, 12, 1))
Case 85
isConnected = True
lblStatus.Caption = "Bot " & Text1.Text & " Logged In"
End Select
|
پروتوکل ارتباطی با سرور مسنجر یاهو، یه پروتوکل custom هست (حداقل من چیزی ازش نمیدونم، شاید هم استاندارد باشه). کسی که این برنامه رو نوشته، میدونسته که توی جوابی که از سمت این سرور میاد، نوع جواب توی آفست ۱۲ هست. برای همین به کمک تابع Mid نوع رو استخراج کرده و روش یه Select گذاشته.
به نظر میرسه نوع اگر برابر ۸۵ باشه، یعنی لاگین به سرور مسنجر موفقیتآمیز بوده. در این حالت متغیر isConnected مقداردهی میشه و یه پیغام توی lblStatus چاپ میشه.
همونطور که قبلاً گفتم، این برنامه یه اسکلت هست برای کار با مسنجر یاهو. برای تکمیلش، باید بقیهی Case ها اینجا نوشته بشن. مثلاً Case متناظر با دریافت PM یا بقیهی حالتها. که مقدار متناظرشون رو باید از پروتوکلش استخراج کرد.
بدون شرح!
این به نظر نمیرسه جزو کد باشه، و احتمالاً منظور این بوده که توی Module1 اینا رو بنویسین.
کد: |
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
|
این خط تابع Sleep رو (که یه system call هست) از کتابخونهی kernel32 تعریف میکنه (در واقع import میکنه، یا include میکنه).
کد: |
Public Function Pause(ByVal Interval As Single) As Single
Dim x As Single
x! = Timer
Do While (Timer - x!) < Val(Interval)
DoEvents
Sleep 1
Loop
End Function
|
تابع Pause تعریف شده که مقدار pause رو ورودی میگیره. سؤال اینه که چرا وقتی تابع Sleep وجود داره، نیاز هست که یه تابع دیگه تعریف کنیم؟ یعنی در واقع فرق این تابع با تابع Sleep چیه؟
جواب اینه که تابع Sleep، برنامه رو به خواب زمستانی فرو میبره! توی GUI Application ها اگر Main thread شما بخوابه، به Event هایی که از سمت سیستم عامل براش فرستاده میشن جواب نمیده و در نتیجه به حالت Not responding فرو میره که اصلاً جالب نیست! برای همین از روشهای دیگهای استفاده میکنن. یکیش اینه که کاری با main thread نداشته باشیم و کلاً کارها توی thread های دیگه انجام بشه، که دردسرهای خودش رو داره. یه روش دیگه این روشی هست که اینجا استفاده شده. اگه به کد نگاه کنید، اومده و توی یه حلقه، میگه DoEvents. یعنی این که جواب event هایی که منتظر جواب هستن رو بده. که این بسته به این که چند تا event و چه event هایی توی صف منتظرن، ممکنه چندین میلیثانیه طول بکشه، یا ممکنه اصلاً طول نکشه (چون ممکنه صف خالی باشه). برای همین بعدش یه Sleep 1 گذاشته و بعد هم برمیگرده اول حلقه و چک میکنه که زمان مورد نظر سپری شده یا نه.
البته این تابع اینجا استفاده نشده! احتمالاً این کد یه تیکه از یه کد بزرگتر بوده که فقط یه بخشش اینجا اومده.
اون علامت تعجب انتهای اسم متغیر x هم یعنی نوعش Single هست (همونطور که در مورد $ گفتم، این اضافیه و فقط داره به کسی که کد رو میخونه راهنمایی میکنه که نوعش این هست).
راستی این رو هم بگم که وقتی این تابع رو دیدم یادم اومد که توی Basic (اعم از gwbasic یا qbasic یا VB!) وقتی میخواستیم یه تابعی تعریف کنیم که مقدار برگشتی نداره، از Sub استفاده میکردیم (معادل void در زبانهای دیگه) و وقتی میخواستیم مقدار برگشتی داشته باشیم از Function استفاده میکردیم! یادش بخیر!
کد: |
Public Function GrabCookies(strID As String, strPass As String, strServer As String) As String
GrabCookies$ = "GET /config/login?" & "login=" & strID$ & "&passwd=" & strPass$ & _
" HTTP/1.1" & vbCrLf & "Host: " & strServer$ & vbCrLf & "Accept: */*" & vbCrLf & vbCrLf
End Function
|
این تابع توی بخش اول تابع Winsock1_Connect استفاده شده. کارش اینه که دستور HTTP برای فرستادن به سرور http://login.yahoo.com رو آماده کنه. همونطور که توی RFC 2616 بخش Request میبینید، در پروتوکل HTTP برای درخواست GET، ابتدا باید یه خط بفرستید به این صورت:
GET ADDRESS HTTP/1.1
و بعد هم توی HTTP 1.1 باید یه هدر Host بفرستید. بقیهاش optional هست (البته شاید سرور یاهو اون هدر Accept رو هم لازم داشته باشه، نمیدونم). در انتهای هدرها هم باید یه خط خالی بفرستید تا سرور بفهمه فرستادن هدرها تموم شد.
اینجا داره درخواست HTTP رو میسازه. اول GET کرده از آدرس config/login?login=USERNAME&passwd=PASSWORD/ و بعد هم آدرس سرور رو توی هدر Host فرستاده و در نهایت هم یه هدر Accept اضافه کرده و یه خط خالی اضافه کرده.
کد: |
Private Function AssemblePacket(strPacket As String, packetType As Integer) As String
AssemblePacket$ = Chr$(&H59) & Chr$(&H4D) & Chr$(&H53) & Chr$(&H47) & Chr$(0) & Chr$(102) & Chr$(&H0) & Chr$(&H1) & _
Chr$(Int(Len(strPacket$) / 256)) & Chr$(Int(Len(strPacket$) Mod 256)) & Chr$(Int(packetType / 256)) & _
Chr$(Int(packetType Mod 256)) & String$(8, Chr$(&H0)) & strPacket$
End Function
|
این تابع کارش ساختن packet برای صحبت با پروتوکل مخصوص مسنجر یاهو هست. تابع Chr کد ASCII میگیره و کاراکتر تحویل میگیره. کد ASCII رو میشه به صورت Hex با علامت H59& مشخص کرد. بنابراین ۴ کاراکتر اول کاراکترهای هگز 59,4D,53,47 هستن (که میشه YMSG) و بعد یه بایت صفر، بعدش هم یه مشت کاراکتر دیگه (که میشه حدس زد اون ۱۰۲ ورژنش هست، اون ۰ و ۱ بعدش هم احتمالاً دو تا آپشن هستن، بعد هم طول داده و نوع داده فرستاده شده (توسط Chr$(Int(Len(strPacket$) / 256)) & Chr$(Int(Len(strPacket$) Mod 256)) یه عدد رو به صورت دو بایتی کنار هم گذاشته (بایت بزرگتر توسط تقسیم بر ۲۵۶ به دست اومده و بایت کوچکتر توسط mod 256)). بعدش هم ۸ تا صفر هست که نمیدونم چیه، مثلاً یه عدد long ممکنه باشه یا ۲ تا عدد int32). در نهایت هم دیتای اصلی به دنبالش میاد.
کد: |
Public Function Login(strYahooID As String, strYCookie As String, strTCookie As String) As String
Login$ = AssemblePacket$("0À€" & strYahooID$ & "À€2À€" & strYahooID$ & "À€1À€" & strYahooID$ & _
"24416" & strYCookie$ & " " & strTCookie$ & "98us", 550)
End Function
|
این تابع توی حالت دوم تابع Winsock1_Connect برای لاگین کردن توی سرور مسنجر یاهو استفاده میشه. اونی که این کد رو نوشته، احتمالاً packet های فرستاده شده توسط یاهو مسنجر رو sniff کرده و از توش این بخش پروتوکل رو استخراج کرده که برای لاگین باید این داده رو بفرستی. اینجا از اون کوکیهای استخراج شده هم استفاده شده. نوع ۵۵۰ هم برای لاگین استفاده میشه. حالا اگه میخواین این کد رو کامل کنین و مثلاً pm بفرستین، باید ببینین نوع pm چند هست و از اون استفاده کنین.
این بود انشای من!
ولی من هنوز هم نفهمیدم ارتباط این کد به موتور یوز چیه؟ اگه سؤال داشتید و راهنمایی میخواستید که خوب ارتباطی به موتور یوز نداره و من در خدمتتون هستم. وگرنه خوشحال میشم توضیح بدید ارتباطش به موتور یوز چیه؟! |
|
[ وضعيت كاربر: ]
|
تشکرها از این پست: mahnazSALAS (جمعه 21 فروردین 1394 - 10:28) bidak (جمعه 21 فروردین 1394 - 19:11)
|
|
|
رفتن به صفحه قبلی 1, 2, 3, 4, 5 بعدی
صفحه 3 از 5
تمام زمانها بر حسب GMT + 3.5 Hours میباشند
|
|
شما نمی توانید در این بخش موضوع جدید پست کنید شما نمی توانید در این بخش به موضوعها پاسخ دهید شما نمی توانید موضوع های خودتان را در این بخش ویرایش کنید شما نمی توانید موضوع های خودتان را در این بخش حذف کنید شما نمی توانید در این بخش رای دهید
|
|
|