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("'","''")