Store followers/followings as user IDs rather than handles. Store handles in separate table.
This commit is contained in:
parent
c10f7d53f9
commit
701afaef45
3 changed files with 44 additions and 28 deletions
|
@ -77,12 +77,12 @@ class dbObject:
|
||||||
def getFollowers(db):
|
def getFollowers(db):
|
||||||
db.executeQuery("SELECT id FROM followers WHERE `until` = 0;")
|
db.executeQuery("SELECT id FROM followers WHERE `until` = 0;")
|
||||||
for i in db.getAll():
|
for i in db.getAll():
|
||||||
yield i[0]
|
yield int(i[0])
|
||||||
|
|
||||||
def getFollowing(db):
|
def getFollowing(db):
|
||||||
db.executeQuery("SELECT id FROM following WHERE `until` = 0;")
|
db.executeQuery("SELECT id FROM following WHERE `until` = 0;")
|
||||||
for i in db.getAll():
|
for i in db.getAll():
|
||||||
yield i[0]
|
yield int(i[0])
|
||||||
|
|
||||||
|
|
||||||
def getLatestMessage(db):
|
def getLatestMessage(db):
|
||||||
|
@ -99,6 +99,15 @@ class dbObject:
|
||||||
except:
|
except:
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
def matchNameID(db, name, id):
|
||||||
|
db.executeQuery("SELECT COUNT(*) FROM names WHERE id = '%s' AND name = '%s' AND until = 0;" % (id, name))
|
||||||
|
try:
|
||||||
|
if int(db.getNext()[0]) != 0:
|
||||||
|
return True
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
return False
|
||||||
|
|
||||||
def dbHelper():
|
def dbHelper():
|
||||||
if setuptools.dbtype() == SQLITE:
|
if setuptools.dbtype() == SQLITE:
|
||||||
return dbObject(dbtype=SQLITE, path=setuptools.dbpath())
|
return dbObject(dbtype=SQLITE, path=setuptools.dbpath())
|
||||||
|
|
47
filler.py
47
filler.py
|
@ -48,13 +48,11 @@ def getMessages(db=dbtools.dbHelper(), two=twitools.twObject()):
|
||||||
|
|
||||||
db.commit()
|
db.commit()
|
||||||
|
|
||||||
return mcount, savepoint or 0, db.getLatestMessage()
|
return mcount, savepoint or 0, db.getLatestMessage
|
||||||
|
|
||||||
def getFollowers(db=dbtools.dbHelper(), two=twitools.twObject(), firstrun=False):
|
def getFollowers(db=dbtools.dbHelper(), two=twitools.twObject(), firstrun=False):
|
||||||
""" Get handles of users we are following. :param db: Database object to be used. :param two: Twitter object to be used. :param firstrun: Must be set to True if the function is executed for the first time. Defaults to False. :return: Returns the number of gained and lost followings in a list (gained, lost). """
|
|
||||||
|
|
||||||
current = list(db.getFollowers())
|
current = list(db.getFollowers())
|
||||||
new = list(twitools.getNamesByIDs(twitools.getFollowerIDs()))
|
new = list(twitools.getFollowerIDs())
|
||||||
gained = 0
|
gained = 0
|
||||||
lost = 0
|
lost = 0
|
||||||
|
|
||||||
|
@ -64,31 +62,23 @@ def getFollowers(db=dbtools.dbHelper(), two=twitools.twObject(), firstrun=False)
|
||||||
|
|
||||||
for follower in new:
|
for follower in new:
|
||||||
if follower not in current:
|
if follower not in current:
|
||||||
db.executeQuery("INSERT INTO followers VALUES('%s', %i, 0)" % (follower, int(time.time())))
|
db.executeQuery("INSERT INTO followers VALUES('%s', %i, 0)" % (str(follower), int(time.time())))
|
||||||
print("New follower: %s" % follower)
|
db.commit()
|
||||||
|
print("New follower: %s" % (twitools.getNameByID(follower) if not firstrun else follower))
|
||||||
gained += 1
|
gained += 1
|
||||||
|
|
||||||
for follower in current:
|
for follower in current:
|
||||||
if follower not in new:
|
if follower not in new:
|
||||||
db.executeQuery("UPDATE followers SET `until` = %i WHERE `id` = '%s' AND `until` = 0" % (int(time.time()), follower))
|
db.executeQuery("UPDATE followers SET `until` = %i WHERE `id` = '%s' AND `until` = 0" % (int(time.time()), str(follower)))
|
||||||
print("Lost follower: %s" % follower)
|
|
||||||
lost += 1
|
|
||||||
|
|
||||||
db.commit()
|
db.commit()
|
||||||
|
print("Lost follower: %s" % twitools.getNameByID(follower))
|
||||||
|
lost += 1
|
||||||
|
|
||||||
return gained, lost
|
return gained, lost
|
||||||
|
|
||||||
def getFollowing(db=dbtools.dbHelper(), two=twitools.twObject(), firstrun=False):
|
def getFollowing(db=dbtools.dbHelper(), two=twitools.twObject(), firstrun=False):
|
||||||
"""
|
|
||||||
Get handles of users we are following.
|
|
||||||
|
|
||||||
:param db: Database object to be used.
|
|
||||||
:param two: Twitter object to be used.
|
|
||||||
:param firstrun: Must be set to True if the function is executed for the first time. Defaults to False.
|
|
||||||
:return: Returns the number of gained and lost followings in a list (gained, lost).
|
|
||||||
"""
|
|
||||||
current = list(db.getFollowing())
|
current = list(db.getFollowing())
|
||||||
new = list(twitools.getNamesByIDs(twitools.getFollowingIDs()))
|
new = list(twitools.getFollowingIDs())
|
||||||
gained = 0
|
gained = 0
|
||||||
lost = 0
|
lost = 0
|
||||||
|
|
||||||
|
@ -98,20 +88,29 @@ def getFollowing(db=dbtools.dbHelper(), two=twitools.twObject(), firstrun=False)
|
||||||
|
|
||||||
for following in new:
|
for following in new:
|
||||||
if following not in current:
|
if following not in current:
|
||||||
db.executeQuery("INSERT INTO following VALUES('%s', %i, 0)" % (following, int(time.time())))
|
db.executeQuery("INSERT INTO following VALUES('%s', %i, 0)" % (str(following), int(time.time())))
|
||||||
print("You started following: %s" % following)
|
db.commit()
|
||||||
|
print("You started following: %s" % (str(following) if not firstrun else following))
|
||||||
gained += 1
|
gained += 1
|
||||||
|
|
||||||
for following in current:
|
for following in current:
|
||||||
if following not in new:
|
if following not in new:
|
||||||
db.executeQuery("UPDATE following SET `until` = %i WHERE `id` = '%s' AND `until` = 0" % (int(time.time()), following))
|
db.executeQuery("UPDATE following SET `until` = %i WHERE `id` = '%s' AND `until` = 0" % (int(time.time()), str(following)))
|
||||||
print("You no longer follow: %s" % following)
|
db.commit()
|
||||||
|
print("You no longer follow: %s" % twitools.getNameByID(following))
|
||||||
lost += 1
|
lost += 1
|
||||||
|
|
||||||
db.commit()
|
db.commit()
|
||||||
|
|
||||||
return gained, lost
|
return gained, lost
|
||||||
|
|
||||||
|
def getNames(db = dbtools.dbHelper(), two = twitools.twObject()):
|
||||||
|
for user in twitools.getNamesByIDs(list(set(list(db.getFollowing()) + list(db.getFollowers())))):
|
||||||
|
if not db.matchNameID(user["name"], user["id"]):
|
||||||
|
db.executeQuery("UPDATE names SET `until` = %i WHERE `id` = '%s' AND `name` = '%s';" % (int(time.time()), str(user["id"]), str(user["name"])))
|
||||||
|
db.executeQuery("INSERT INTO names VALUES('%s', '%s', %i, 0)" % (str(user["id"]), str(user["name"]), int(time.time())))
|
||||||
|
db.commit()
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
parser.add_argument("-f", "--first", help="first run: ignore empty databases", action="store_true")
|
parser.add_argument("-f", "--first", help="first run: ignore empty databases", action="store_true")
|
||||||
|
@ -125,3 +124,5 @@ if __name__ == "__main__":
|
||||||
print("Gained %i followers, lost %i." % (gained, lost))
|
print("Gained %i followers, lost %i." % (gained, lost))
|
||||||
gained, lost = getFollowing(db, firstrun=args.first)
|
gained, lost = getFollowing(db, firstrun=args.first)
|
||||||
print("Started following %i, stopped following %i." % (gained, lost))
|
print("Started following %i, stopped following %i." % (gained, lost))
|
||||||
|
getNames(db)
|
||||||
|
print("Stored handles of following/followers.")
|
||||||
|
|
|
@ -26,13 +26,19 @@ class twObject:
|
||||||
|
|
||||||
def getFollowerIDs(two=twObject()):
|
def getFollowerIDs(two=twObject()):
|
||||||
''' Returns 5,000 follower IDs at most '''
|
''' Returns 5,000 follower IDs at most '''
|
||||||
return two.api.followers_ids(screen_name=twObject().whoami())
|
for id in list(two.api.followers_ids(screen_name=twObject().whoami())):
|
||||||
|
yield int(id)
|
||||||
|
|
||||||
def getFollowingIDs(two=twObject()):
|
def getFollowingIDs(two=twObject()):
|
||||||
return two.api.friends_ids(screen_name=twObject().whoami())
|
for id in list(two.api.friends_ids(screen_name=twObject().whoami())):
|
||||||
|
yield int(id)
|
||||||
|
|
||||||
|
def getNameByID(uid, two=twObject()):
|
||||||
|
return two.api.get_user(uid).screen_name
|
||||||
|
|
||||||
def getNamesByIDs(fids=getFollowerIDs(), two=twObject()):
|
def getNamesByIDs(fids=getFollowerIDs(), two=twObject()):
|
||||||
for page in setuptools.paginate(fids, 100):
|
for page in setuptools.paginate(fids, 100):
|
||||||
followers = two.api.lookup_users(user_ids=page)
|
followers = two.api.lookup_users(user_ids=page)
|
||||||
for follower in followers:
|
for follower in followers:
|
||||||
yield follower.screen_name
|
yield {"id": follower.id, "name": follower.screen_name}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue