PDA

View Full Version : سوال: اجرای Html در C#



TeRMiNaT00o00R
سه شنبه 02 خرداد 1391, 16:14 عصر
با سلام
سوالی که دارم اینه که میخوام در C# میخوام یک سری کارهای مربوط به یک سایتو خودش خودکار انجام بده
مثلا لاگین کنه یا روی فلان لینک کلیک کنه و ....
اما این کارا هر کدوم ورودیاشون متفاوته . یه روش اینه که یک فایل اچ تی ام ال بسازم هر بار که میخوام کارارو انجام بدم ورودی هارو بهش بدم بعد محتویات ذخیره و صفحه رو اجرا کنم
حالا میخوام بدونم کسی روش بهتری سراغ نداره ؟؟!!
مثلا بشه قطعه کد اچ تی ام ال در حافظه باشه تعقیرات روی اون اعمال شه بعد اجرا شه بدون نیاز با اجرای فایل ؟
با تشکر

Saeed_m_Farid
سه شنبه 02 خرداد 1391, 18:08 عصر
سلام
اتفاقاً تازگی ها دو نفر مشابه همین سوال رو تو پیام خصوصی پرسیدن (نمیدونم چرا از من!)، من هم با کمی تغییرات 3-4 تا نکته رو اینجا میگم:



واسه اینجور کارها از ذخیره و بازیابی فایل Html، مرورگر و اینا استفاده نمی کنن، مستقیماً از خود پروتکل HTTP و متدهای GET/POST و پارامترهای اونا استفاده میشه و از ابزارهایی مثل Fiddler (http://www.fiddler2.com/fiddler2/) یا همین Firebug فایرفاکس کمک گرفته و تشخیص میدن که مثلاً بعد لاگین قراره چه المنت هایی فرستاده بشه یا چه چیزایی فرستاده بشه واسه Source String متد POST و ...
چیزی که شما میخواین بهش میگن bot یا Crawler و ... که حتماً میدونین خیلی سایتها برای جلوگیری از این کارها Captch گذاشتن! اگه سایت (یا سایت های) موردنظر شما همچین چیزی داشته باشن، کارتون به آقام ابالفضل گره میخوره و باید با Image processing و اینا هم درگیر بشین ...
بعد لاگین باید برنامه بره تو اون سایت چکار کنه؟ لاگین یه بخش قضیه هست ولی مهمتر درون سایت WebRequest هایی هست که رد و بدل میشه و کوکی باید تنظیم کنید و الی ماشاا...
میتونید از پکیج های مفیدی مثل Html Agility Pack (http://htmlagilitypack.codeplex.com/) برای Parse کردن و دسته بندی نتیجه ها و اینجور کارها تو دات نت استفاده کنید، چون بسیار زیاد با تگ های html درگیر خواهید شد که واسه هر کدوم یه تابع و ... نوشتن مصیبت عظما میشه!


******************
بگذریم، من یه نمونه کد میذارم مثلاً برای متد GET؛ شما با فراخوانی این تابع هم خروجی رو بصورت string دارین و هم باید هردفعه Cookie های بدست اومده رو به یک CookieContainer اضافه کنید و در مرحله بعد که میتونه مثلاً متد POST باشه استفاده کنید، POST هم عین همینه فقط اولاً کوکی ها رو انتساب میدین بهش و بعدش هم باید المنت هایی که از قسمت قبل (معمولاً hidden هستند، مثل __EVENTTARGET، __VIEWSTATE، __EVENTARGUMENT و تکست باکس نام کاربری و پسورد و ... ) بدست آوردین بهش اضافه کنید.
حالا شما تا یه جاهایی برید جلو من بیشتر راهنمایی میکنم :


/// <summary>
/// Start HttpWebRequest call to parsing web portal and getting elements
/// </summary>
/// <param name="uri">
/// Uri of page that GET request must sent to
/// </param>
/// <returns>
/// Entire contents of the response page.
/// </returns>
public string SendGetRequest(Uri uri)
{
try
{

// Start a request to Uri
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.Method = "GET";
request.KeepAlive = true;
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; rv:7.0) Gecko/20100101 Firefox/7.0";
request.ContentType = "application/x-www-form-urlencoded";

// Set retrieved Cookies to WebRequest CookieContainer
request.ContentLength = 0;
request.CookieContainer = cookies;

// get the Response
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

foreach (Cookie cookie in response.Cookies)
cookies.Add(cookie);

//StreamReader is wrapped around the ResponseStream, and then read out the data into a string
using (StreamReader readStream = new StreamReader((Stream)response.GetResponseStream()) )
{
// strPageAsText will hold the entire contents of the responsed page.
strPageAsText = readStream.ReadToEnd();

// Close our objects so that the Garbage Man will be happy and have something to pick up :D
response.Close();
readStream.Close();

// Return response html as String
return strPageAsText;
}
}
catch (Exception ex)
{
//LogError(ex.ToString(), (new System.Diagnostics.StackFrame()).GetMethod().Name) ;
throw;
}
}

همونطوری که گفتم cookies یه CookieContainer هست که تو مرحله بعد استفاده میشه ...

private static CookieContainer cookies;


پسر خوب خیلی آسونه :) این از راهنمایی من

اتفاقاً زیاد هم آسون نیست! مونده به سایتش و اینکه دقیقاً میخواین چکار کنید؟ معمولاً وقتی اینحور کارها رو میکنن که بخوان یه روالی رو برای چندین نفر بطور همزمان اتوماتیک بطوری کنن که یکبار سرویس لاگین بشه و بعد درخواست ها رو رسیدگی کنه و ... اونوقت باید از Threadpool استفاده کرد و بجای GetResponse باید BeginGetResponse استفاده کنید و delegate تنظیم کنید و ... که بحثش طولانی میشه و میتونید بعداً همچین کارهایی رو خودتون ادامه بدین (Asynchronous WebRequest (http://www.eggheadcafe.com/articles/20060120.asp))

TeRMiNaT00o00R
چهارشنبه 03 خرداد 1391, 13:38 عصر
ممنونم از راهنمایتون
کل کار به این صورت که لاگین را انجام میده و بعد از اون یکسری کارا را انجام میده
مثلا کلیک کردن روی لینک مشخص یا ارسال یکسری مقادیر که این ارسال ها همه به صورت post سایت هم با php نوشته شده اونقدر پیچیدگی asp.net نداره و درگیر EVENTTARGET، __VIEWSTATE، __EVENTARGUMEN نیستم

اگر امکان داره در مورد نحوه ارسال به صورت post بیشتر راهنمایی کنید
با تشکر

Saeed_m_Farid
چهارشنبه 03 خرداد 1391, 16:52 عصر
گفتم که POST هم عین همینه ولی متدش POST هست و معمولاً اطلاعات (مثلاً Cookies) بدست اومده از WebRequest قبلی رو فقط بهش اضافه می کنید:



/// <summary>
/// Makes a request to a particular URI, The URI determines the proper
/// descendant class to create from a WebRequest,
/// descendants registered for the application.
/// </summary>
/// <param name="uri">
/// Uri of page that POST request must sent to
/// </param>
/// <returns>
/// HttpWebResponse response Uri value of retrieved web response
/// </returns>
public Uri PostRequestGetResponseUri(Uri uri)
{
try
{
// AddLog("Start a POST web request to URI: " + uri.AbsoluteUri);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
StreamWriter writer = null;
HttpWebResponse response;

// AddLog("Initializing the POST web request");
request.Method = "POST";
request.KeepAlive = true;
request.ContentLength = yourPostString.Length;
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; rv:7.0) Gecko/20100101 Firefox/7.0";
request.ContentType = "application/x-www-form-urlencoded";

// AddLog("Setting retrieved Cookies to WebRequest CookieContainer");
request.CookieContainer = cookies;

request.Referer = uri.AbsoluteUri;
try
{
// AddLog("Trying to get request Stream ...");
writer = new StreamWriter(request.GetRequestStream());
writer.Write(yourPostString);
}
catch (Exception ex)
{
// LogError(ex.ToString(), (new System.Diagnostics.StackFrame()).GetMethod().Name) ;
throw;
}
finally
{
writer.Close();
}

// AddLog("Getting the response for POST request: " + request.Connection);
response = (HttpWebResponse)request.GetResponse();

// AddLog("Adding cookies to CookieContainer...");
foreach (Cookie cookie in response.Cookies)
cookies.Add(cookie);

// AddLog("Reading response stream for entire contents of the requested page...");
using (StreamReader sr = new StreamReader(response.GetResponseStream()))
{
strPageAsText = sr.ReadToEnd();

// Close and clean up the StreamReader
sr.Close();
}
return response.ResponseUri;
}
catch (Exception ex)
{
//LogError(ex.ToString(), (new System.Diagnostics.StackFrame()).GetMethod().Name) ;
throw;
}
}


که اینجا yourPostString همون رشته ای هست که "اونقدر پیچیدگی asp.net نداره" ...
موفق باشید.

Sal_64
سه شنبه 30 خرداد 1391, 13:00 عصر
سلام
میشه بگید این چهار خط قراره چیکا کنن

request.ContentLength = yourPostString.Length;
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; rv:7.0) Gecko/20100101 Firefox/7.0";
request.ContentType = "application/x-www-form-urlencoded";

تشکر

Saeed_m_Farid
سه شنبه 30 خرداد 1391, 14:59 عصر
اینا قسمتی از تنظیمات Header درخواست HttpWebResponse شما رو set میکنن (مثلاً شما با چه مرورگری دارید به سایت مراجعه می کنید)...

mahsan91
پنج شنبه 23 خرداد 1392, 09:32 صبح
سلام خواهش میکنم جوابمو بدین, من یه هفته ایس که دنبال راهی هستم که نرخ ارز و قیمت ماشین رو از سایتی مثل
www.iranjib.ir
بردارم و در سایت دیگه ای نمایش بدم تا اینجا رسیدم
, من نمی دونم اون کدهایی رو که نوشتین رو کجا قرار بدم؟
در واقع این تابع رو کجا باید بنویسم؟
public Uri PostRequestGetResponseUri(Uri uri)
-------------------
uri
کجا مقدار میگیره؟
من سی شارپ کار میکنم, این کدها پی اچ پی هستن؟
خواهش کیکنم واضح راهنماییم کنید, تازه استخدام شدم و کارم لنگ مونده