cComments.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import time
  2. import json
  3. import codecs
  4. from socket import timeout, error as SocketError
  5. from ssl import SSLError
  6. from urllib2 import URLError
  7. from httplib import HTTPException
  8. from instagram_private_api import ClientError
  9. import cLogger
  10. def get_live(api, broadcast, record, first_comment_created_at=0):
  11. comments_collected = comments
  12. before_count = len(comments_collected)
  13. try:
  14. comments_res = api.broadcast_comments(
  15. broadcast['id'], last_comment_ts=first_comment_created_at)
  16. comments = comments_res.get('comments', [])
  17. first_comment_created_at = (
  18. comments[0]['created_at_utc'] if comments else int(time.time() - 5))
  19. after_count = len(comments_collected)
  20. if after_count > before_count:
  21. # save intermediately to avoid losing comments due to unexpected errors
  22. broadcast = broadcast.copy()
  23. broadcast.pop('segments', None) # save space
  24. broadcast['comments'] = comments_collected
  25. with open((record + "_" + str(broadcast['id']) + "_" + str(int(t)) + '.json'), 'w') as outfile:
  26. json.dump(broadcast, outfile, indent=2)
  27. comments = comments_collected
  28. except (SSLError, timeout, URLError, HTTPException, SocketError) as e:
  29. cLogger.log("Error", "RED")
  30. # Probably transient network error, ignore and continue
  31. # self.logger.warning('Comment collection error: %s' % e)
  32. except ClientError as e:
  33. if e.code == 500:
  34. cLogger.log("500" "RED")
  35. # self.logger.warning('Comment collection ClientError: %d %s' % (e.code, e.error_response))
  36. elif e.code == 400 and not e.msg: # 400 error fail but no error message
  37. cLogger.log("400 no msg" "RED")
  38. # self.logger.warning('Comment collection ClientError: %d %s' % (e.code, e.error_response))
  39. else:
  40. raise e
  41. finally:
  42. time.sleep(4)
  43. return first_comment_created_at