המלצה | לתכנת בלי לדעת תיכנות - היום זה אפשרי
-
@מישהו12 כתב בהמלצה | לתכנת בלי לדעת תיכנות - היום זה אפשרי:
א"א לתכנת בלי לדעת תכנות.
אני לא יודע מילה וחצי מילה בפייתון, הוא הדריך אותי אפילו מאיפה להוריד פייתון ואיך להתקין...
והיום בעבודה של כמה שעות עם הבינה האנושית שלי, הכנתי תוכנה להקפצה אוטומטית של מודעות ביד2, משהו שאני חולם עליו כבר שנים.יצא מדהים, הקוד בספויילר.
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time import os import json from datetime import datetime from dotenv import load_dotenv from bidi.algorithm import get_display def display_rtl(text): """מציג טקסט בעברית בכיוון הנכון""" return get_display(text) load_dotenv() class ListingUpdater: def __init__(self): print(display_rtl("מאתחל את דפדפן Chrome...")) self.cookies_file = "yad2_cookies.json" self.setup_driver() def setup_driver(self): chrome_options = Options() chrome_options.add_argument('--disable-gpu') chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--disable-dev-shm-usage') chrome_options.add_argument('--start-maximized') chrome_options.add_experimental_option("detach", True) try: self.driver = webdriver.Chrome(options=chrome_options) print(display_rtl("דפדפן Chrome הואצל בהצלחה")) except Exception as e: print(display_rtl(f"שגיאה בהגדרת דפדפן Chrome: {str(e)}")) raise def save_cookies(self): cookies = self.driver.get_cookies() with open(self.cookies_file, 'w') as f: json.dump(cookies, f) print(display_rtl("נשמרו עוגיות בהצלחה")) def load_cookies(self): try: with open(self.cookies_file, 'r') as f: cookies = json.load(f) # Navigate to the domain first self.driver.get('https://www.yad2.co.il') time.sleep(2) # Add the cookies for cookie in cookies: self.driver.add_cookie(cookie) print(display_rtl("עוגיות נטענו בהצלחה")) return True except FileNotFoundError: print(display_rtl("לא נמצא קובץ עוגיות קיים")) return False except Exception as e: print(display_rtl(f"שגיאה בטעינת עוגיות: {str(e)}")) return False def check_login_status(self): try: print(display_rtl("בודק סטטוס התחברות...")) # First go to main page self.driver.get('https://www.yad2.co.il') time.sleep(3) # Then try to access my-ads print(display_rtl("מנסה לגשת לאזור האישי...")) self.driver.get('https://www.yad2.co.il/my-ads') time.sleep(10) # תן יותר זמן לטעינה # Check if we're actually on the my-ads page current_url = self.driver.current_url print(display_rtl(f"כתובת נוכחית: {current_url}")) if "my-ads" in current_url: print(display_rtl("מחובר בהצלחה לאזור האישי!")) return True else: print(display_rtl("לא הצלחנו להגיע לאזור האישי")) return False except Exception as e: print(display_rtl(f"שגיאה בבדיקת סטטוס התחברות: {str(e)}")) return False def manual_login(self): print(display_rtl("\nאנא התחבר באופן ידני ל-Yad2:")) print(display_rtl("1. הכנס את פרטי ההתחברות שלך")) print(display_rtl("2. פתור את אתגר האבטחה אם נדרש")) print(display_rtl("3. לאחר התחברות מוצלחת, התסריט ימשיך באופן אוטומטי")) self.driver.get('https://www.yad2.co.il/auth/login') # Wait for successful login WebDriverWait(self.driver, 300).until( lambda driver: "my-ads" in driver.current_url or "feed/my" in driver.current_url ) print(display_rtl("התחברת בהצלחה!")) self.save_cookies() def update_listings(self): try: print(display_rtl("מנווט לדף המודעות שלי...")) self.navigate_to_my_ads() # מחפש את כפתורי ההקפצה print(display_rtl("\nמחפש כפתורי הקפצה...")) bump_buttons = self.driver.find_elements(By.CSS_SELECTOR, "[class*='bump-button_bumpButton']") if not bump_buttons: print(display_rtl("לא נמצאו כפתורי הקפצה")) return False print(display_rtl(f"נמצאו {len(bump_buttons)} כפתורי הקפצה")) # עובר על כל כפתור הקפצה for i in range(len(bump_buttons)): try: # מנווט מחדש לדף המודעות בכל פעם self.navigate_to_my_ads() print(display_rtl(f"\nמנסה להקפיץ מודעה {i + 1}...")) # מוצא את כפתורי ההקפצה מחדש אחרי הניווט bump_buttons = self.driver.find_elements(By.CSS_SELECTOR, "[class*='bump-button_bumpButton']") if i >= len(bump_buttons): print(display_rtl("לא נמצאו יותר כפתורי הקפצה")) break button = bump_buttons[i] print(f"\nטקסט על כפתור {i + 1}:", button.text.strip()) # בודק אם הכפתור מושבת if button.get_attribute("aria-disabled") == "true" or button.get_attribute("disabled"): print(display_rtl("הכפתור מושבת")) continue # גולל לכפתור self.driver.execute_script("arguments[0].scrollIntoView(true);", button) time.sleep(1) # מנסה ללחוץ באמצעות JavaScript print("מנסה ללחוץ על כפתור ההקפצה...") self.driver.execute_script("arguments[0].click();", button) print("לחיצה על כפתור ההקפצה") # מחכה קצת ואז מרענן את הדף time.sleep(2) print("מרענן את הדף...") self.driver.refresh() # מחכה לטעינת הדף print("ממתין לטעינת הדף...") self.wait_for_page_load() print("הדף נטען") # מחכה קצת זמן אחרי ההקפצה time.sleep(3) except Exception as e: print(display_rtl(f"שגיאה בהקפצת מודעה {i + 1}: {str(e)}")) if hasattr(e, 'msg'): print(f"Message: {e.msg}") return True except Exception as e: print(display_rtl(f"נכשל בהקפצת המודעות: {str(e)}")) if hasattr(e, 'msg'): print(f"Message: {e.msg}") return False def navigate_to_my_ads(self): """מנווט לדף המודעות שלי ומחכה שהדף יטען""" self.driver.get('https://www.yad2.co.il/my-ads') # מחכה שהדף יטען print(display_rtl("ממתין לטעינת הדף...")) WebDriverWait(self.driver, 30).until( lambda driver: driver.execute_script("return document.readyState") == "complete" ) # מחכה שה-splash screen ייעלם print(display_rtl("ממתין שמסך הטעינה ייעלם...")) try: splash_screen = WebDriverWait(self.driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, "splash-screen_box__diyY1")) ) WebDriverWait(self.driver, 20).until( EC.staleness_of(splash_screen) ) print(display_rtl("מסך הטעינה נעלם")) except: print(display_rtl("לא נמצא מסך טעינה")) # מחכה שיופיע התוכן האמיתי print(display_rtl("ממתין לטעינת התוכן...")) time.sleep(3) def wait_for_page_load(self): WebDriverWait(self.driver, 30).until( lambda driver: driver.execute_script("return document.readyState") == "complete" ) def close(self): try: self.driver.quit() except: pass def main(): updater = None try: while True: # לולאה אינסופית print("\nמתחיל הרצה חדשה...") updater = ListingUpdater() updater.load_cookies() if updater.check_login_status(): print(display_rtl("התחברות באמצעות עוגיות הצליחה!")) else: print(display_rtl("צריך להתחבר שוב...")) updater.manual_login() print(display_rtl("\nמתחיל את תהליך העדכון...")) updater.update_listings() updater.close() # מחכה 4 שעות ודקה print("\nממתין 4 שעות ודקה עד להרצה הבאה...") time.sleep((4 * 60 * 60) + 60) # 4 שעות + דקה בשניות except KeyboardInterrupt: print("\nהתוכנית הופסקה על ידי המשתמש") finally: if updater: updater.close() if __name__ == "__main__": main()
-
-
@MAKRO כתב בהמלצה | לתכנת בלי לדעת תיכנות - היום זה אפשרי:
@צללית כתב בהמלצה | לתכנת בלי לדעת תיכנות - היום זה אפשרי:
קלוד לא בדקתי
@NH-LOCAL כתב שכיום, החינמי שלהם כבר לא משהו...
זכור לי שהוא ( @NH-LOCAL ) גם כתב שבשביל פרונט ועיצובים הוא (קלוד) הרבה יותר טוב מכל השאר,
ואני מאשר זאת מנסיון.ומנצל את ההזדמנות להודות לו על הטיפ הזה. -
@MAKRO כתב בהמלצה | לתכנת בלי לדעת תיכנות - היום זה אפשרי:
@צללית כתב בהמלצה | לתכנת בלי לדעת תיכנות - היום זה אפשרי:
קלוד לא בדקתי
@NH-LOCAL כתב שכיום, החינמי שלהם כבר לא משהו...
זה השתנה כעת שוב, הם החזירו את המודל הטוב שלהם למשתמשים החינמיים ממש אתמול!
-
@צללית כתב בהמלצה | לתכנת בלי לדעת תיכנות - היום זה אפשרי:
@MAKRO אם השאלה היא gemini מול chat-gpt - ברור שchat-gpt עולה בכמה רמות. ובתוך chat-gpt יש כמה מודלים, יש את היותר טוב בחינם ואחרי כמה שאלות זה יורד, ועדיין זה יותר טוב מג'מיני
קלוד לא בדקתיכבר לא ממש נכון. ממליץ להסתכל על המדד livebench שמודד יכולות של מודלי AI בכמה פרמטרים מרכזיים.
בפועל, מהניסיון האישי שלי, זה תלוי מאוד פר משימה. בשבוע האחרון עסקתי במספר פרוייקטים שונים ומשונים עם דרישות ומבני קוד שונים. בחלק מהמקרים gpt4o הפשוט היה טוב יותר מכל מודל אחר, במקרים אחרים זה היה gemini 2.0 החדש ובמקרים מסויימים o1 של OPENAI