import configparser, csv, datetime, html.parser, itertools, os, sqlite3, sys, tweepy
class SetupException(Exception):
def __str__(self):
return "Seems like config.cfg has not been created yet. Run setup.py to do so."
def getSetting(section, setting):
config = configparser.RawConfigParser()
config.read('config.cfg')
return config.get(section, setting)
def dbpath():
try:
return getSetting("Database", "path")
except:
return "Database.db"
def cke():
try:
return getSetting("Twitter", "cke")
except:
raise SetupException()
def cse():
try:
return getSetting("Twitter", "cse")
except:
raise SetupException()
def ato():
try:
return getSetting("Twitter", "ato")
except:
raise SetupException()
def ase():
try:
return getSetting("Twitter", "ase")
except:
raise SetupException()
def user():
return twObject().whoami()
class dbObject:
def __init__(self, path=dbpath()):
self.conn = sqlite3.connect(path)
self.cur = self.conn.cursor()
self.path = path
def closeConnection(self):
return self.conn.close()
def commit(self):
return self.conn.commit()
def executeQuery(self, query):
return self.cur.execute(query)
def getNext(self):
return self.cur.fetchone()
def isInitialized(self):
try:
self.executeQuery("SELECT * FROM tweets")
return True
except:
return False
def getFLDate(self, val = 0):
if val == 0:
mode = "MIN"
else:
mode = "MAX"
return getDate(str(list(self.executeQuery("SELECT %s(SUBSTR(timestamp,0,11)) FROM tweets" % mode))[0][0]))
class twObject:
def __init__(self, cke = cke(), cse = cse(), ato = ato(), ase = ase()):
self.auth = tweepy.OAuthHandler(cke, cse)
self.auth.set_access_token(ato, ase)
self.api = tweepy.API(self.auth)
def delete(self, id):
self.api.destroy_status(id)
def search(self, query, savepoint = 0):
tweets = list(tweepy.Cursor(self.api.search, q=query, since_id=savepoint).items())
tweets.reverse()
return tweets
def whoami(self):
return self.auth.get_username()
def dbCheck(db, create = False):
if (not create and dbInitialized(db)) or (create and not dbInitialized(db)):
return True
if create:
raise ValueError("Provided database file " + db.path + " is already initialized. Remove it manually before trying to recreate it.")
raise ValueError("Provided database file " + db.path + " is not initialized. Create it using makedb.py or csvdb.py")
def dbHelper(path, create = False):
db = dbObject(path)
dbCheck(db, create)
return db
def dbInitialized(db):
return db.isInitialized()
def fileExists(path):
return os.path.isfile(path)
def getDate(date):
try:
return datetime.datetime.strptime(date, '%Y-%m-%d')
except ValueError:
raise ValueError("Dates must be in YYYY-MM-DD format.")
def paginate(iterable, page_size):
while True:
i1, i2 = itertools.tee(iterable)
iterable, page = (itertools.islice(i1, page_size, None), list(itertools.islice(i2, page_size)))
if len(page) == 0:
break
yield page
def parseArgs(argv):
args = []
path = None
nextpath = False
for a in argv[1:]:
if nextpath:
path = a
nextpath = False
elif a == "-f":
if path != None:
raise ValueError("You can only pass one database file.")
nextpath = True
else:
args += [a]
return args, path
def printCSV(inlist):
writer = csv.writer(sys.stdout)
writer.writerows(inlist)
def unescapeText(text):
return html.parser.HTMLParser().unescape(text).replace("'","''")