דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. ארכיון code613m
  4. מדריך WEB API

מדריך WEB API

מתוזמן נעוץ נעול הועבר ארכיון code613m
23 פוסטים 3 כותבים 2.0k צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • dovidD מנותק
    dovidD מנותק
    dovid ניהול
    כתב ב נערך לאחרונה על ידי
    #11

    אתה חייב לבקש תחילה את הדף, ואחרי הורדתו להוציא ממנו את הטוקן שנמצא באינפוט נסתר שהID שלו הוא csrftoken.

    פורסם במקור בפורום CODE613 ב16/08/2015 17:59 (+03:00)

    מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

    בכל נושא אפשר ליצור קשר dovid@tchumim.com

    תגובה 1 תגובה אחרונה
    1
    • clickoneC מנותק
      clickoneC מנותק
      clickone
      כתב ב נערך לאחרונה על ידי
      #12

      לצערי חסום לי בנטפרי.
      וחלק בכלל מוציא לי שגיאת אבטחה

      פורסם במקור בפורום CODE613 ב16/08/2015 21:00 (+03:00)

      אין טסט כמו פרודקשן.

      המייל שלי urivpn@gmail.com

      תגובה 1 תגובה אחרונה
      0
      • clickoneC מנותק
        clickoneC מנותק
        clickone
        כתב ב נערך לאחרונה על ידי
        #13

        ביקשתי בינתיים מחבר שיוריד לי.
        זה בעצם קובץ שעולה עם כל עידכון?
        ואז צריך לחלץ אותו ולהוציא את הXML?

        אצל כל הרשתות זה כך? או שיש רשתות שאצלם המחיר מסודר בצורה שונה.

        פורסם במקור בפורום CODE613 ב16/08/2015 21:03 (+03:00)

        אין טסט כמו פרודקשן.

        המייל שלי urivpn@gmail.com

        תגובה 1 תגובה אחרונה
        0
        • clickoneC מנותק
          clickoneC מנותק
          clickone
          כתב ב נערך לאחרונה על ידי
          #14

          תגיד, איך הזחלן (=תוכנה לכריית נתונים) שלך בנוי?

          כפונקצייה שרצה? או חלון שיש לך שליטה עליו?

          פורסם במקור בפורום CODE613 ב16/08/2015 21:12 (+03:00)

          אין טסט כמו פרודקשן.

          המייל שלי urivpn@gmail.com

          תגובה 1 תגובה אחרונה
          0
          • Z מנותק
            Z מנותק
            zvi good
            כתב ב נערך לאחרונה על ידי
            #15

            @ClickOne

            ביקשתי בינתיים מחבר שיוריד לי.
            זה בעצם קובץ שעולה עם כל עידכון?
            ואז צריך לחלץ אותו ולהוציא את הXML?

            כן כל פרק זמן יש עידכון (לפי החוק הם חייבים לעדכן באתר שעה מעדכון המחירים בפועל)
            @ClickOne

            אצל כל הרשתות זה כך? או שיש רשתות שאצלם המחיר מסודר בצורה שונה.

            כל רשתות השיווק מספקים את הנתונים ב XML בקובץ RAR (וחלקם גם ב Excel ואולי עוד משהו)
            כך שהכי נוח יהיה לעבוד מול ה XML (אולי להמיר אותו ל Json)
            יש תקן איך חייבים לפרסם את תבנית הנתונים לפי הבדיקה זה לא מיושם במאה אחוז

            @ClickOne

            תגיד, איך הזחלן (=תוכנה לכריית נתונים) שלך בנוי?
            כפונקצייה שרצה? או חלון שיש לך שליטה עליו?

            עדיין שום דבר לא בנוי כמו שכתבתי למעלה אני עדיין עומד בשלב של לעקוף את הטוקן בדף הלוגין.
            (על אף שאין קשר בין זה להמשך הקוד)

            ולשאלתך בכוונתי לבנות אותו כפונקציה שרצה כל פרק זמן לפי הצורך כדלהלן
            הנתונים מתעדכנים בצורה הזאת:
            (בבוקר) עולה קובץ מעודכן מלא של מחירים FullPrice וכן קובץ מבצעים FullPromo
            ובהמשך הים כשהם מעדכנים מחירים הם מוסיפים (לא משנים ולא מוחקים) קובץ עדכון גם באתר.
            ובגלל שהנתונים מתעדכנים מדי פעם (שעה מהעדכון בפועל) ואי אפשר לצפות את מועד העדכון
            אז הפתרון הוא לבדוק כל שעה או שעתיים אם נוסף קובץ עדכון

            פורסם במקור בפורום CODE613 ב16/08/2015 23:54 (+03:00)

            תגובה 1 תגובה אחרונה
            0
            • Z מנותק
              Z מנותק
              zvi good
              כתב ב נערך לאחרונה על ידי
              #16

              @דוד ל.ט.

              אתה חייב לבקש תחילה את הדף, ואחרי הורדתו להוציא ממנו את הטוקן שנמצא באינפוט נסתר שהID שלו הוא csrftoken.

              אוקי את זה הבנתי
              אם אני גולש לדף ומעתיק את הטוקן ומבלי לסגור את הדף מריץ את הקוד הזה זה נותן לי להמשיך הלאה
              אבל אם אני מרענן או סוגר את הדף הטוקן משתנה

              <form id="login-user" action="https://url.publishedprices.co.il/login/user/" method="post">
                      <input type="text" name="username" value="osherad">
                      <input type="password" name="password">        
                        כאן העתקתי את הטוקן והרצתי תוך כדי גלישה
                      <input type="hidden" name="csrftoken" id="csrftoken" value="CcKww60Cwp/Dj8KQHG3DqUpuwqktRsORw5XDkMO/GQ==" />
              
                  </form>
                  <script>
                      document.getElementById("login-user").submit();
                  </script>
              

              איך אני יכול ליישם את זה ב C# מבלי שאצטרך לגלוש כל פעם?
              אני הרי רוצה שהתוכנה תרוץ בעצמה מדי פעם לפי הגדרה מראש בצורה אוטומטית.

              שמעתי על כלי בשם selenium שקשור לבדיקות אוטומטיות שדרכה באימולטור אפשר להריץ את האתר להוריד את הקבצים
              ואז לטפל בהם
              אבל זה ממש לא נראה לי דרך טבעית
              או שכן ???

              פורסם במקור בפורום CODE613 ב17/08/2015 00:15 (+03:00)

              תגובה 1 תגובה אחרונה
              0
              • dovidD מנותק
                dovidD מנותק
                dovid ניהול
                כתב ב נערך לאחרונה על ידי
                #17

                אם אתה מרענן את הדף זה לא משתנה כי זה אותו עוגיה. זה משתנה בדף חדש או אחרי שהעוגיה לא תקפה.
                אתה צריך לגשת לדף דרך הקוד ושם להוציא את הטוקן. ועם העוגיה שאתה מחזיק לבצע login ואח"כ להוריד את הקובץ.
                הכנתי לך דוגמה לאושר עד:
                ישנם שלוש מתודות עזר (getToken, login, StringFileDownload) והמתודה הרביעית (Download) עושה את העבודה.

                string getToken(CookieContainer cookieContainer, string urlPage, string pattrenRegex)
                {
                    var WebRequestForGetToken = WebRequest.Create(urlPage);
                    ((HttpWebRequest)WebRequestForGetToken).CookieContainer = cookieContainer;
                
                    string pageForToken = new StreamReader(WebRequestForGetToken.GetResponse().GetResponseStream(), Encoding.Default).ReadToEnd();
                
                    return Regex.Match(pageForToken, pattrenRegex).Groups[1].Value;
                }
                
                void login(CookieContainer cookieContainer, string urlPage, string args)
                {
                    var request = (HttpWebRequest)WebRequest.Create(urlPage);
                    request.Proxy = null;
                    request.CookieContainer = cookieContainer;
                    request.Method = "POST";
                    request.ContentType = "application/x-www-form-urlencoded";
                
                    byte[] requestData = Encoding.UTF8.GetBytes(args);
                    request.ContentLength = requestData.Length;
                
                    using (Stream s = request.GetRequestStream())
                        s.Write(requestData, 0, requestData.Length);
                
                    using (var response = (HttpWebResponse)request.GetResponse())
                        foreach (Cookie c in response.Cookies)
                            //פה תוכל לבדוק שאתה אכן עברת אימות בהצלחה
                            Console.WriteLine(c.Name + " = " + c.Value);
                }
                
                string StringFileDownload(CookieContainer cookieContainer, string urlFile)
                {
                    var requestDown = WebRequest.Create(urlFile);
                    ((HttpWebRequest)requestDown).CookieContainer = cookieContainer;
                
                    return new StreamReader(requestDown.GetResponse().GetResponseStream(), Encoding.Default).ReadToEnd();
                }
                
                void Download()
                {
                    //מחזיק לעוגיות
                    CookieContainer cookieContainer = new CookieContainer();
                
                    //משיכת הטוקן
                    //מוריד בעצם את הדף ומחפש את הערך באמצעות ביטוי רגלורי
                    string pattrenRegex = "\"csrftoken\" value=\"(.*)\"";
                    string token = getToken(cookieContainer, "https://url.publishedprices.co.il/login", pattrenRegex);
                
                    //בניית הפרמטרים: שם סיסמה וטוקן במקרה זה
                    var args = "username=" + "osherad&password=&csrftoken=" + HttpUtility.UrlEncode(token);
                
                    //מבצע login עם אותם עוגיות של 
                    login(cookieContainer, "https://url.publishedprices.co.il/login/user", args);
                
                    //מוריד את הקובץ
                    string file = StringFileDownload(cookieContainer, "https://url.publishedprices.co.il/file/d/Price7290103152017-001-201508171000.gz");
                }
                

                פורסם במקור בפורום CODE613 ב17/08/2015 13:55 (+03:00)

                מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                בכל נושא אפשר ליצור קשר dovid@tchumim.com

                תגובה 1 תגובה אחרונה
                3
                • Z מנותק
                  Z מנותק
                  zvi good
                  כתב ב נערך לאחרונה על ידי
                  #18

                  [size=150:2b85nnem]תודה ענקית[/size:2b85nnem] דוד על השקעתך בשבילי (חבל שאין לייק)

                  העתקתי את הקוד לפרויקט קונסול והוספתי את מרחבי השמות הדרושים
                  אך הוא מראה לי שגיאה בשורה 50 על HttpUtility הוא טוען שהוא לא מכיר את השם הזה
                  The name 'HttpUtility' does not exist in the current context

                  דבר נוסף האם אני מבין נכון שאני מתחיל להריץ את הקוד בפונקציית Download?
                  פשוט הפונקציות האחרות מקבלות פרמטרים שנמצאים בתוכו.

                  פורסם במקור בפורום CODE613 ב17/08/2015 15:46 (+03:00)

                  תגובה 1 תגובה אחרונה
                  1
                  • dovidD מנותק
                    dovidD מנותק
                    dovid ניהול
                    כתב ב נערך לאחרונה על ידי
                    #19

                    תוסיף Reference בשם System.Web.

                    הפונקציה הראשית היא אכן Download. חילקתי לפונקציות כדי למנוע קוד כפול לכתובות אחרות.
                    האמת שאתה יכול לעשות זאת יותר אוטומטית וגנרית - בלי לדעת אם יש טוקנים ומה שמם - פשוט לחפש את הטוקנים ע"י בדיקה אם יש בטופס אינפוטים נסתרים וא"כ לקחת את ערכם. אבל כיון שזה כולל ניתוח html וזה מצריך עבודה/מחלקה נמנעתי מלרדת לכזו רזולוציה.

                    בConsole אז אתה צריך או להפוך את כל הפונקציות לסטטיות או ליצור אובייקט כמו var p = new Programm, ואח"כ p.Download().

                    פורסם במקור בפורום CODE613 ב17/08/2015 15:56 (+03:00)

                    מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                    בכל נושא אפשר ליצור קשר dovid@tchumim.com

                    תגובה 1 תגובה אחרונה
                    2
                    • Z מנותק
                      Z מנותק
                      zvi good
                      כתב ב נערך לאחרונה על ידי
                      #20

                      @דוד ל.ט.

                      אתה צריך לגשת לדף דרך הקוד ושם להוציא את הטוקן. ועם העוגיה שאתה מחזיק לבצע login ואח"כ להוריד את הקובץ.
                      הכנתי לך דוגמה לאושר עד:
                      ישנם שלוש מתודות עזר (getToken, login, StringFileDownload) והמתודה הרביעית (Download) עושה את העבודה.

                      הרצתי את הפרויקט זה מתקמפל ורץ אבל קובץ אני לא רואה שהוא מוריד
                      הוא מביא לי את שם הקובץ ועוד כמות של תוים מכל הבא ליד...
                      מדוע?
                      אולי בגלל שזה קובץ gz דחוס אז כך הוא מוריד את זה
                      אולי הקידוד אינו מוגדר בצורה נכונה
                      יש לי קוד לחילוץ קבצי gz אבל זה לא יעזור לי כי זה רק לקבצים פיזיים.
                      ואולי יש אפשרות להוריד ולחלץ בלי לשמור אותו פיזית?!.

                      עוד משהו בקשר לקוד הזה

                      string file = StringFileDownload(cookieContainer, "https://url.publishedprices.co.il/file/d/Price7290103152017-001-201508171000.gz");
                      
                      string StringFileDownload(CookieContainer cookieContainer, string urlFile)
                      {
                          var requestDown = WebRequest.Create(urlFile);
                          ((HttpWebRequest)requestDown).CookieContainer = cookieContainer;
                       
                          return new StreamReader(requestDown.GetResponse().GetResponseStream(), Encoding.Default).ReadToEnd();
                      }
                      

                      ה Url כאן מפנה לקובץ מסוים להורדה ואני מעוניין לקבל את הדף ולעבור עם לולאה על כל תגיות ה Href שמכילים קבצים להורדה
                      אז שיניתי את ה-Url כך שיגיע לדף שאוכל למפות אותו https://url.publishedprices.co.il/file מה שלכאורה היה אמור להביא לי את כל מקור הדף
                      אבל אופס' אני מגלה שהוא מביא לי את הדף חוץ ממה שאני צריך אין שם קישורים להורדה בכלל
                      ועוד יותר מוזר היה לי כשפתחתי את האתר בדף שנמצאים שם הקישורים וביקשתי את מקור הדף אני מקבל את מקור הדף בלי הקישורים להורדה
                      למה זה כך? :shock:

                      פורסם במקור בפורום CODE613 ב18/08/2015 15:07 (+03:00)

                      תגובה 1 תגובה אחרונה
                      0
                      • dovidD מנותק
                        dovidD מנותק
                        dovid ניהול
                        כתב ב נערך לאחרונה על ידי
                        #21

                        @Zvi Good

                        הרצתי את הפרויקט זה מתקמפל ורץ אבל קובץ אני לא רואה שהוא מוריד
                        הוא מביא לי את שם הקובץ ועוד כמות של תוים מכל הבא ליד...

                        בקוד שלי אין בכלל שמירה לקובץ, רק השמה במשתנה טקסטואלי.

                        @Zvi Good

                        יש לי קוד לחילוץ קבצי gz אבל זה לא יעזור לי כי זה רק לקבצים פיזיים.
                        ואולי יש אפשרות להוריד ולחלץ בלי לשמור אותו פיזית?!.

                        ברור שאפשר בלי לשמור פיזית. אני אעלה קוד בהמשך.
                        (צריך לקבל את הקובץ כבתים ולא כסטרינג).

                        @Zvi Good

                        ה Url כאן מפנה לקובץ מסוים להורדה ואני מעוניין לקבל את הדף ולעבור עם לולאה על כל תגיות ה Href שמכילים קבצים להורדה
                        אז שיניתי את ה-Url כך שיגיע לדף שאוכל למפות אותו https://url.publishedprices.co.il/file מה שלכאורה היה אמור להביא לי את כל מקור הדף
                        אבל אופס' אני מגלה שהוא מביא לי את הדף חוץ ממה שאני צריך אין שם קישורים להורדה בכלל
                        ועוד יותר מוזר היה לי כשפתחתי את האתר בדף שנמצאים שם הקישורים וביקשתי את מקור הדף אני מקבל את מקור הדף בלי הקישורים להורדה
                        למה זה כך? :shock:

                        איך פתחת אותו? בכל אופן בשביל לנתח HTML אתה חייב להשתמש בספריה חיצונית (או להתחיל לכתוב המון קוד).
                        הספריה הטובה ביותר היא HtmlAgilityPack והדרך הקלה להתקנה היא ע"י הPackage Manager Console (תפריט Tools > NuGet Package Manager) שם אתה כותב Install-Package HtmlAgilityPack.

                        פורסם במקור בפורום CODE613 ב20/08/2015 12:15 (+03:00)

                        מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                        בכל נושא אפשר ליצור קשר dovid@tchumim.com

                        תגובה 1 תגובה אחרונה
                        0
                        • Z מנותק
                          Z מנותק
                          zvi good
                          כתב ב נערך לאחרונה על ידי
                          #22

                          @דוד ל.ט.

                          @Zvi Good

                          הרצתי את הפרויקט זה מתקמפל ורץ אבל קובץ אני לא רואה שהוא מוריד
                          הוא מביא לי את שם הקובץ ועוד כמות של תוים מכל הבא ליד...

                          בקוד שלי אין בכלל שמירה לקובץ, רק השמה במשתנה טקסטואלי.

                          אוקי לזה התכוונתי - ציפיתי לראות את הטקסט שבקובץ אבל הוא קיבל כנראה רק את Bytes של הקובץ Gz

                          @דוד ל.ט.

                          @Zvi Good

                          יש לי קוד לחילוץ קבצי gz אבל זה לא יעזור לי כי זה רק לקבצים פיזיים.
                          ואולי יש אפשרות להוריד ולחלץ בלי לשמור אותו פיזית?!.

                          ברור שאפשר בלי לשמור פיזית. אני אעלה קוד בהמשך.
                          (צריך לקבל את הקובץ כבתים ולא כסטרינג).

                          בסוף העליתי אני 😉 ועל הדרך למדתי המון...

                          public static string UnZip(byte[] value)
                                  {            
                                      //Prepare for decompress
                                      System.IO.MemoryStream ms = new System.IO.MemoryStream(value);
                                      System.IO.Compression.GZipStream sr = new System.IO.Compression.GZipStream(ms,
                                          System.IO.Compression.CompressionMode.Decompress);
                          
                                      //Reset variable to collect uncompressed result
                                      value = new byte[value.Length];
                          
                                      //Decompress
                                      int rByte = sr.Read(value, 0, value.Length);
                          
                                      //Transform byte[] unzip data to string
                                      System.Text.StringBuilder sB = new System.Text.StringBuilder(rByte);
                                      //Read the number of bytes GZipStream red and do not a for each bytes in
                                      //resultByteArray;
                                      for (int i = 0; i < rByte; i++)
                                      {
                                          sB.Append((char)value[i]);
                                      }
                                      sr.Close();
                                      ms.Close();
                                      sr.Dispose();
                                      ms.Dispose();           
                                      return sB.ToString();
                                  }אז תודה שלא העלת...  :D 
                          

                          עדיין יש לי בעיה, כאשר אני מוריד אותו כקובץ הכל בסדר אבל אם אני משתמש בקוד לחילוץ הקבצים בלי הורדה פיזית יש בעיה בקידוד של העברית.
                          אני שם לב שלאן שרק תגיע יהיה בעיה עם הקידוד של העברית.
                          אז אם אפשר הדרכה או סיוע בקידוד.

                          @דוד ל.ט.

                          @Zvi Good

                          ה Url כאן מפנה לקובץ מסוים להורדה ואני מעוניין לקבל את הדף ולעבור עם לולאה על כל תגיות ה Href שמכילים קבצים להורדה
                          אז שיניתי את ה-Url כך שיגיע לדף שאוכל למפות אותו https://url.publishedprices.co.il/file מה שלכאורה היה אמור להביא לי את כל מקור הדף
                          אבל אופס' אני מגלה שהוא מביא לי את הדף חוץ ממה שאני צריך אין שם קישורים להורדה בכלל
                          ועוד יותר מוזר היה לי כשפתחתי את האתר בדף שנמצאים שם הקישורים וביקשתי את מקור הדף אני מקבל את מקור הדף בלי הקישורים להורדה
                          למה זה כך? :shock:

                          איך פתחת אותו? בכל אופן בשביל לנתח HTML אתה חייב להשתמש בספריה חיצונית (או להתחיל לכתוב המון קוד).
                          הספריה הטובה ביותר היא HtmlAgilityPack והדרך הקלה להתקנה היא ע"י הPackage Manager Console (תפריט Tools > NuGet Package Manager) שם אתה כותב Install-Package HtmlAgilityPack.

                          אז דבר ראשון הצעת לי חבילה מצוינת שלא ידעתי עליה וזה ממש הציל אותי בפרויקט אחר שהייתי חייב לנתח Html.
                          ולגבי הדף כאן אז פתחתי אותו ממש פשוט "צפה במקור הדף" אבל מה התברר לי שאחרי שהדף יורד הוא מביא את נתוני הקבצים ב Agax כך שבמקור הדף אין אפשרות לראות את זה, הפתרון היה די פשוט (לי בפעם הראשונה קשה מאוד) חיפשתי בדפדפן את הנתיב של ה Agax עם הפרמטרים request חוזר עם אותם עוגיות והפרמטרים של ה Agax וברוך ה' הגעתי אליו.

                          שוב פעם [size=140:300ywwrh]המון המון תודה![/size:300ywwrh] על הקוד הראשוני והעזרה במשך שנתן לי להתקדם המון!!!

                          פורסם במקור בפורום CODE613 ב02/09/2015 02:21 (+03:00)

                          תגובה 1 תגובה אחרונה
                          1
                          • dovidD מנותק
                            dovidD מנותק
                            dovid ניהול
                            כתב ב נערך לאחרונה על ידי
                            #23

                            zviGood אתה מאוד משמח אותי בזה שאתה מתקדם לבד וכמובן גם על המחמאות :)...
                            בקוד שלך הקטע של הStringBuilder מיותר, במקומו עליך לכתוב ככה:

                            return Encoding.UTF8.GetString(value);
                            

                            אבל עיקר הבעיה של הקוד זה אורכו של המשתנה value. הוא באותו אורך של המקור, והמקור קצר בשל דחיסותו. אז איזה אורך לעשות? אפשר לעשות אורך כפול וקיצוץ לבסוף, אבל פחחח.. זה לא דרך. בדרך כלל משתמשים בMemoryStream, אבל פה שגם רוצים לקודד את הבתים, אז זה בדיוק תפקידו של הStreamReader ("קורא זרם בתים לקידוד מסויים"), ככה:

                            public static string UnZip(byte[] value)
                            {
                                using (var ms = new System.IO.MemoryStream(value))
                                using (var sr = new System.IO.Compression.GZipStream(ms, System.IO.Compression.CompressionMode.Decompress))
                                using (var strReader = new StreamReader(sr, Encoding.UTF8))
                                    return strReader.ReadToEnd();
                            }
                            

                            פורסם במקור בפורום CODE613 ב02/09/2015 17:20 (+03:00)

                            מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                            בכל נושא אפשר ליצור קשר dovid@tchumim.com

                            תגובה 1 תגובה אחרונה
                            1

                            • 1
                            • 2
                            בא תתחבר לדף היומי!
                            • התחברות

                            • אין לך חשבון עדיין? הרשמה

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