PageRenderTime 52ms CodeModel.GetById 28ms RepoModel.GetById 0ms app.codeStats 0ms

/helpers/utils/ff-monitor.py

https://github.com/champ1/twittomatic
Python | 118 lines | 91 code | 27 blank | 0 comment | 25 complexity | 5b199ec75d1553a0b19a5891f2762c6d MD5 | raw file
  1. import sys
  2. import time
  3. from twitter.const import *
  4. from twitter.modules.follower import fetch_followers
  5. def fetch_all(user_id=None, screen_name=None, cursor=-1):
  6. total_followers = []
  7. while True:
  8. msg, followers, sleep_time, cursor = fetch_followers(
  9. screen_name=screen_name,
  10. user_id=user_id,
  11. cursor=cursor,
  12. )
  13. for follower in followers:
  14. total_followers.insert(0, follower)
  15. if sleep_time > 0:
  16. print >> sys.stderr, "Sleeping %s seconds before next request" % sleep_time
  17. time.sleep(sleep_time)
  18. if msg == MSG_OK:
  19. break
  20. print >> sys.stderr, "Downloaded %d followers" % len(total_followers)
  21. return total_followers
  22. def get_new_additions(total_followers, user_id=None, screen_name=None, cursor=-1):
  23. num_request = 0
  24. new_additions = []
  25. print "Checking for new additions"
  26. while True:
  27. num_request += 1
  28. print "Cursor: %d Request: %d" % (num_request, cursor)
  29. msg, followers, sleep_time, cursor = fetch_followers(
  30. screen_name=screen_name,
  31. user_id=user_id,
  32. cursor=cursor,
  33. max_requests=1
  34. )
  35. followers = map(int, followers)
  36. if msg == MSG_OK:
  37. must_return = False
  38. for follower in followers:
  39. if follower not in total_followers:
  40. new_additions.insert(0, follower)
  41. else:
  42. must_return = True
  43. if must_return:
  44. print "%d newly added users discovered in %d requests" % (len(new_additions), num_request)
  45. return new_additions
  46. if sleep_time > 0:
  47. print "Sleeping %s seconds before next request" % sleep_time
  48. time.sleep(sleep_time)
  49. def fetch(filename, user_id=None, screen_name=None, cursor=-1):
  50. with open(filename, 'a') as outputfile:
  51. for follower in fetch_all(user_id=user_id, screen_name=screen_name, cursor=cursor):
  52. outputfile.write("%s\n" % follower)
  53. def monitor(filename, statsfile, user_id=None, screen_name=None, cursor=-1):
  54. followers = set()
  55. with open(filename, 'r') as inputfile:
  56. for line in inputfile:
  57. followers.add(int(line.strip()))
  58. print "Loaded %d followers from file %s" % (len(followers), filename)
  59. with open(filename, 'a') as outputfile:
  60. with open(statsfile, 'a') as stats:
  61. while True:
  62. new_additions = get_new_additions(followers, user_id=user_id, screen_name=screen_name, cursor=cursor)
  63. for follower in new_additions:
  64. outputfile.write("%s\n" % follower)
  65. followers.add(follower)
  66. stats.write("%d\t%d\n" % (time.time(), len(followers)))
  67. outputfile.flush()
  68. stats.flush()
  69. time.sleep(5 * 60) # Every five minute
  70. if __name__ == "__main__":
  71. from optparse import OptionParser
  72. parser = OptionParser()
  73. parser.add_option("-s", "--screen-name", dest="screen_name",
  74. help="screen name of the target user")
  75. parser.add_option("-u", "--user-id", dest="user_id", type="int",
  76. help="user ID of the target user")
  77. parser.add_option("-f", "--file", dest="file",
  78. help="File where to store the followers")
  79. parser.add_option("-t", "--stats", dest="stats",
  80. help="File where to store the statistics")
  81. (options, args) = parser.parse_args()
  82. if options.file and not options.stats:
  83. fetch(options.file,
  84. user_id=options.user_id,
  85. screen_name=options.screen_name)
  86. elif options.file and options.stats:
  87. monitor(options.file, options.stats,
  88. user_id=options.user_id,
  89. screen_name=options.screen_name)
  90. else:
  91. parser.print_help()