OP 09 September, 2024 - 11:46 PM
(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()
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()