server.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #!/usr/bin/env python3
  2. import bottle
  3. import api
  4. import config
  5. import html_renderer
  6. @bottle.get('/<username>')
  7. def user(username):
  8. html = ''
  9. html += html_renderer.render_top()
  10. user = api.get_user(username)
  11. html += html_renderer.render_user_header(user)
  12. tweets = api.get_user_tweets(username, bottle.request.params.get('cursor'))
  13. html += html_renderer.render_instructions(tweets['data']['user']['result']['timeline']['timeline'])
  14. return html
  15. @bottle.get('/<username>/favorites')
  16. def favorites(username):
  17. html = ''
  18. html += html_renderer.render_top()
  19. user = api.get_user(username)
  20. html += html_renderer.render_user_header(user)
  21. tweets = api.get_likes(username, bottle.request.params.get('cursor'))
  22. html += html_renderer.render_instructions(tweets['data']['user']['result']['timeline']['timeline'])
  23. return html
  24. @bottle.get('/<username>/status/<tweet_id>')
  25. def tweet(username, tweet_id):
  26. html = ''
  27. html += '<title>yitter</title>'
  28. html += html_renderer.render_top()
  29. tweet = api.get_tweet(tweet_id, username, bottle.request.params.get('cursor'))
  30. html += html_renderer.render_instructions(tweet['data']['threaded_conversation_with_injections'])
  31. return html
  32. @bottle.get('/static/<file>')
  33. def static(file):
  34. return bottle.static_file(file, 'public')
  35. @bottle.get('/search')
  36. def search():
  37. html = ''
  38. query = bottle.request.params.get('q')
  39. html += f'<title>"{query}" search - yitter</title>'
  40. html += html_renderer.render_top()
  41. search = api.search(query, bottle.request.params.get('cursor'))
  42. if search['version'] == 'graphql':
  43. html += html_renderer.render_instructions(search['search']['data']['search_by_raw_query']['search_timeline']['timeline'], {'q': query})
  44. else:
  45. for tweet in search['globalObjects']['tweets'].values():
  46. html += html_renderer.render_tweet(tweet, search['search']['globalObjects']['users'][tweet['user_id_str']])
  47. return html
  48. @bottle.get('/')
  49. def landing():
  50. html = ''
  51. html += '<title>yitter</title>'
  52. html += '<div style="height:100%">'
  53. html += '<div style="position:relative;top:50%;transform:translateY(-50%)">'
  54. html += html_renderer.render_top()
  55. return html
  56. @bottle.get('/<username>/status/<tweet_id>/favoriters')
  57. def favoriters(username, tweet_id):
  58. html = ''
  59. html += '<title>yitter</title>'
  60. html += html_renderer.render_top()
  61. likers = api.get_favoriters(tweet_id, bottle.request.params.get('cursor'))
  62. html += html_renderer.render_instructions(likers['data']['favoriters_timeline']['timeline'])
  63. return html
  64. @bottle.get('/<username>/status/<tweet_id>/retweeters')
  65. def retweeters(username, tweet_id):
  66. html = ''
  67. html += '<title>yitter</title>'
  68. html += html_renderer.render_top()
  69. retweeters = api.get_retweeters(tweet_id, bottle.request.params.get('cursor'))
  70. html += html_renderer.render_instructions(retweeters['data']['retweeters_timeline']['timeline'])
  71. return html
  72. @bottle.get('/<username>/followers')
  73. def followers(username):
  74. html = ''
  75. html += '<title>yitter</title>'
  76. html += html_renderer.render_top()
  77. followers = api.get_followers(api.get_user_id(username), bottle.request.params.get('cursor'))
  78. html += html_renderer.render_instructions(followers['data']['user']['result']['timeline']['timeline'])
  79. return html
  80. @bottle.get('/<username>/following')
  81. def followers(username):
  82. html = ''
  83. html += '<title>yitter</title>'
  84. html += html_renderer.render_top()
  85. following = api.get_following(api.get_user_id(username), bottle.request.params.get('cursor'))
  86. html += html_renderer.render_instructions(following['data']['user']['result']['timeline']['timeline'])
  87. return html
  88. bottle.run(server=config.SERVER, port=config.BIND_PORT, host=config.BIND_ADDRESS)