twitter.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. # SPDX-License-Identifier: AGPL-3.0-or-later
  2. # lint: pylint
  3. """Twitter (microblogging platform)"""
  4. from json import loads
  5. from urllib.parse import urlencode
  6. from datetime import datetime
  7. about = {
  8. "website": 'https://twitter.com',
  9. "wikidata_id": None,
  10. "official_api_documentation": 'https://developer.twitter.com/en/docs/twitter-api',
  11. "use_official_api": True,
  12. "require_api_key": False,
  13. "results": 'JSON',
  14. }
  15. categories = ['social media']
  16. url = "https://api.twitter.com"
  17. search_url = (
  18. "{url}/2/search/adaptive.json?{query}&tweet_mode=extended&query_source=typed_query&pc=1&spelling_corrections=1"
  19. )
  20. def request(query, params):
  21. params['url'] = search_url.format(url=url, query=urlencode({'q': query}))
  22. params['headers'] = {
  23. # https://github.com/zedeus/nitter/blob/5f31e86e0e8578377fa7d5aeb9631bbb2d35ef1e/src/consts.nim#L5
  24. 'Authorization': (
  25. "Bearer AAAAAAAAAAAAAAAAAAAAAPYXBAAAAAAACLXUNDekMxqa8h%2F40K4moUkGsoc%3DTYfbDKb"
  26. "T3jJPCEVnMYqilB28NHfOPqkca3qaAxGfsyKCs0wRbw"
  27. )
  28. }
  29. return params
  30. def response(resp):
  31. results = []
  32. json_res = loads(resp.text)['globalObjects']
  33. for tweet in json_res['tweets'].values():
  34. text = tweet['full_text']
  35. display = tweet['display_text_range']
  36. img_src = tweet.get('extended_entities', {}).get('media', [{}])[0].get('media_url_https')
  37. if img_src:
  38. img_src += "?name=thumb"
  39. results.append(
  40. {
  41. 'url': 'https://twitter.com/i/web/status/' + tweet['id_str'],
  42. 'title': (text[:40] + '...') if len(text) > 40 else text,
  43. 'content': text[display[0] : display[1]],
  44. 'img_src': img_src,
  45. 'publishedDate': datetime.strptime(tweet['created_at'], '%a %b %d %H:%M:%S %z %Y'),
  46. }
  47. )
  48. for user in json_res['users'].values():
  49. results.append(
  50. {'title': user['name'], 'content': user['description'], 'url': 'https://twitter.com/' + user['screen_name']}
  51. )
  52. return results