forked from TheRinger/craigslist-poster
-
Notifications
You must be signed in to change notification settings - Fork 0
/
__main__.py
174 lines (149 loc) · 7.45 KB
/
__main__.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
#!/usr/bin/env python
# Developed by Michael Orozco
# iBit IT
# Start dev: 10/16/2015 11:38pm
# End dev: 10/17/2015 1:45am
import sys, argparse, string, ctypes, os, re
import urllib, urllib2, cookielib, httplib
import cookielib, time, base64
from os import path
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException
from pyvirtualdisplay import Display
import spintax
class craigslistBot:
def debug(self, inString):
print (" [LOG] {BOT} - %s" % inString.encode('utf-8').strip())
def __init__(self, loginEmail = "", loginPass = "", contactNumber = "", contactName = "", postTitle = "", postCode = "", postContentFile = "", waitTime = 10):
self.display = ""
if not os.name == 'nt':
self.display = Display(visible=0,size=(800,600))
self.display.start()
self.client = webdriver.Firefox()
self.isLoggedIn = False
self.loginEmail = loginEmail
self.loginPass = loginPass
self.contactNumber = contactNumber
self.contactName = contactName
self.postTitle = postTitle
self.postCode = postCode
self.postContent = postContentFile
self.waitTime = waitTime
def __del__(self):
if not os.name == 'nt':
self.display.stop()
self.client.quit()
return 0
def login(self):
self.debug("Navigating to craigslist login")
self.client.get("https://accounts.craigslist.org/login")
self.debug("Logging in")
self.client.find_element_by_css_selector("#inputEmailHandle").send_keys(self.loginEmail)
self.client.find_element_by_css_selector("#inputPassword").send_keys(self.loginPass)
self.client.find_element_by_css_selector("form[name='login'] .loginBox button").click()
try:
self.client.find_element_by_css_selector('.tab')
except NoSuchElementException:
self.debug("Not logged in")
return
self.debug("Logged in")
self.isLoggedIn = True
def createPost(self):
if not self.isLoggedIn:
return 0
self.debug("Navigating to post page")
self.client.get("http://losangeles.craigslist.org/search/sgv/cps")
self.client.find_element_by_css_selector(".post a.no-mobile").click()
time.sleep(self.waitTime)
self.client.find_element_by_css_selector("input[value='so']").click()
time.sleep(self.waitTime)
self.client.find_element_by_css_selector("input[value='76']").click()
time.sleep(self.waitTime)
self.client.find_element_by_css_selector("input[value='4']").click()
time.sleep(self.waitTime)
self.debug("Trying to fill in email")
try:
self.client.find_element_by_css_selector('#FromEMail').send_keys(self.loginEmail)
except NoSuchElementException:
self.debug("Not avaliable")
try:
self.client.find_element_by_css_selector('#FromEMail').send_keys(self.loginEmail)
except NoSuchElementException:
self.debug("Not avaliable")
self.debug("Checking 'Okay to contact by phone'")
self.client.find_element_by_css_selector("#contact_phone_ok").click()
time.sleep(self.waitTime)
self.debug("Checking 'Okay to contact by text'")
self.client.find_element_by_css_selector("#contact_text_ok").click()
time.sleep(self.waitTime)
self.debug("Filling in contact phone number")
self.client.find_element_by_css_selector("#contact_phone").send_keys(self.contactNumber)
time.sleep(self.waitTime)
self.debug("Filling in contact name")
self.client.find_element_by_css_selector("#contact_name").send_keys(self.contactName)
time.sleep(self.waitTime)
self.debug("Filling in post title")
self.client.find_element_by_css_selector("#PostingTitle").send_keys(spintax.parse(self.postTitle))
time.sleep(self.waitTime)
self.debug("Filling in zip code")
self.client.find_element_by_css_selector("#postal_code").send_keys(self.postCode)
time.sleep(self.waitTime)
self.debug("Getting post content")
f = open(self.postContent, "rb")
content = f.read()
f.close()
self.debug("Spinning content")
spinContent = spintax.parse(content)
self.debug("Filling in post content")
self.client.find_element_by_css_selector("#PostingBody").send_keys(spinContent)
time.sleep(self.waitTime)
self.debug("Checking 'Okay to contact for other offers'")
self.client.find_element_by_css_selector("#oc").click()
time.sleep(self.waitTime)
self.debug("Unchecking 'Want a map' if checked")
try:
self.client.find_element_by_css_selector("#wantamap:checked")
except NoSuchElementException:
self.debug("Not checked")
finally:
self.client.find_element_by_css_selector("#wantamap:checked").click()
time.sleep(self.waitTime)
self.debug("Clicking continue")
self.client.find_element_by_css_selector('button[value="Continue"]').click()
time.sleep(self.waitTime)
if "editimage" in self.client.current_url:
self.debug("Clicking continue")
self.client.find_element_by_css_selector('button.done').click()
time.sleep(self.waitTime)
self.debug("Clicking publish")
self.client.find_element_by_css_selector('.draft_warning button[value="Continue"]').click()
time.sleep(10)
def main(loginEmail,loginPass,contactNumber,contactName,postTitle,postCode,postContentFile,waitTime):
startExecTime = time.time()
clBot = craigslistBot(loginEmail,loginPass,contactNumber,contactName,postTitle,postCode,postContentFile,waitTime)
clBot.login()
clBot.createPost()
endExecTime = time.time()
clBot.debug("Execution time: %s seconds" % int(endExecTime - startExecTime))
print("Finished")
return 0
parser = argparse.ArgumentParser(description="Craigslist Poster Script")
parser.add_argument('loginEmail',metavar='LOGINEMAIL',type=str,help='Email to use for login')
parser.add_argument('loginPass',metavar='LOGINPASS',type=str,help='Password to use for login')
parser.add_argument('contactNumber',metavar='CONTACTNUM',type=str,help='Contact number for post')
parser.add_argument('contactName',metavar='CONTACTNAME',type=str,help='Contact name for post')
parser.add_argument('postTitle', metavar='POSTTITLE', type=str, help='Title of the post to be made')
parser.add_argument('postCode',metavar='POSTCODE',type=str,help='Zip code for post')
parser.add_argument('postContent',metavar='POSTCONTENT',type=str, help='Path to file for post content')
parser.add_argument('waitTime',metavar='WAITTIME',type=int,help='Time to wait in between actions (Recommend 3)')
args = parser.parse_args()
main(args.loginEmail,args.loginPass,args.contactNumber,args.contactName,args.postTitle,args.postCode,args.postContent,args.waitTime)
# Test Execution
# python {{SCRIPTNAME}} "example@example.com" "password" "123-456-7890" "Bob" "Post Title" "12345" "content.txt" 3