קבלת cookies מאתר

zerba

New member
קבלת cookies מאתר

אני מנסה לכתוב תוכנה שניגשת לאתר של קופ"ג שלי, שולחת את שם המשתמש והסיסמה ומציגה לי את היתרה.
הבנתי שאני קודם צריך לבצע get לדף הרצוי, לקבל cookie עם session id ואז לשלוח בקשת post עם הנתונים שלי וה-session id.
מצאתי את קטע הקוד הבא שבאמצעותו ניתן לקבל את ה-cookies מהאתר (צריך לעשות שינוי קטן, כרגע הוא רק מציג את מספר ה-cookies, אבל אם אני מדבג את זה אז אני רואה ב-properties של resp את כל תוכן ה-cookie):
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("[URL]https://www.google.com/[/URL]");req.Method = WebRequestMethods.Http.Get;
req.CookieContainer = new CookieContainer();req.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.106 Safari/535.2";HttpWebResponse resp = (HttpWebResponse)req.GetResponse();Console.WriteLine(resp.Cookies.Count);


הבעיה שלי היא שעבור גוגל זה עובד ומציג לי שיש cookie אחד בתשובה, אבל עבור האתר שאני באמת צריך - https://www.gemel-info.co.il/gibweb/Screens/amitim/alogin.aspx אני רואה שאין בכלל cookies, בעוד שבדפדפן כמובן יש.
יש איזה רעיון מה אני צריך לעשות?
 
אתרים שאכפת להם מהמשתמשים, עשויים לחסום בקשות כאילו.

איך בדיוק הם יבדילו בין ה-request שלך ל-request אותנטי מדפדפן - אני לא ממש יודע. אולי חכמי הוועב בפורום ישכילו אותי בעניין.
 

zerba

New member
בגלל זה אני צריך את ה-cookie

קודם כל אני חייב להודות שאני גם לא מחכמי הווב, אבל להבנתי אם אני מייצר קודם בקשת get עם user agent של דפדפן לגיטימי, אני יכול דרך התשובה לבקשה לקבל את ה-cookie הנדרש ואז אני שולח בקשת post עם הנתונים של החשבון שלי.
הבעיה היא שאני לא מקבל cookies עבור ה-get הראשון שלי.
 
בדוק עם HTTP sniffer כמו Fiddler מה בדיוק עובר ב headers

ותסמלץ את ה browser.
בעקרון לא צריכה להיות בעיה, ואין (ולפי הגדרה לא קיימת) לצד השרת לדעת אם הבקשה נוצרה ע"י דפדפן או ע"י ספריית תוכנה (כי מה ההבדל?)
 

zerba

New member
זה מה שעשיתי

ואני צריך לשלוח ב-POST נתןנים שמופיעים ב-cookie שהאתר מחזיר לי, אבל קטע הקוד שצירפתי בהודעה הראשונה שלי, לא מצליח להביא לי cookies מהאתר שאני צריך. יש אתרים שמהם הוא כן מחזיר cookies (למשל - גוגל), ואני לא מצליח להבין מה הבעיה שם.
תודה על ההתיחסות.
 
אז הבעיה שלך היא באמת לקבל קוקיז כמו שצריך

ניסית עם HttpClient יותר מתאים מ WebRequest?
אולי יש לך follow אוטומטי על redirects ואז אתה מאבד את הקוקיז?
 

zerba

New member
עדיין לא עובד...

ניסיתי להשתמש ב-HttpClient:
CookieContainer cookies = new CookieContainer();HttpClientHandler handler = new HttpClientHandler { AllowAutoRedirect = false };
handler.CookieContainer = cookies;
HttpClient client = new HttpClient(handler);client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)");//Uri site = new Uri("https://www.google.com");Uri site = new Uri("https://www.gemel-info.co.il/GibWeb/Screens/Amitim/Alogin.aspx");var response1 = client.SendAsync(new HttpRequestMessage(HttpMethod.Get, site)).Result;Console.WriteLine("There are {0} cookies", cookies.Count);Console.ReadKey();
אם redirect=false אז מגוגל אני מקבל 2 עוגיות ומהאתר "שלי" כלום.
עבור true כמובן שלא חוזר כלום מאף אחד מהאתרים.
אשמח לעוד רעיונות.
תודה רבה!
 
זה נראה שב GET באמת לא מתקבלות קוקיז

כנראה רק אחרי שעושים לוגין יש את הקוקיז הנכספות
אולי "החלטת מראש" שאמורות להיות קוקיז כבר מהבקשה הראשונה לדף הלוגין...
 

zerba

New member
נראה לי שאתה צודק

אני עובד עם ה-developer tools של firefox, ובאמת ה-get הראשון נטול עוגיות.
יכול להיות שבפעם הקודמת שבדקתי זה לא היה אחרי הבקשה הראשונה מול האתר ובגלל זה ראיתי איכשהו את הקוקיז.
המון תודה לך!
 

כלליים

New member
האם נתת את דעתך לכך שמדובר בHTTPS?

בעבר בניתי לעצמי אפליקציה ששולפת את התנועות בחשבון הבנק שלי. ניסיתי לעשות את זה עם HttpRequest, אבל בסוף הרמתי ידיים בגלל השטויות של הקוקיז והSSL, ועברתי לאוטומציה של הפקד WebBrowser.
 

durus opus

New member
אני הולך לעשות לך היום,

ולהכיר לך את phantomjs.
אתה תוכל לעשות מה שרצית בערך ב-30 שורות.
תחפש דוגמאת קוד :)
אם תסתבך, אני אראה לך משהו דומה שעשיתי.
 
למעלה