#1
(This post was last modified: 09 September, 2024 - 11:52 PM by 32Daww31.)
hi guys i have this autoposter but he dont upload photo in category vehicle .. who can help me for repair this code


import os, re
allDirs = [name for name in os.listdir(os.getcwd()) if os.path.isdir(os.path.join(os.getcwd(), name))]

def numericalSort(value):
    numbers = re.compile(r'(\d+)')
    parts = numbers.split(value)
    parts[1::2] = map(int, parts[1::2])
    return parts

ext = ('jpg', 'jpeg', 'webp')
for folder in allDirs:
    # enter each folder one by one
    prod = {}
    dirpath = os.getcwd() + os.sep + folder  # images list
    folderContents = os.listdir(dirpath)
    folderContents = sorted(folderContents, key=numericalSort)

    #print(dirpath)
    #print(folderContents)
    temp_name = 1
    for image in folderContents:
        if image.endswith(ext):
            extension = image.split(".")
            try:
                os.rename(dirpath + os.sep + image, dirpath + os.sep + str(temp_name) + "." + extension[-1])
                print(dirpath + os.sep + str(temp_name) + "." + extension[-1] + "\t was: "+ dirpath + os.sep + image)
            except Exception:
               print("File aready exists.. skipping " + temp_name + "." + extension[-1] )
            temp_name += 1
    print("========= END ==========")

# /bin/python
# TODO: pip install missing libraries
import os, sys, json, re, time, signal
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from pynput.keyboard import Key, Controller
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

## Load all folders in memory
allDirs = [name for name in os.listdir(os.getcwd()) if os.path.isdir(os.path.join(os.getcwd(), name))]
#allDirs.pop(0)  ## DEV: remove .idea folder
auth = {}
products = []
# cookies = [] (json|load from auth.txt)
# sock = 127.0.0.1:8080


login_url = 'https://www.facebook.com'
marketplace_url = "https://www.facebook.com/marketplace/create/vehicle"
keyboard = Controller()


def numericalSort(value):
    numbers = re.compile(r'(\d+)')
    parts = numbers.split(value)
    parts[1::2] = map(int, parts[1::2])
    return parts


# Load auth data | TODO: load cookies file as login
with open('auth.txt', 'r') as file:
    lines = file.readlines()
    jsonData = ''
    authData = lines[0].strip().split(":")
    auth['user'] = authData[0]
    auth['pass'] = authData[1]
    lines.pop(0)
    for line in lines:
        jsonData += line
    if len(jsonData) > 1:
        cookies = json.loads(jsonData)
    else:
        cookies = False
# print(cookies)
# print(auth)

## Open defaults data for posting
with open("defaults.json", "r") as read_file:
    try:
        defaults = json.load(read_file)
    except ValueError as e:
        sys.exit("Invalid JSON format of file: defaults.json")
# print( defaults )
for folder in allDirs:
    # enter each folder one by one
    prod = {}
    dirpath = os.getcwd() + os.sep + folder  # images list
    folderContents = os.listdir(os.getcwd() + os.sep + folder)
    folderContents = sorted(folderContents, key=numericalSort)
    productInfo = re.sub(' +', ' ', folder).split(" ")
    productModel = " ".join(productInfo[2:len(productInfo) - 1])
    probably_price = productInfo[len(productInfo) - 1]
    productPrice = ''.join([n for n in probably_price if n.isdigit()])
    if len(productPrice) < 3:
        productPrice = defaults['price']
        productModel = " ".join(productInfo[2:len(productInfo)])
    prod['adName'] = folder
    prod['city'] = defaults['city']
    prod['make'] = productInfo[1]
    prod['model'] = productModel
    prod['mileage'] = "12000"
    prod['year'] = productInfo[0]
    prod['price'] = productPrice
    prod['dir'] = dirpath
    prod['images'] = [name for name in folderContents if name.endswith(('.jpg', '.jpeg', '.webp'))]
    products.append(prod)
# print(products)
# start browser && go to facebook

with open("description.txt", "r") as file:
    description = file.read()
#print(description)
#sys.exit(1)


chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("prefs", {"profile.default_content_setting_values.notifications": 2})
chrome_options.add_argument('--ignore-certificate-errors')
chrome_options.add_argument('--ignore-ssl-errors')
driver = webdriver.Chrome(chrome_options)
driver.get(login_url)

# Add login cookies ( if they exist )
if cookies:
    for cookie in cookies:
        cookie["sameSite"] = "None"  # Original cookies have this value wrong
        driver.add_cookie(cookie)
    driver.get(login_url)
else:
    print("We had no cookies. Try to login with USER/PASS")

try:  # inchide allow cookies
    driver.find_element(By.XPATH, "//*[@data-testid='cookie-policy-manage-dialog-accept-button']").click()
except NoSuchElementException:
    print("Accept cookies modal not there, moving on...")

# check if user requires log in
try:
    # try to log in
    user = driver.find_element(By.XPATH, "//*[@id='email']").send_keys(auth['user'])
    passwd = driver.find_element(By.XPATH, "//*[@id='pass']").send_keys(auth['pass'])
    driver.find_element(By.XPATH, "//*[@data-testid='royal_login_button']").click()
    print("User logged in with USER/PASS...")
except NoSuchElementException:
    print("User is logged with cookies, great!")

loginText = auth['user'] + ":" + auth['pass'] + "\n"
loginText += json.dumps(driver.get_cookies())
#print(loginText)
# print(json.dumps(driver.get_cookies(), indent=2))

if "checkpoint" in driver.current_url:
    print("This user is locked! \nFix this problem and try again!")
    time.sleep(30)
    sys.exit(1)
else:
    # save new cookies first line: user:pass then driver.get_cookies()
    with open('auth.txt', 'w') as file:
        loginText = auth['user'] + ":" + auth['pass'] + "\n"
        loginText += json.dumps(driver.get_cookies())
        file.write(loginText)
    # print(loginText)








def postAd(ad):
    driver.get(marketplace_url)
    if "marketplace" in driver.current_url:
        time.sleep(1)
    else:
        print("Cant reach marketplace. Some error occurred...")
        time.sleep(10)
        sys.exit(1)
    # CHECK IF LIMIT REACHED MESSAGE POPS UP
    try:
        limitReached = driver.find_element(By.XPATH, "//*[contains(text(), 'Limit reached')]")
        print("Account cannot post any more ads... Exiting script..")
        time.sleep(30)
        sys.exit(1)
    except NoSuchElementException:
        print("Psting Ad..." + ad['adName'])
    # print(ad)
    # SELECT VEHICLE TYPE
    vehicleType = {
        "1": "Car/Truck",
        "2": "Motorcycle",
        "3": "Powersport",
        "4": "RV/Camper",
        "5": "Trailer",
        "6": "Boat",
        "7": "Commercial/Industrial",
        "8": "Other"
    }
    # use arrows to navigate
    try:
        vehicleType = driver.find_element(By.XPATH, "//*[@Aria-label='Vehicle type']")
        vehicleType.click()
        for _ in range(0, 8):
            vehicleType.send_keys(Keys.DOWN)
            time.sleep(0.1)
        #vehicleType.send_keys(Keys.DOWN)
        vehicleType.send_keys(Keys.RETURN)
    except NoSuchElementException:
        print("Cannot select vehicle type... Script exiting..")
        sys.exit(1)

    # INSERT IMAGES
    try:
        upload = driver.find_element(By.XPATH, "//*[contains(text(), 'Add Photos')]")
        upload.click()
    except NoSuchElementException:
        print("Cannot find picture upload element... Script exiting..")
        sys.exit(1)
    time.sleep(3)
    keyboard.type(ad["dir"])
    time.sleep(1)
    keyboard.press(Key.enter)
    keyboard.release(Key.enter)
    time.sleep(1)
    #keyboard.type()
    imglist = ""
    for image in  ad["images"]:
        imglist += " \""+image+"\""
    #print(ad["images"])
    keyboard.type(imglist)
    keyboard.press(Key.enter)
    keyboard.release(Key.enter)
    time.sleep(10)
    # ADD LOCATION
    try:
        # variante: Location | Enter a town or city | Enter a city
        location = driver.find_element(By.XPATH, "//input[@Aria-label='Location']")
        for _ in range(0, 20):
            location.send_keys(Keys.BACKSPACE)
            time.sleep(0.1)
        location.send_keys(ad['city'])
        #category.clear()
        time.sleep(1)
        location.send_keys(Keys.DOWN)
        location.send_keys(Keys.RETURN)
    except NoSuchElementException:
        print("Location field not found")
        time.sleep(100)
    # maybe check if the field is correct?

    # ADD YEAR
    try:
        productYear = driver.find_element(By.XPATH, "//*[@Aria-label='Year']")
    except NoSuchElementException:
        print("Cannot find production date field... Exiting..")
        sys.exit(1)
    productYear.send_keys(Keys.DOWN)
    for year in range(2024, int(ad["year"])-1, -1):  # hack: year -2 because ... i have no idea
        productYear.send_keys(Keys.DOWN)
        time.sleep(0.1)
    productYear.send_keys(Keys.RETURN)
    if ''.join([n for n in productYear.get_attribute("textContent") if n.isdigit()]).strip()  ==  ad["year"].strip() :
        print("Year ok")
        #print("Anul: " +  driver
        #      .find_element(By.XPATH, "//*[@Aria-label='Year']")
        #      .get_attribute("textContent")
        #      .replace('Year', '') + " ("+ ad["year"].strip() +")")
    else:
        print("Something is wrong with production year")
    time.sleep(2)
    # ADD MAKE
    try:
        make_category = driver.find_element(By.XPATH, "//*[@Aria-label='Make']")
        make_category.send_keys(Keys.TAB)
        make_category.send_keys(ad['make'])
        make_category.send_keys(Keys.RETURN)
    except NoSuchElementException:
        print("Cannot select vehicle make... Script exiting..")
        sys.exit(1)

    # ADD MAKE
    try:
        prodModel = driver.find_element(By.XPATH, "//*[@Aria-label='Model']")
        prodModel.send_keys(Keys.TAB)
        prodModel.send_keys(ad['model'])
        prodModel.send_keys(Keys.RETURN)
    except NoSuchElementException:
        print("Cannot select vehicle model... Script exiting..")
        sys.exit(1)

    # ADD MILEAGE
#    try:
#        prodMileage = driver.find_element(By.XPATH, "//*[@Aria-label='Mileage']")
#        prodMileage.send_keys(Keys.TAB)
#        prodMileage.send_keys(ad['mileage'])
#        prodMileage.send_keys(Keys.RETURN)
#    except NoSuchElementException:
#        print("Cannot select vehicle mileage... Script exiting..")
#        sys.exit(1)

    # ADD PRICE
    try:
        prodPrice = driver.find_element(By.XPATH, "//*[@Aria-label='Price']")
        prodPrice.send_keys(Keys.TAB)
        prodPrice.send_keys(ad['price'])
        prodPrice.send_keys(Keys.RETURN)
        time.sleep(1)
    except NoSuchElementException:
        print("Cannot insert price... Script exiting..")
        sys.exit(1)

        # ADD DESCRIPTION
    try:
        prodDescription = driver.find_element(By.XPATH, "//*[@Aria-label='Description']")
        prodDescription.send_keys(description)
        time.sleep(2)
    except NoSuchElementException:
        print("Cannot insert description... Script exiting..")
        sys.exit(1)

    # check if aria-label="Next" has aria-disabled="true" (cannot post)
    try:
        submitButton = driver.find_element(By.XPATH, "//*[@Aria-label='Next']")
    except NoSuchElementException:
        print("Submit button missing or disabled... Script exiting..")
        time.sleep(30)
        sys.exit(1)
    if submitButton.get_attribute("aria-disabled") == None:
        #print("button is clickable")
        submitButton.click()
        time.sleep(2)
    time.sleep(10)  # waitt for button te become available
    #check if we can publish ad aria-label="Publish" has aria-disabled="true" (cannot post)
    try:
        publishButton = driver.find_element(By.XPATH, "//*[@Aria-label='Publish']")
    except NoSuchElementException:
        print("Submit button missing or disabled... Script exiting..")
        sys.exit(1)
    if publishButton.get_attribute("aria-disabled") == None:
        #print("button is clickable")
        publishButton.click()
        time.sleep(2)
    time.sleep(5)

for prduct in products:
    postAd(prduct)

print("================================================")
print("All products were published")
print("================================================")

time.sleep(1000)
sys.exit()