PDA

View Full Version : اشکال در گرفتن صفحه با HttpWebRequest



مهرایزد
دوشنبه 06 آبان 1387, 19:15 عصر
با درود به همه دوستان،
من می خوام با کد زیر صفحات سایتها رو بگیرم اما بعضی صفحات دارای کد جاوا برای ارسال به سرور هستند. که طبیعتا در صفحات مختلف می تونند متفاوت باشند. می خوام اگر صفحه چنین کدی داشت برای سرورش ارسال بشه(مانند گرفتن صفحات در browser) اما کد من خطا میده . دوستان می تونید کمکم کنید؟

سپاسگذارم

کد:


HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.CookieContainer = new CookieContainer();
request.ContentType = "undefined";
request.Method = "POST";
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)";
request.Timeout = -1;
WebResponse response = request.GetResponse(); //
Stream responseStream = response.GetResponseStream();
responseStream.ReadTimeout = 10000;
StreamReader Reader = new StreamReader(responseStream);
.
.
.

مثلا کد ارسالی یک صفحه:


.
.
.
sajax_debug(func_name + " uri = " + uri + "/post = " + post_data);
x.send(post_data);
.
.
.

مهرایزد
سه شنبه 07 آبان 1387, 00:07 صبح
دوستان من سوالم رو بد مطرح کردم یا اینکه کسی رو این قضیه کار نکرده؟

raravaice
سه شنبه 07 آبان 1387, 00:25 صبح
دوستان من سوالم رو بد مطرح کردم

کاملا موافقم! ;)

خیلی مبهمه.
شما آدرسی رو میخوای که داخل Ajax به کار رفته؟
اگر آره! که چی بشه؟ اگر تو فکر موتور جستجو هستی این URL ها رو حساب نکن چون اکثرا صفحات خشکی هستن که اطلاعاتشون به درد شما نمی خوره.

اگر نه! جریان جیه، واضح بگو

موفق باشید

مهرایزد
سه شنبه 07 آبان 1387, 23:46 عصر
با سپاس از وقتی که گذاشتید،
اجازه بدید مشکلم رو اینطور مطرح کنم: من دارم با HttpWebRequest صفحات رو می گیرم اما سرور در صورتی که پاسخی از صفحه بر نگرده برای ساخت و ارسال صفحات بعدی مشکل داره و بعد از چند صفحه IP رو بن می کنه و من می خوام که این پاسخ که توسط یک کد جاوا تولید میشه رو مثل یک براوزر عادی به سرور ارسال کنم. این اخرین کدی که IP رو سرور بن کرده :


HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.Referer = url_ref;
request.CookieContainer = new CookieContainer();
request.Method = "GET";
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)";
request.Timeout = -1;
WebResponse response = request.GetResponse(); //
Stream responseStream = response.GetResponseStream();
responseStream.ReadTimeout = 10000;
StreamReader Reader = new StreamReader(responseStream);
.
.
.

از اینکه راهنماییم می کنید سپاسگذارم.

مهرایزد
چهارشنبه 08 آبان 1387, 20:50 عصر
بازم سوالم نامفهومه یا اینکه کسی رو httpwebrequest کار نکرده؟
ممنون

raravaice
چهارشنبه 08 آبان 1387, 21:20 عصر
بعد از چند صفحه IP رو بن می کنه

"بن" یعنی چی؟

چرا واضح نمیگی جریان چیه؟!

حدس میزنم هدفت اینه که اطلاعات یه سایت رو بکشی بیرون ولی بعد از چند درخواست متوالی دیگه جوابی بهت نمیده درسته ؟!

موفق باشید

مهرایزد
پنج شنبه 09 آبان 1387, 06:48 صبح
"بن" یعنی چی؟

چرا واضح نمیگی جریان چیه؟!

حدس میزنم هدفت اینه که اطلاعات یه سایت رو بکشی بیرون ولی بعد از چند درخواست متوالی دیگه جوابی بهت نمیده درسته ؟!

موفق باشید

با سپاس از اینکه کمک می کنید ،
اقا شرمنده ام تا اینجا که انگار خیلی بد منظورم رو گفتم امیدوارم که این پست گویا باشه.
کاملا حق با شماست ، من دارم یه Crawler مینویسم که از HttpWebrequest استفاده کردم. گرفتن اطلاعات سایت محدودیت نداره اما مشکل از کد من هست اگر با MOZILA تمام سایت رو هم دریافت کنم مشکلی نیست و بدون مشکل با Crawler هایی مثل WebZip دریافت میشه اما وقتی با کد بالا دریافت می کنم مشکل پیش میاد. در حقیقت کد من نقص داره که خودم هم دقیق نمی دونم چیه و باعث میشه که سرور اجازه ادامه دریافت نده.

بازم از اینکه وقت می گذارید سپاسگذارم.

raravaice
پنج شنبه 09 آبان 1387, 11:22 صبح
چه ایرادی ازت میگیره! یه trace از برنامت بگیر ببین کجا گیر میکنه!

من قدیما یه همچین چیزی رو که نوشته بودم یادمه که یا URL های خراب و آدرسهایی که با javascript شروع میشد به مشکب بر میخوردم.

دقیق ببین برنامت کجا گیر میکنه اون موقع میشه تصمیم گرفت چه راه حلی مناسب تر هست!


با سپاس از اینکه کمک می کنید ،
در خدمتیم ;)

موفق باشید

مهرایزد
جمعه 10 آبان 1387, 01:07 صبح
با سپاس مجدد ،
این کد اخری که گذاشتم گیر نمیکنه و دانلود میکنه اما سرور بعد از حدود 150 صفحه IP رو Bann میکنه اما با براوزر 500 تا هم باز کنی مشکل نداره. مشکل از سرعت نیست چون اینو تست کردم با سرعت خیلی پایین (کمتر از براوزر) دانلود کردم روی صفحه 20 ای پی بن شد. از طرفی میدونم که خیلی از صفحات برای باز کردن لینک دیتا غیر از URL به سرور POST می کنند اما نمی دونم که چه صورتی می تونم اینکار رو اینجا انجام بدم.
پ.ن. البته من ادرسها رو قبلا در سیستم ذخیره می کنم(فقط URL) و عملا برای گرفتن صفحات ، صفحات refferal رو در Object ی لود نمی کنم و هر صفحه رو عملا تنها با ارسال ادرس دریافت می کنم و هیچ اطلاعات دیگری به سرور ارسال نمیشه. و در ضمن نمی دونم که با متد گت سرور میتونه که کوکی رو بخونه یا نه.
سرتون رو درد نیارم من کدی رو می خوام که بتونم صفحات رو منطقی و صحیح از سایت دریافت کنم.

raravaice
جمعه 10 آبان 1387, 16:42 عصر
خیلی سعی میکنم که درک کنم مطلب رو حقیقت و واقعا دوست دارم کمکت کنم ولی نمی گیرم چی میگی.
یه جای کار مبهمه.

1 نکته رو بهم بگو.
آدرس این سرور بد جنس رو به من بده!

برای پست کردن یا ذخیره کوکی من برای ایرانسل از کدهای زیر استفاده کردم البته فقط روی http کار میکنه نه https. این کد به صورت خودکار شماره و رمز عبور سیم کارت رو وارد میکرده و وارد حساب کاربری میشده که بتونم موجودی سیم کارتهام رو ببینم در حد نیاز خودم بوده ولی میتونی ازش الهام بگیری.



<%@ WebHandler Language="VB" Class="IranCell" %>

Imports System
Imports System.Web
Imports System.Net
Public Class IranCell : Implements IHttpHandler

Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
context.Response.ContentType = "text/html" '"text/plain"

Dim Ds As New Data.DataSet
Ds.ReadXml(context.Server.MapPath("Number.xml"))
Dim PortNumber As String = context.Request.QueryString.Get("PortNumber")
Dim MobileNumber As String = Ds.Tables(0).Rows(PortNumber - 1).Item("Number")
Dim KitNumber As String = Ds.Tables(0).Rows(PortNumber - 1).Item("Kitnumber")
Dim password As String = Ds.Tables(0).Rows(PortNumber - 1).Item("Password")

Dim WebReqLevel1 As HttpWebRequest = DirectCast(WebRequest.Create("http://ecare.mtnirancell.ir:8080/ecare/StartUp?"), HttpWebRequest) 'DirectCast(WebRequest.Create("http://ecare.mtnirancell.ir:8080/ecare/CheckLoginServlet"), HttpWebRequest)
WebReqLevel1.Method = "GET"
Dim WebResLevel1 As HttpWebResponse = CType(WebReqLevel1.GetResponse(), HttpWebResponse)
Dim JsCookie As String = WebResLevel1.Headers.Item("Set-Cookie")

WebReqLevel1 = DirectCast(WebRequest.Create("http://ecare.mtnirancell.ir:8080/ecare/CheckLoginServlet"), HttpWebRequest)
'Response.Write(JsCookie)
Threading.Thread.Sleep(1000)

Dim encoding As New ASCIIEncoding()
Dim postData As String = "txtUserID=" & MobileNumber
postData &= "&txtKitNumber=" & KitNumber
postData &= "&hidActionAuthentication=1"
postData &= "&hidmsisdnno=" & MobileNumber
Dim data As Byte() = encoding.GetBytes(postData)
Dim WebReqLevel2 As HttpWebRequest = DirectCast(WebRequest.Create("http://ecare.mtnirancell.ir:8080/ecare/CheckLoginServlet"), HttpWebRequest)
WebReqLevel2.Method = "POST"
WebReqLevel2.ContentType = "application/x-www-form-urlencoded"
WebReqLevel2.ContentLength = data.Length
WebReqLevel2.Headers.Add("Cookie", JsCookie)
Dim newStream As IO.Stream = WebReqLevel2.GetRequestStream()

newStream.Write(data, 0, data.Length)
newStream.Close()


Dim WebResLevel2 As HttpWebResponse = CType(WebReqLevel2.GetResponse(), HttpWebResponse)
'Dim a As New IO.StreamReader(WebResLevel2.GetResponseStream, Text.Encoding.UTF8)

JsCookie = WebResLevel2.Headers.Item("Set-Cookie")
Threading.Thread.Sleep(1000)
'---------------------------------------------------------------------------------------
Dim encoding3 As New ASCIIEncoding()
Dim postData3 As String = "txtpassword=" & password
postData3 += ("&hidActionAuthentication=2")
'postData += ("&hidmsisdnno=989365248048")
Dim data3 As Byte() = encoding.GetBytes(postData3)
Dim WebReqLevel3 As HttpWebRequest = DirectCast(WebRequest.Create("http://ecare.mtnirancell.ir:8080/ecare/CheckLoginServlet"), HttpWebRequest)
WebReqLevel3.Method = "POST"
WebReqLevel3.ContentType = "application/x-www-form-urlencoded"
WebReqLevel3.ContentLength = data3.Length
WebReqLevel3.Headers.Add("Cookie", JsCookie)
Dim newStream3 As IO.Stream = WebReqLevel3.GetRequestStream()

newStream3.Write(data3, 0, data3.Length)
newStream3.Close()


Dim WebResLevel3 As HttpWebResponse = CType(WebReqLevel3.GetResponse(), HttpWebResponse)
Threading.Thread.Sleep(1000)
'JsCookie = WebResLevel3.Headers.Item("Set-Cookie")

'hidActionAuthentication
'8446I6
'txtpassword
'----------------------------------------------------------------------------------
'Beep()
Dim encoding4 As New UTF8Encoding()
Dim postData4 As String = "modulenumber=1"
postData4 += ("&modulename=") 'حساب
postData4 += ("&hidActionAuthentication=0")
postData += ("&hidPath=0")
Dim data4 As Byte() = encoding4.GetBytes(postData4)
Dim WebReqLevel4 As HttpWebRequest = DirectCast(WebRequest.Create("http://ecare.mtnirancell.ir:8080/ecare/ModuleServlet"), HttpWebRequest)
WebReqLevel4.Method = "POST"
WebReqLevel4.ContentType = "application/x-www-form-urlencoded"
WebReqLevel4.ContentLength = data4.Length
WebReqLevel4.Headers.Add("Cookie", JsCookie)
Dim newStream4 As IO.Stream = WebReqLevel4.GetRequestStream()

newStream4.Write(data4, 0, data4.Length)
newStream4.Close()


Dim WebResLevel4 As HttpWebResponse = CType(WebReqLevel4.GetResponse(), HttpWebResponse)

'JsCookie = WebResLevel4.Headers.Item("Set-Cookie")

Dim a As New IO.StreamReader(WebResLevel4.GetResponseStream, Text.Encoding.UTF8)
Dim line As Integer = 0
While a.EndOfStream = False

If (line > 277) And (line < 320) Then
context.Response.Write(Replace(a.ReadLine, vbTab, "") & Chr(13))
context.Response.Flush()
Else
a.ReadLine()
End If

line += 1

End While


WebResLevel1.Close()
WebResLevel2.Close()
WebResLevel3.Close()
WebResLevel4.Close()
a.Close()

End Sub

Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
Get
Return False
End Get
End Property

End Class


موفق باشی

مهرایزد
شنبه 11 آبان 1387, 21:40 عصر
با درود ،
اقا اول سپاسگذاری کنم برای کدی که گذاشتی. من یه منبعی پیدا کردم دارم کدم رو اصلاح می کنم اگر جواب گرفتم که ریزش رو اینجا می گذارم. راستی داشت یادم می رفت اسم سایت ezin*earticl*es.com برای رفتن به سایت لطفا ستاره ها را بردارید.

پیروز و بهروز باشید
مهرداد