PDA

View Full Version : مبتدی: درخواست راهنمایی برای ارسال تکست باکس به مرورگر



soheilnew
شنبه 22 خرداد 1400, 20:11 عصر
سلام دوستان وقت بخیر
من توسط آموزش زیر گوگل کروم را به فرمم اضافه کردم
https://www.codeproject.com/Tips/1058700/Embedding-Chrome-in-your-Csharp-App-using-CefSharp

قبلا توسط وب بروزر خود سی شارپ و با گت المنت میتونستم به دستور زیر مقادیر را به سایت ارسال کنم
برای مثال کد نمونه :

foreach (HtmlElement item in webBrowser1.Document.GetElementsByTagName("INPUT"))
{
//'''''''''''''''''' ایمیل ''''''''''''''''
if (item.GetAttribute("NAME") == "email")
{
item.SetAttribute("Value", textBox1.Text);
}
//''''''''''''''''''''پسورد'''''''''''''''''
if (item.GetAttribute("NAME") == "password")
{
item.SetAttribute("Value", textBox2.Text);
}
//''''''''''''''''''کلیک ورود'''''''''''''''''

if (item.GetAttribute("Value").Trim() == "ورود")
{
item.InvokeMember("Click");
}
}

حالا که از مرورگر کروم استفاده می کنم نمیدونم چطور مقدار تکست باکس را به سایت ارسال کنم
ممنون میشم راهنماییم کنید

MohammadHadi2031
یک شنبه 23 خرداد 1400, 00:04 صبح
سلام. میشه توضیح بدید که برنامه ای که مینویسید قرار هست چیکار بکنه؟ میخواید فیلد های یه صفحه وبسایت رو پرکنید که کاربر لازم نباشه هربار مقدار ها رو وارد کنه؟ میشه در مورد صفحه وبسایت هم توضیح بدید؟

soheilnew
دوشنبه 24 خرداد 1400, 13:33 عصر
سلام. میشه توضیح بدید که برنامه ای که مینویسید قرار هست چیکار بکنه؟ میخواید فیلد های یه صفحه وبسایت رو پرکنید که کاربر لازم نباشه هربار مقدار ها رو وارد کنه؟ میشه در مورد صفحه وبسایت هم توضیح بدید؟
سلام
بله همین کار هست
یک فرم ساده هست که فقط یک فیلد داره
میخوام محتویات داخل تکست باکس را به این فرم تک فیلد ارسال و ثبت کنم

MohammadHadi2031
سه شنبه 25 خرداد 1400, 01:34 صبح
من با cefsharp کارنکردم ولی ببینید این لینک (https://stackoverflow.com/questions/45587322/trying-to-simulate-user-inputs-in-cefsharp3-offscreen-using-javascript) براتون مفیده؟ میخواسته به عبارتی رو تو قسمت جستجوی به سایتی واردکنه و جستجو رو اتوماتیک انجام بده.
شاید این نکته رو بدونید جهت اطمینان میگم، وقتی یه فرم رو کاربر پر میکنه و دکمه submit رو میزنه یه درخواست به سرور ارسال میشه اگه تو نرم افزارتون بخواین یه فیلد پر بشه و اتوماتیک دکمه فشارداده بشه میتونید یه کد بزنید که اون درخواست رو به سرور بفرسته و نیازی به لود صفحه وبسایت نباشه

mazoolagh
سه شنبه 25 خرداد 1400, 11:14 صبح
من توسط آموزش زیر گوگل کروم را به فرمم اضافه کردم
https://www.codeproject.com/Tips/1058700/Embedding-Chrome-in-your-Csharp-App-using-CefSharp
...
...
قبلا توسط وب بروزر خود سی شارپ و با گت المنت میتونستم به دستور زیر مقادیر را به سایت ارسال کنم
...
...
حالا که از مرورگر کروم استفاده می کنم نمیدونم چطور مقدار تکست باکس را به سایت ارسال کنم


من وارد بحث کدنویسی با این کنترل نمیشم چون مستندات و کد و پروژه نمونه برای اون زیاد هست و همه هم سی شارپ.
ولی مختصر این که:
1- در این کنترل برخلاف کنترل webbrowser که خیلی راحت به dom دسترسی دارین، دسترسی مستقیم به dom ندارین و باید از متدهای executejavascript و evaluatejavascript استفاده کنین.
این متدها چون آسنکرون هستن باید حواستون به موارد مربوط به روش کار با اونها هم باشه.
مثلا باید قبل از اینکه نتیجه document.getelememtsbytagname("div") رو با evalutejavascriptasync بگیرین، از اینکه داکیومنت کامل لود شده مطمئن بشین وگرنه فقط اون تعدادی رو که تا لحظه اجرا لود شده برمیگردونه.
2- نتیجه ای که برمیگرده مجموعه ای از html element و ... نمیتونه باشه و خودتون باید در کدنویسی این ها رو در نظر داشته باشین.
3- برخلاف کنترل وب بروزر، داکیومنت ممکنه در چند frame برگرده (فرضا صفحه ای که یک iframe داره ممکنه در سه فریم برگرده) بنابراین باید این رو هم درنظر بگیرین چون ممکنه المنتی رو که در نظر دارین در یک فریم دیگه باشه.

در کل کار کردن با این کنترل راحت نیست (در مقایسه با وب بروزر) و بهتره به جای این از کنترل webview2 که رو edge بنا شده استفاده کنین (خود edge از موتور کرومیوم استفاده میکنه)،
به هر حال کنترل خود مایکروسافت هست.

mazoolagh
سه شنبه 25 خرداد 1400, 11:20 صبح
وقتی یه فرم رو کاربر پر میکنه و دکمه submit رو میزنه یه درخواست به سرور ارسال میشه اگه تو نرم افزارتون بخواین یه فیلد پر بشه و اتوماتیک دکمه فشارداده بشه میتونید یه کد بزنید که اون درخواست رو به سرور بفرسته و نیازی به لود صفحه وبسایت نباشه

سلام و روزخوش
چجوری فیلدهای یک فرم رو پر و بعد submit میکنین بدون اینکه اون صفحه در یک کنترل مرورگر لود شده باشه؟
میشه یک نمونه بگذارین؟

MohammadHadi2031
سه شنبه 25 خرداد 1400, 21:30 عصر
سلام و روزخوش
چجوری فیلدهای یک فرم رو پر و بعد submit میکنین بدون اینکه اون صفحه در یک کنترل مرورگر لود شده باشه؟
میشه یک نمونه بگذارین؟

سلام
این لینک (https://stackoverflow.com/a/4015346) میتونه مفید باشه. همچنین اگه میخواین در موردش بیشتر بدونید توضیحات این لینک (https://developer.mozilla.org/en-US/docs/Learn/Forms/Sending_and_retrieving_form_data) هم خوبه

mazoolagh
پنج شنبه 27 خرداد 1400, 08:37 صبح
سلام
این لینک (https://stackoverflow.com/a/4015346) میتونه مفید باشه. همچنین اگه میخواین در موردش بیشتر بدونید توضیحات این لینک (https://developer.mozilla.org/en-US/docs/Learn/Forms/Sending_and_retrieving_form_data) هم خوبه

سلام
امیدوارم وقت شما رو نگرفته باشم.

شاید خوب مطرح نکردم پرسش رو:
فرض کنید قرار هست در یک سایت login و بعد در اون کار کنیم نه این که مثل وب سرویس فقط پارامتر بفرستیم و پاسخ بگیریم.
خب بدون این که یک کنترل مرورگر داشته باشیم، فیلدهای username/password رو پر و فرم رو submit میکنیم و یک پاسخ string هم دریافت میکنیم (در واقع html source صفحه).
مشکل من اینجاست که حالا چه شکلی با اون سایت تعامل داشته باشیم؟

mehran6764
پنج شنبه 27 خرداد 1400, 11:21 صبح
سلام
امیدوارم وقت شما رو نگرفته باشم.

شاید خوب مطرح نکردم پرسش رو:
فرض کنید قرار هست در یک سایت login و بعد در اون کار کنیم نه این که مثل وب سرویس فقط پارامتر بفرستیم و پاسخ بگیریم.
خب بدون این که یک کنترل مرورگر داشته باشیم، فیلدهای username/password رو پر و فرم رو submit میکنیم و یک پاسخ string هم دریافت میکنیم (در واقع html source صفحه).
مشکل من اینجاست که حالا چه شکلی با اون سایت تعامل داشته باشیم؟

اگر سایت مقصد متعلق به خودتون هست بهترین کار اینکه براش API درست کنید .حالت دوم مرورگرها هستند که خودتونون بهش اشاره داشتین و دوستمون
پیشنهاد دادن از cefsharp استفاده نکنید اما حالت سوم ( بدون استفاده از مرورگر )

https://stackoverflow.com/a/8091963/4471268

شما می تونید از طریق متد POST و Get سمت سرور پارامترها رو ارسال کنید.نتیجه ای که برمی گرده اگر بصورت HTML باشه دوباره با یه سری دستورات می تونید خروجی رو به برحسب یه سری تگ ها استخراج کنید.

mehran6764
پنج شنبه 27 خرداد 1400, 11:38 صبح
استخراج تگ Title از سورس HTML



function get_title($html) {
return preg_match('!<title>(.*?)</title>!i', $html, $matches) ? $matches[1] : '';
}

mazoolagh
پنج شنبه 27 خرداد 1400, 14:20 عصر
اگر سایت مقصد متعلق به خودتون هست بهترین کار اینکه براش API درست کنید .حالت دوم مرورگرها هستند که خودتونون بهش اشاره داشتین و دوستمون
پیشنهاد دادن از cefsharp استفاده نکنید اما حالت سوم ( بدون استفاده از مرورگر )

https://stackoverflow.com/a/8091963/4471268

شما می تونید از طریق متد POST و Get سمت سرور پارامترها رو ارسال کنید.نتیجه ای که برمی گرده اگر بصورت HTML باشه دوباره با یه سری دستورات می تونید خروجی رو به برحسب یه سری تگ ها استخراج کنید.

سلام و روز خوش

مطلب این نیست که ندونم متدهای post/get چی هست و ارسال با فرم و query string رو بخوام یاد بگیرم،
یا header به request اضافه کنم،
یا یا با regular expression یک تگ رو از html source بیرون بکشم ،
و ...

این موارد که گفته شد صرفا برای ارسال یک request و دریافت یک response هست ولی داستان سر interact با سایت و automation هست.

پرسش من اینجاست که نمیدونم چجوری میشه بدون یک کنترل مرورگر (حالا هرچی، چه webbrowser یا همین cefsharp یا webview2 یا ...) ،
میتونیم فرضا در همین سایت برنامه نویس login کنیم و به یک تالار مشخص بریم و بعد پست بگذاریم؟
یا در یاهو login کنم و ایمیل بفرستم؟
وگرنه کار با وب سرویس یا harvesting یک سایت که نیازی به کنترل مرورگر نداره.

mehran6764
پنج شنبه 27 خرداد 1400, 17:18 عصر
باز هم در اصل موضوع فرقی نمی کنه مثلا برای لاگین تو این سایت شما پارامترهای نام کاربری و رمز عبور رو ارسال می کنید ، اگر یوزر یوزر پسورد صحیح بود
از طریق کوکی بدست اومده می تونید در یکی از تالارها تاپیک رو ایجاد کنید. کد قسمت لاگین که کوکی رو بدست میاره




static string login(string url, string username, string password)
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
string cookie = "";
string values = "vb_login_username="+username+"&vb_login_password="+password
+ "securitytoken=guest&"
+ "cookieuser=checked&"
+ "do=login";
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = values.Length;
CookieContainer a = new CookieContainer();
req.CookieContainer = a;

System.Net.ServicePointManager.Expect100Continue = false; // prevents 417 error

using (StreamWriter writer = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII))
{
writer.Write(values); }

HttpWebResponse c = (HttpWebResponse)req.GetResponse();
foreach (Cookie cook in c.Cookies) {
cookie = cookie + cook.ToString() + ";"; }

return cookie;
}


منبع : https://stackoverflow.com/a/33318869/4471268

mazoolagh
شنبه 29 خرداد 1400, 12:18 عصر
باز هم در اصل موضوع فرقی نمی کنه مثلا برای لاگین تو این سایت شما پارامترهای نام کاربری و رمز عبور رو ارسال می کنید ، اگر یوزر یوزر پسورد صحیح بود
از طریق کوکی بدست اومده می تونید در یکی از تالارها تاپیک رو ایجاد کنید. کد قسمت لاگین که کوکی رو بدست میاره


سلام
پس نیاز به کوکی هست.

1- آیا همه سایتها از کوکی استفاده میکنن؟

2- اگر سایت از کپچا استفاده کنه، میشه از طریق مرورگر مرحله ورود رو رد کرد و به فرض استفاده از کوکی مابقی کار رو به روش پیشنهادی شما؟

mehran6764
شنبه 29 خرداد 1400, 17:30 عصر
سلام
پس نیاز به کوکی هست.

1- آیا همه سایتها از کوکی استفاده میکنن؟

2- اگر سایت از کپچا استفاده کنه، میشه از طریق مرورگر مرحله ورود رو رد کرد و به فرض استفاده از کوکی مابقی کار رو به روش پیشنهادی شما؟

کاری که میخوایین انجام بدین جزییات داره ، مثلا حتی کدی که در پست قبل براتون فرستادم نویسنده اش تاکید کرده روی نسخه vBulletin تست کرده .
وابسته به هر نوع سایتی کد نویسی شما متفاوت خواهد بود.
موردی که هم در مورد کپچا نوشتین با این روش نمیشه دور زد چون سمت سرور چک میشه که مقدار کپچا وارد شده یا خیر

mazoolagh
یک شنبه 30 خرداد 1400, 12:40 عصر
بله،
موضوع همینه که شما فقط در موارد خاص میتونین بدون کنترل مرورگر با یک سایت interact داشته باشین.

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