Add Client.get_home_timeline and AsyncClient.get_home_timeline
authorHarmon <Harmon758@gmail.com>
Fri, 20 May 2022 17:19:13 +0000 (12:19 -0500)
committerHarmon <Harmon758@gmail.com>
Fri, 20 May 2022 17:19:13 +0000 (12:19 -0500)
Resolves #1900

cassettes/test_asyncclient_get_home_timeline.yaml [new file with mode: 0644]
cassettes/test_client_get_home_timeline.yaml [new file with mode: 0644]
docs/asyncclient.rst
docs/client.rst
tests/test_asyncclient.py
tests/test_client.py
tweepy/asynchronous/client.py
tweepy/client.py

diff --git a/cassettes/test_asyncclient_get_home_timeline.yaml b/cassettes/test_asyncclient_get_home_timeline.yaml
new file mode 100644 (file)
index 0000000..74b62a8
--- /dev/null
@@ -0,0 +1,298 @@
+interactions:
+- request:
+    body: null
+    headers:
+      User-Agent:
+      - Python/3.10.0 aiohttp/3.7.4.post0 Tweepy/4.9.0
+    method: GET
+    uri: https://api.twitter.com/2/users/1072250532645998596/timelines/reverse_chronological
+  response:
+    body:
+      string: "{\"data\":[{\"id\":\"1527697210250518528\",\"text\":\"One of my favorite\
+        \ launches I got to help out with! https://t.co/Qe2H75hg59\"},{\"id\":\"1527695653995827201\"\
+        ,\"text\":\"did anyone say reverse chron? \\uD83D\\uDC40\\n\\nthis is the\
+        \ \\\"latest tweets \u2728\\\" timeline, and we have generous rate limits!\
+        \ https://t.co/Kx0Km4PuAu\"},{\"id\":\"1527691528071565312\",\"text\":\"Today\
+        \ we are launching the reverse-chronological home timeline on the Twitter\
+        \ API v2. https://t.co/eLFKqdCou1\"},{\"id\":\"1527691246449225728\",\"text\"\
+        :\"The time(line) has finally come! The reverse-chronological home timeline\
+        \ is now available on the Twitter API v2, allowing you to retrieve the most\
+        \ recent Tweets and Retweets from people you follow.\\n\\nCheck out the forum\
+        \ post for more information\\uD83D\\uDC47\\nhttps://t.co/JaaguOjtvl\"},{\"\
+        id\":\"1527627349214175232\",\"text\":\"@andypiper @anne_engineer @MichaelMadcat\
+        \ OooOooo that\u2019s a new one for the \u2018want\u2019 list\"},{\"id\":\"\
+        1527624375721242624\",\"text\":\"RT @SociologyOxford: We're looking forward\
+        \ to welcoming Twitter's @suhemparack for our departmental seminar on Monday:\\\
+        n\\n \\uD83D\\uDCCD'Academic Researc\u2026\"},{\"id\":\"1527621781464313858\"\
+        ,\"text\":\"Taking a rest day to get the \\uD83E\\uDDE0 back to full strength.\
+        \ \\n\\nNo better place to do it\u2026 https://t.co/GkQAgzhZQ1\"},{\"id\"\
+        :\"1527621734878302208\",\"text\":\"@LeBraat @VeldaKiara Woohoo! Happy birthday\
+        \ @VeldaKiara \\uD83C\\uDF89\"},{\"id\":\"1527620214933757952\",\"text\":\"\
+        Happy birthday to the champion of Kenya dev communities \u2014 @VeldaKiara\
+        \ https://t.co/12Z6ZSDzjH\"},{\"id\":\"1527424172518940673\",\"text\":\"Big\
+        \ fan of how quick and easy Glitch has made it to spin up beautiful web apps.\
+        \ Congrats to the team on joining @fastly \\uD83D\\uDC4F\\uD83C\\uDFFB https://t.co/IzD8JC6QS3\"\
+        },{\"id\":\"1527366064903860233\",\"text\":\"RT @woodworker: I've got mail.\
+        \ From @solderparty. It seems they do Keyboards for microcontroller. And the\
+        \ microcontroller boards to play wi\u2026\"},{\"id\":\"1527354550394376202\"\
+        ,\"text\":\"Tweet entity extractor that makes it easy for developers to find\
+        \ entities in Tweets based on the new Tweet Annotations in the #TwitterAPI\
+        \ v2 https://t.co/pgYscamXLQ https://t.co/YUVG9MxDIX\"},{\"id\":\"1527354524142227456\"\
+        ,\"text\":\"Tweet image analyzer is a demo app for researchers that want to\
+        \ learn how to extract text from images in Tweets https://t.co/110V9VhzmL\
+        \ https://t.co/YdgcS6Nmen\"},{\"id\":\"1527354493020491779\",\"text\":\"Wordle\
+        \ stats that gives you the stats for Wordle players based on their Tweets\
+        \ https://t.co/HrfgPmohNb https://t.co/cgD2DLLjyk\"},{\"id\":\"1527354476083892240\"\
+        ,\"text\":\"Twitter bookmarks search that lets you search and organize your\
+        \ Twitter bookmarks by @i_am_daniele  https://t.co/a1GLIDb0uX https://t.co/tBm9rze3Xd\"\
+        },{\"id\":\"1527354451937284117\",\"text\":\"Bookmarks to Notion, an app that\
+        \ lets you import your bookmarks to a Notion page https://t.co/O0wnVHbYKJ\
+        \ https://t.co/X9axhd4vfd\"},{\"id\":\"1527354400842272770\",\"text\":\"We\
+        \ have many demo apps on @glitch that showcase  the various functionality\
+        \ of the #TwitterAPI v2. Below are 5 of my favorite ones, please try those\
+        \ out and let us know how you like those \\uD83E\\uDDF5\"},{\"id\":\"1527327677878657028\"\
+        ,\"text\":\"our best demos run on @glitch and we\u2019re just happy to see\
+        \ you part of something amazing. https://t.co/RdphUiXdcf\"},{\"id\":\"1527326965673254915\"\
+        ,\"text\":\"I introduced my friend to Dorfromantik today and I may have to\
+        \ fight her over the #SteamDeck\"},{\"id\":\"1527319569164926977\",\"text\"\
+        :\"Eyyyy @jamie_maguire1!!\\n\\uD83D\\uDE4C\\uD83C\\uDFFC\\uD83D\\uDE4C\\\
+        uD83C\\uDFFC\\n\\n https://t.co/eHstglloHl\"},{\"id\":\"1527318645948309505\"\
+        ,\"text\":\"RT @hackingcommsci: Very excited to have Suhem joining us from\
+        \ @Twitter for #hackica22. Can't wait to see the cool projects using the Twitt\u2026\
+        \"},{\"id\":\"1527316287810318337\",\"text\":\"This is excellent news! https://t.co/FndZ0BDzC2\"\
+        },{\"id\":\"1527297108100775936\",\"text\":\"Congrats to the @glitch team.\
+        \ I love how easy Glitch makes it for me to deploy working sample apps and\
+        \ demos. If you\u2019re a dev advocate, partner/sales engineer or solutions\
+        \ architect - definitely try it out - it saved me so much time in building\
+        \ fun sample apps with #TwitterAPI https://t.co/1vojbJ3HvM\"},{\"id\":\"1527264809330393089\"\
+        ,\"text\":\"Milan https://t.co/Q0U9D2cTR0\"},{\"id\":\"1527107692858200064\"\
+        ,\"text\":\"If you\u2019re going to #ICA22 and attending  #hackica22, I\u2019\
+        ll be doing a session on using the Twitter API v2 for research. Hope to see\
+        \ y\u2019all there https://t.co/xx8aHixfdy\"},{\"id\":\"1527097985305153543\"\
+        ,\"text\":\"RT @GravelInstitute: For the first time ever, George Bush is right:\
+        \ George Bush did in fact launch a wholly unjustified and brutal invasion\u2026\
+        \"},{\"id\":\"1527063266278576128\",\"text\":\"\\\"si lo puedes creer, lo\
+        \ puedes crear\\\" \u2014\_@CrisGuadarramaM\"},{\"id\":\"1527048920169340929\"\
+        ,\"text\":\"RT @hackaday: Network Time Protocol on the\_ESP32 https://t.co/JAZJ0Lsvrs\"\
+        },{\"id\":\"1527047952950124544\",\"text\":\"aqui estoy https://t.co/Xrhyr1afh4\"\
+        },{\"id\":\"1526987122401366017\",\"text\":\"New favorite bot alert \\uD83D\\\
+        uDEA8\\n\\nWell done, @LuisMayoV https://t.co/jOPNbHZQn8\"},{\"id\":\"1526986177483526144\"\
+        ,\"text\":\"\\uD83C\\uDDEE\\uD83C\\uDDF9\"},{\"id\":\"1526972563053654016\"\
+        ,\"text\":\"About a year ago we launched our course on getting started with\
+        \ academic research using the #TwitterAPI v2. Since then it has been used\
+        \ by professors in various courses.\\n\\nIf you\u2019re looking to use Twitter\
+        \ data in your class, check it out &amp; share with others https://t.co/IWpMNIqzUn\"\
+        },{\"id\":\"1526972060089479169\",\"text\":\"RT @YEmreTapan: People in our\
+        \ community frequently ask about how to study Twitter networks. Previously,\
+        \ we learned how to retrieve Twitter\u2026\"},{\"id\":\"1526957996747722753\"\
+        ,\"text\":\"RT @TwitterSpaces: Twitter Spaces are real live audio convos you\
+        \ can join from your couch. or the dog park. or the bathtub. wherever you\
+        \ ar\u2026\"},{\"id\":\"1526932423467999232\",\"text\":\"@i_am_daniele Cheese\u2026\
+        \ just cheese\"},{\"id\":\"1526931381921644546\",\"text\":\"This \\uD83D\\\
+        uDC47\\uD83C\\uDFFC\\nJust because people aren\u2019t actively posting doesn\u2019\
+        t mean they aren\u2019t finding value and viewing ads on Twitter. https://t.co/K4Sk6vh39F\"\
+        },{\"id\":\"1526862555309817856\",\"text\":\"The \\uD83C\\uDF2F game has officially\
+        \ changed @grimesalittle https://t.co/Vlvfk9a8eK\"},{\"id\":\"1526854021725790208\"\
+        ,\"text\":\"Next: planning my \u201Ccarry\u201D for #EMFCamp (time to fill\
+        \ out a wiki page over there), and I have a number of draft blog posts to\
+        \ actually finish, as well\u2026\"},{\"id\":\"1526853766322040833\",\"text\"\
+        :\"Although I\u2019m out for a bit\u2026 I\u2019m just gonna leave this here\
+        \ - a side project I started to collate amazing resources and uses around\
+        \ the current Twitter API. ~20 stars already. Discussions are open (on GH).\
+        \ I might not immediately deal with PRs while away. https://t.co/Rdp0Xo2qmh\"\
+        },{\"id\":\"1526837269520191488\",\"text\":\"\\uD83C\\uDDEB\\uD83C\\uDDF7\"\
+        },{\"id\":\"1526804934234189826\",\"text\":\"I can always rely on @biglesp\
+        \ to write exactly the article I\u2019m interested in! #BASIC https://t.co/BNRWbX9iTE\"\
+        },{\"id\":\"1526783143222599681\",\"text\":\"Oh wow it\u2019s early \\uD83E\\\
+        uDD71\"},{\"id\":\"1526723830361731072\",\"text\":\"@i_am_daniele Taking that\
+        \ bra off right,puttting your feet up and that ice cold glass of wine!! That\
+        \ feels good!\"},{\"id\":\"1526695419643695104\",\"text\":\"seeing a new animal\
+        \ you've never seen in real life for the first time\\n\\ndiscovering how weird\
+        \ seasonal allergies are (my allergies are terrible but I like my own attitude\
+        \ towards them)\\n\\nbeing alone without feeling lonely\\n\\nfinishing a good\
+        \ book\"},{\"id\":\"1526695418616111106\",\"text\":\"when you have zero cell\
+        \ reception and you don't care because it's your day off\\n\\nthe sweet spot:\
+        \ 72-75\xBA F / 22-23\xBA C\\n\\nfirst snow of the season\\n\\nsaying or receiving\
+        \ thank you\\n\\ngetting complimented for something you didn't know you looked\
+        \ like/could do\"},{\"id\":\"1526695417626259456\",\"text\":\"being able to\
+        \ figure out how to play your favorite songs on the piano\\n\\nbeing unsure\
+        \ if you helped someone or made them feel worse, and then they tell you or\
+        \ you realize you did a very good job\\n\\nplay your favorite album in a loop\
+        \ for a whole day\\n\\nsinging with a friend\\n\\nsunny days\"},{\"id\":\"\
+        1526695416439242752\",\"text\":\"things that feel good (in no particular order):\\\
+        n\\nfalling in love\\n\\npetting your favorite pet\\n\\neating chocolate\\\
+        n\\nrunning so fast it feels like you're flying\\n\\nreceiving a kiss\\n\\\
+        n(add yours and let's turn twitter into the the most wholesome place for a\
+        \ day \\uD83D\\uDC47)\"},{\"id\":\"1526669053863116802\",\"text\":\"Taking\
+        \ time away from work until June - I may not respond to related queries before\
+        \ then.\"},{\"id\":\"1526632421537353728\",\"text\":\"RT @charmcli: \\uD83D\\\
+        uDEA8\\uD83D\\uDC25 Calling all devs! We\u2019re excited to host an open source\
+        \ dev tool discovery session with @TwitterDev this Thursday at 9am PD\u2026\
+        \"},{\"id\":\"1526594589091667968\",\"text\":\"RT @michaelrowe01: Hey Twitterverse\
+        \ - I am looking for an macOS #shortcut to automatically upload a pdf to DropBox\
+        \ without having Dropbox i\u2026\"},{\"id\":\"1526569493392068608\",\"text\"\
+        :\"Just received my first Birdfeeder bookmark digest and I love it. @tehwey\
+        \ I like the dark theme!\\n\\nYou can try out Birdfeeder for free at https://t.co/j24mEMp1HY\
+        \ https://t.co/iiAizy0sib\"},{\"id\":\"1526558333804630019\",\"text\":\"In\
+        \ our podcast this week, we talked robots, Open Source trackballs, and LEGO,\
+        \ with a special guest! (I'll be taking a couple of weeks off, so you won't\
+        \ hear me for a few) https://t.co/LOFO5CHbuC\"},{\"id\":\"1526545643573022722\"\
+        ,\"text\":\"Into the home stretch with work, ahead of time off and travels\
+        \ until June! \\uD83D\\uDE0E https://t.co/dl5G2TNjaK\"},{\"id\":\"1526266844172140544\"\
+        ,\"text\":\"RT @newonbotwiki: New tutorial was added to Botwiki! https://t.co/Gv57Q51LYz\
+        \ Via @JessicaGarson\"},{\"id\":\"1526210732194414599\",\"text\":\"RT @circuitpyshow:\
+        \ New episode!  Liz Clark aka @BlitzCityDIY joins the show and shares her\
+        \ maker journey and we talk all things MIDI.  http\u2026\"},{\"id\":\"1526209896601030656\"\
+        ,\"text\":\"Did you know that the new Twitter API has a process for sharing\
+        \ technical proposals for changes? You can learn more via our open evolution\
+        \ project on GitHub https://t.co/0HNKhdnWyl\"},{\"id\":\"1526184823257194496\"\
+        ,\"text\":\"RT @lexaloffle: \\uD83C\\uDF93 PICO-8 Education Edition: \\uD83C\\\
+        uDF1FOUT NOW! \\uD83C\\uDF1F\\n\\nhttps://t.co/3gtO0iWS1S // you'll need a\
+        \ keyboard!\\n\\nA web-based version of #pico8\u2026\"},{\"id\":\"1526170917465903106\"\
+        ,\"text\":\"Lookin good @TwitterDublin. Actually, lookin great https://t.co/DoyDxhzHj0\"\
+        },{\"id\":\"1526170139854503936\",\"text\":\"Can confirm\u2026 pizza and beer\
+        \ with @IgorBrigadir as your Dublin guide is the play\"},{\"id\":\"1526154571474771969\"\
+        ,\"text\":\"My #SteamDeck review: great for folks who like fiddling (with\
+        \ *everything*). Eventually, you'll remember you bought it to play some games...\"\
+        },{\"id\":\"1526153184481357830\",\"text\":\"RT @GamesAtWork_Biz: check out\
+        \ e368: Chaos Agent Without Pants - with special guest @theRab &amp; stories\
+        \ @BostonDynamics Spot, drones, open so\u2026\"},{\"id\":\"1525866559910060033\"\
+        ,\"text\":\"TIL there's a standard for stickers. @juliaferraioli did *you*\
+        \ know about this? (if so, why am I just learning?) https://t.co/zTsFT9Oj2c\"\
+        },{\"id\":\"1525856157021179905\",\"text\":\"Oh, hi there! \\uD83D\\uDC26\
+        \ https://t.co/aGhUyHiSSP\"},{\"id\":\"1525623334938939392\",\"text\":\"\\\
+        uD83C\\uDDFA\\uD83C\\uDDE6 \\uD83C\\uDFB6 \\uD83C\\uDF8A\"},{\"id\":\"1525537549971759107\"\
+        ,\"text\":\"The volume of gingers in Dublin\u2026 I feel seen and accepted\
+        \ \\uD83D\\uDC68\\uD83C\\uDFFB\u200D\\uD83E\\uDDB0, even if I consider myself\
+        \ a recovering ginger\"},{\"id\":\"1525453767143038976\",\"text\":\"Love it!\
+        \ \\uD83C\\uDF08 https://t.co/9Z02Dv0zcc\"},{\"id\":\"1525402844131639296\"\
+        ,\"text\":\"Happy weekend! Off to @HRP_palaces Hampton Court today for the\
+        \ Artisan Fair. What are you up to?\"},{\"id\":\"1525395319013376000\",\"\
+        text\":\"RT @_andrewlyons: Today, we opened up @spacesdashboard - your discovery\
+        \ guide to Social Audio on @twitterspaces as guests with @i_am_daniel\u2026\
+        \"},{\"id\":\"1525252806889857024\",\"text\":\"to all recruiters: sorry\"\
+        },{\"id\":\"1525250854684700673\",\"text\":\"I actually still love working\
+        \ at twitter. why?\\n\\n\u2022 tweeps are kind and resilient\\n\u2022 I still\
+        \ get to help people on twitter\\n\u2022 people (even people without a twitter\
+        \ account) root for us and our success\\n\\nplease never take all of the above\
+        \ for granted \\uD83D\\uDC99\"},{\"id\":\"1525232366909792256\",\"text\":\"\
+        developers, how would you change the profile page?\\n\\nasking for a friend\
+        \ https://t.co/X5u3GbE5ED\"},{\"id\":\"1525202101311258626\",\"text\":\"RT\
+        \ @TwitterEng: Achieving large-scale real-time data analytics on Twitter's\
+        \ high volume of data is uniquely challenging. In our latest blog\u2026\"\
+        },{\"id\":\"1525185359805444096\",\"text\":\"This is a https://t.co/LYswtRnxfc\
+        \ appreciation Tweet! As a Developer Advocate, it has made easy for me to\
+        \ share code, tutorials and content with other developers in such an easy\
+        \ and effective manner! Thanks @ThePracticalDev\"},{\"id\":\"1525170076491579393\"\
+        ,\"text\":\"RT @TweetDeck: Have you tried the new TweetDeck Preview? We\u2019\
+        d love to hear from you!\\n\\nUse #TweetDeckFeedback to tell us what you think.\"\
+        },{\"id\":\"1525160409459609600\",\"text\":\"RT @arwaib: BREAKING: #Israeli\
+        \ forces target Palestinian journalist #ShireenAbuAqla\u2019s funeral procession,\
+        \ using batons against participants\u2026\"},{\"id\":\"1525144460702539776\"\
+        ,\"text\":\"For those that follow me for Twitter API / data related content\
+        \ or updates, which version of the #TwitterAPI version do you use and why?\"\
+        },{\"id\":\"1525143990202355712\",\"text\":\"so tired \\uD83D\\uDE10\"},{\"\
+        id\":\"1525138926176022536\",\"text\":\"Spaces leaderboard: https://t.co/hsMnfwBjnL\"\
+        },{\"id\":\"1525137455934062593\",\"text\":\"My @spacesdashboard page: https://t.co/wVf6dayv2x\"\
+        },{\"id\":\"1525135946894696450\",\"text\":\"Today @_andrewlyons launched\
+        \ @spacesdashboard. A way to discover and explore Spaces and their creators\
+        \ with a comprehensive view of the Spacesverse https://t.co/l5styAPwJ7\"},{\"\
+        id\":\"1525129446784741376\",\"text\":\"starting now! https://t.co/0KmwdrRJiE\"\
+        },{\"id\":\"1525129258607181824\",\"text\":\"https://t.co/B4u7HCXE5n\"},{\"\
+        id\":\"1525091195453681664\",\"text\":\"Happy kung-fu kenny day to those who\
+        \ celebrate \\uD83E\\uDD73\\n\\n#nowplaying \\n\\nhttps://t.co/rQtKm5HddN\"\
+        },{\"id\":\"1525079426299568128\",\"text\":\"RT @codebar: Hey all, @trans_code\
+        \ is going to @europython this summer, Tuesday 12th July 2022 \u2728\\n\\\
+        nTrans*Code is a free full-day workshop &amp; h\u2026\"},{\"id\":\"1525067978227822592\"\
+        ,\"text\":\"Well now \\uD83D\\uDE43 must be nearly time for a holiday.\"},{\"\
+        id\":\"1524934140046368768\",\"text\":\"Send me all the recommendations?\"\
+        },{\"id\":\"1524933942742163456\",\"text\":\"I\u2019ll be hanging out in the\
+        \ european time zones over the next month, starting tomorrow.\\n\\ndublin\\\
+        nlondon\\nbudapest\\nlake como\\nst moritz\\nzermatt\\navignon\\nparis\"},{\"\
+        id\":\"1524933282898399232\",\"text\":\"I think I\u2019m quite ready for another\
+        \ adventure https://t.co/JaJcgMTAOh\"},{\"id\":\"1524904820469125146\",\"\
+        text\":\"Truly enjoyed seeing @kayvz and @boo in action. They drove serious\
+        \ work, but did so in a fun way. Very sorry to see them go.\"},{\"id\":\"\
+        1524882463075491848\",\"text\":\"Right, @Xbox Cloud Gaming all set up on #SteamDeck,\
+        \ Steam back catalogue downloaded \\uD83D\\uDC7E that's all for today. Time\
+        \ for bed.\"},{\"id\":\"1524871241559072791\",\"text\":\"listening to a Space\
+        \ from @TwitterDev and testing the API... \\uD83D\\uDC4B\"},{\"id\":\"1524865904890331157\"\
+        ,\"text\":\"Happening now -&gt; https://t.co/PQvTty3tCk\"},{\"id\":\"1524862908781543434\"\
+        ,\"text\":\"RT @ZxSpectROM: Tomorrow at 18:00GMT the very last 7 Ukrainian\
+        \ Fundraiser RC2014 kits will go in sale at z80kits. \\n\\nThese are the last\
+        \ I ha\u2026\"},{\"id\":\"1524862798823669766\",\"text\":\"RT @europython:\
+        \ Hey hey! @trans_code is coming to @europython this summer! 12th July 2022!\
+        \ \u2728\\n\\nTrans*Code is a free full day workshop &amp; hack\u2026\"},{\"\
+        id\":\"1524833175024848898\",\"text\":\"RT @jamie_maguire1: A great video\
+        \ tutorial by @jessicagarson that shows you how to create a Twitter Bot\\\
+        n\\nAn accompanying blog with low leve\u2026\"},{\"id\":\"1524796546306478083\"\
+        ,\"text\":\"Today marks the launch of Devs in the Details, a technical video\
+        \ series made for developers by developers building with the Twitter API.\_\
+        \_\\uD83D\\uDE80\\n\\nIn this premiere episode, @jessicagarson walks us through\
+        \ how she built @FactualCat #WelcomeToOurTechTalk\\n\u2B07\uFE0F\\n\\nhttps://t.co/nGa8JTQVBJ\"\
+        },{\"id\":\"1524755167522000904\",\"text\":\"RT @josecastillo: Hey you! Are\
+        \ you in the New York area? Interested in hardware-oriented stuff? Drop by\
+        \ the workshop of @the_prepared in Br\u2026\"},{\"id\":\"1524746260862754816\"\
+        ,\"text\":\"I\u2019m back \\uD83C\\uDF99\\n\\nand I have a guest who\u2019\
+        ll bring a nice surprise!\\n\\ntune in tomorrow: \\n\\nhttps://t.co/B4u7HCG2GN\"\
+        },{\"id\":\"1524731295917658115\",\"text\":\"So... the #SteamDeck arrived!\
+        \ And also, excitingly, so did this (and some other goodies, from @yongxiangxu251\
+        \ \\uD83D\\uDE4F\\uD83C\\uDFFB)! Unsure which one will provide me the most\
+        \ entertainment, but I'm working now, so I shall investigate later! #esp32c3\
+        \ #micropython https://t.co/ZArQow0DTj\"},{\"id\":\"1524728475172708357\"\
+        ,\"text\":\"So, @SparkMailApp on iOS/iPadOS/macOS is pretty nice, might even\
+        \ claw me back away from using webmail as my default UI...\"}],\"meta\":{\"\
+        result_count\":100,\"newest_id\":\"1527697210250518528\",\"oldest_id\":\"\
+        1524728475172708357\",\"next_token\":\"7140dibdnow9c7btw421e38xjm4lc3brk8gkh08s1v3nb\"\
+        }}"
+    headers:
+      api-version:
+      - '2.43'
+      cache-control:
+      - no-cache, no-store, max-age=0
+      content-disposition:
+      - attachment; filename=json.json
+      content-encoding:
+      - gzip
+      content-length:
+      - '7938'
+      content-type:
+      - application/json; charset=utf-8
+      date:
+      - Fri, 20 May 2022 17:08:12 UTC
+      server:
+      - tsa_b
+      set-cookie:
+      - guest_id_marketing=v1%3A165306649094830530; Max-Age=63072000; Expires=Sun,
+        19 May 2024 17:08:12 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None
+      - guest_id_ads=v1%3A165306649094830530; Max-Age=63072000; Expires=Sun, 19 May
+        2024 17:08:12 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None
+      - personalization_id="v1_mTIYnXBw1r4y/O580FElgQ=="; Max-Age=63072000; Expires=Sun,
+        19 May 2024 17:08:12 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None
+      - guest_id=v1%3A165306649094830530; Max-Age=63072000; Expires=Sun, 19 May 2024
+        17:08:12 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None
+      strict-transport-security:
+      - max-age=631138519
+      x-access-level:
+      - read-write-directmessages
+      x-connection-hash:
+      - f8aa633bb58410d6fc6a0557cfad831f3af4d8957d67fc057b95bebf4f2d90fc
+      x-content-type-options:
+      - nosniff
+      x-frame-options:
+      - SAMEORIGIN
+      x-rate-limit-limit:
+      - '180'
+      x-rate-limit-remaining:
+      - '179'
+      x-rate-limit-reset:
+      - '1653067390'
+      x-response-time:
+      - '1060'
+      x-xss-protection:
+      - '0'
+    status:
+      code: 200
+      message: OK
+    url: https://api.twitter.com/2/users/1072250532645998596/timelines/reverse_chronological
+version: 1
diff --git a/cassettes/test_client_get_home_timeline.yaml b/cassettes/test_client_get_home_timeline.yaml
new file mode 100644 (file)
index 0000000..a348394
--- /dev/null
@@ -0,0 +1,207 @@
+interactions:
+- request:
+    body: null
+    headers:
+      Accept:
+      - '*/*'
+      Accept-Encoding:
+      - gzip, deflate
+      Connection:
+      - keep-alive
+      User-Agent:
+      - Python/3.10.0 Requests/2.27.1 Tweepy/4.9.0
+    method: GET
+    uri: https://api.twitter.com/2/users/1072250532645998596/timelines/reverse_chronological
+  response:
+    body:
+      string: !!binary |
+        H4sIAAAAAAAAAIxcy3LcWHL9lUsqYiR1UBQehRe9EN9k6UVKpJ6WQ3ELuFUAiQKq8ahicWIcvfPK
+        4Y0XnohxxIQXE174Axxe9qf0D/gXfDIvqgigNLZ7piWyCrjImzcf52Qm+vfbkazk9t7f/n47ibb3
+        tk3H8tzAs0zDcgzH9B3L397ZrtRdhS8vMiXysZguxVjO8yKplEhlnYWxKsVQTPJKVLmIVToTeV2J
+        RVLFWyKuqlm59/x5tRvmz98p69xz4okTbP9hp/NEx3XsIHB8y7MM8+GJURIJmS1zPLiUS1GouSpK
+        JcK4yLMX4lt97NvH+PNoYHzLvmVVnJQC/69iJb5tp7JSJURaKFWV4rc//fu3bVElU5UmmdrBqpFY
+        KBHLuRITlakir0tRSNpSMk2qsif5qzvj1XRwWR/Ufcnxp294Jm3AtB4kv84jCIwnyGKlpSSbsGjN
+        Lp7xLvI0nyShTEWcT9VaPpFnfOk1lFipQhxcDsXc2u3KpF6fvvo5Osprc0Mma+AOBoFlOV77/K5j
+        /YQn9Iin2Hspxkkm03QpQjx9S1z/P6WDjrN8IeRcJqkcpX9FXCg5TfMFbXuZ12QbhaqKBOvzxdMc
+        p1OoUGUVbuRDokN5r5oTGxf5VMxUPsP6dP84p9V26aCPYhXespHRQuO8qHElLYcfsS40nmT4cSqr
+        JM9aVuJ9yzoafCnlpL64qeZpT4OWZ0N95sD0HMtuneo+JFzOkhn2iB8z9V1lEyiEfn2ThLFU6RsZ
+        hbISF3mO/+eQT1a//fJHbE1kaiHIkElGEvu3X/5lITP6FiZXVn0JBraH08NJWvj5QYL312L/Kg8T
+        OpnlxR0Wi/bEJ/WYrCzPb0nZ+Gwhi4gUvlApTpY+bI7mcSn2yzpW05ksJHRIwuR1ISKFD6opzgKH
+        XSrcIgs61Td5BjveI6W33O3o+PFBKCNcFuK8SiWL8Ldf/tLfgen5JuzQNm3faVuhZCklzh4nRl4C
+        QSdKnyU/4wR/Hp8YYkQS4stxnUKoqoCyq3hXkDBvczFSbGuzVIaKropykUCbf+k6ydntu4PJffz1
+        Xd9JIJ498D3fNizLaIm3/1odFhJHuP9RpZF8lUBR4lOex3m+Jc7lbLYUo6SoYhK8fQlLfoQ/T/1+
+        dLMMmFJg04EGTsuaeqtVOasAZjSdwW4p1L5S2VLicObkoNM6S6oEsfa3X/658+jOhk3rq/v16vj+
+        5rwrxcCCNVsI6cHAcD37QYrDBCYj+XExnPrnOoHWyROVLJfiLE2qMOZYMcWJQ8UkZzlLMlHPcAay
+        rhKcDyxtJLCdclcc5dkEgbRc7adSckqmdJMnGR38/liWFUJOyy9PH5R3etjdzvD+2H955L67srvb
+        sV3XcAeBYfuuYdl210EWeR4t8uJWFXti+JgiPHLTFMFqV5xSVNkv8zRSBZn8clcMK1i8mnLeWJIZ
+        vVLLUQ4PKnU8ScIiD/OsKhCAVLErDqAbDmDdL0RzD7YNm0TsTzZ8wnYGjmPYAXybjKLlExTyBLwv
+        qZYCH8E3Kw4TkuS+xZlD73weJBHsQaU5ghA/DCE80reSbeBcmmA6kqWKVpGZgo9+yEGW5RUHRr6Y
+        vnzUBAcdtrv6n02+lKGcfn79rvv5lw8fz4I3d8fDz5tbhKUNLAsm57j9LSZTOUFORNJZ3kNlCQVG
+        xJGcbIf3VuhwEvPmaPsUI2mbKT7O2ELxS6MiQWvrRMELt7ffdQrT+Bh8jO+nr3u7iCbhlfsWcW9j
+        F3BYwzIGgel5wcMuPiHeIh+VFRs4yTdJ5nguJ7h49QVtpLmSTIH20j6NpPihkOfFeHI5zeO3o+7n
+        4eTYOn79+mZ5uymk5xq+7SPTD4y2qnUaHiEhTGVxWwqtUy1wSg8meZsPydXzYiKz5J4TbSE27x8h
+        1iXf5fR7hMsUttWVUJpnr4fHI6P+3P28OpwGxb2yP0ebkjtmYAOdDEzTa8Wi9RNxyG9zslKCamwd
+        XeGT6SwvKi3vqH2XbO4TM7K0jjgXxiL7eD768upl9/PPgbyLo8F8/AMxDcOHLXuW57UU/KkBjlNg
+        07X5lnS6+xMdL1nYEtYa4twFm8ZcFgmBzDGwIAkoU3J2RN1NF9wVh3DwBWNHpw+5gSHKHdiVopWr
+        AnkjzvEToSE6SmhI4Cm3BNDIW0hZaXKrmsseEuyp09stMpXnISO6jme0YSOrmHM1dgqQXGftnWog
+        DRQDWW9qXBVzVqMkoTRwozBLmyiBIStGwXIq7/F3D8++j2bxh+RzFI77grmB6yBnWQ7c0XkQbAh3
+        R/CN6hCuRSoCuMwY9xznBUUFhI6EEARlV5JziBNb6qPjwDmJIS4MPQfk1cdwRdnqGOiyJ4IJhhKY
+        SDiQxWsZ7MkS/4j9GzlN1HeEoDoplLm19e0BdZ4MjlrZ7eivfk4Iqwvvz8tqAsh7nvZl8d2BEwyA
+        XAJwtG7miwGZoFlCC2WY7ImPqqCEEsJwWDG89ysCgOt8XDdQe3/l9hS9HvFCobRgi0cye0xxuEn9
+        SsP3MM9TMSvyGxXCJetyxW54lc3MZ7oWTMs0ID2AUJuTaM4GGRWyKGI9UlWffZ1m0Vfj8Pj+yOqu
+        agWeaWBRw/OcwG4lmz4GWbslThcJH1AZaiDvaGOcdaLlrK8xpZqlOVI5sATtrwQyQ/BjZyd7YofA
+        emOyc+0CGq3JaJ6DBoBnkvGDXT4vZYrF13QBTwAGqXUapjCMA0I+e4a7kc/xCwAS+TakIcd+Rj+U
+        OLuIBCtzMa1pN+BjlPFGdZJGjPzhmm0ZiYJ3Qks3Kc7zm9FL+3z+pqdVd+AbgKsAKrbht5LfG7C9
+        npG+Mz4Ex1Z4/d7ormEaoKEWcL9lGMBpLZ9t6WqSs9Hk4tHw6MCyWKUSoma8mZYN7ogh7gAJGCng
+        M80eSlWWjJKzvvGtCWgHUOyKc0CmdVzCemCndFPRyxJ3d748T+7G0bK7JSPwAt+xDcd0kBh6iPOs
+        wOGkw6wEDKsrtSdOG5Y3TgoqQtBJEbHeEWcKyVaJw7qMye4LCkJ7nU+p6IFTHRPA0ZUDbHcR58TT
+        64xibDJOVMTqGhU1MbYkm0vSxobfGS6iJ+is73iu2Q7q37bLBG4gZrWKYJhhoUi4zgey+LZNXOPX
+        P+8fFUl5VstIFgVid89ejAEAiGG6gT0wAivYDEiSKKR4C2IPPxLXpIvLIq+AndMGEf3655OrS7sH
+        PV8efH1pvC7nRdl/HtEoxD6QY2Toh+dJcBeBRAWP7eb3Il4WphzHg85CbuB7JiEnk8hEG4a8BVpe
+        59sRuAOcFznsIXYf+BSvPyFiwR6pnLT/uk7KN3KZf+w++ubi8u3o/Ou7zO8/2gWwRAzHz2Z7D+uc
+        cHxy8vDzadC7HUzOhSnargPxW4HvYMQ4QCxxekJOqAKwqtFFTPRD/FFywQaUu+KgViFE4VsOFnJF
+        61du03KuPka5SrKQc0FG0YkY4kgp8kYsBsCI3DCGj+YFo/IV+tHPL7mM044Fq+IF/BMLrB2ZqpN0
+        O+O8MJUloE/I1Z8mMv4O4e5vgLQIKvEO8oq5Q5dEfpq9eTv8+f5DtqFGwwXCC2BRsN+u5X45mRbq
+        Ws5kticudRkKgmgdai5OiEP9XCNpwTNlCdbM2m84SlnV0XK9kUxbP7LFZaHmpIp0ucOnQ7wGGmvu
+        WpfImhv7Hu0GjhcErjfwPMBSpxeGmpuuZjJU5d764fp3hpNw6xR4EA+QdZTk2Es2zzWkDqUm6RoO
+        LBtrocjZxLIon1A+u11/MJJVXNWjXUQnxXVDXkf+QGjbGlj2wIXoQbeg1mEVR7GC2VENh5FkyL/2
+        VzJt3wwsYDE4v9sDEp1aXwddvaQFRyqUZF1NVRH6QMT8I/wFgHxOKZeKiGSFUa5K/dVUyUwXBtZX
+        E+Gmi+YyrRVH4XmiuMwpIyYBjdp78PbV4OrWncd2cNrdke9ajoO8EvgmwnRnR6pVVbJOxUROFftZ
+        Ph4nYaILt7HMJjCf/UmBuFoSqajSXkb7mM7Ht4H01avekxE8LCoKeYHRqYG9xV97RF0zRoiA1r/9
+        8qcQwR9p8181Pjx5c3oE1xNPOLUxmkYw1MFnkdwmmn6tgHWhnu40CJwRqBRZPR0RDhqLqJBjHE1K
+        xgX1axIXVjVvj8BQGePekmqZ6YZhISF7LnIcmDqIcMsbDlLwnXoSM3KYsmAktxQjXSTUH7OZTfIs
+        k+SHXJiGFTEmeEYYI4nUCuNC9FWkrMhtUuovrJgMhUv4CzsZdgkbI2/L66ZSFNZFocvca3iyK/7e
+        MnhFXJnCK6PlrjhOyrBmWKOdFYAlE09gUWfnTwm2TpmxZDnVUaYqSiTjxIhcmmPf5XuoKU7ItBdy
+        uUmvjM+59fM07qkQNBxRBRk8MAe+/8NUdNhKRV7vdmOAxA/nNv3At9w2O6OAIlNIAphDghJrHCUT
+        AOEZF6c5vao7HDah3ZgcskpCSK8PB+ROUY1YERzaEo8OD66GR909Hb59/2n0OUiuT7pCeb5tDmAV
+        loNY6bcaShcxwPyCC8V/BByXxaoQyZTYM3vLWDZYlo1UbQPQ/tWw1VS0mfOPCknuqXHdzqyudJLl
+        aDqmClg9YxPhi5OQeFQaiQllNnIGhBG1RY0YfIvL0xLWmUdbXbFwWgMzcAc2fjCNFngAstXgmMp9
+        EG4Kw8CTqQKacXguKUEjwjdZYPzQjXjAqZSZIxgi+S6tRolpoZIiooJRSXUL6uuoYpI0KeUJ4kP3
+        E5xbkVBfaFST33D5ARfli4zwPRByRCFjocul4KJP6ZkjLXtKPRKyZnZZRQ2niaAP0yVdpQOC3iWp
+        hos/P1AP8JVr4h+jZZELgiqUoTgG3asCfkwQjppQM64Z0cnQBQB1oLwh7WWVM5LqcamPkaoJOGLd
+        cQQb48JmOcsRMj3rmef8+l/iVDwXlvXMsvHzkRab1FtSUaap+Ghl0nelXNJ+mKuEKpk3tpTd0uPo
+        ghVSA+6YpQk1aeASY6aQq4oKC51EJDVXfrjqA83gQtL+cyRymFmU/0BTnmshAwWdYm1zFnSEulBS
+        F7rC1KAULnBrm17BZGxmUq7KzbNEZvnDodZZSQskY619lc4gFwlPZ01kmzoLZAh84ES3y6ZFy+iS
+        029FJ0W35xplkAk3FUtmTFLMqdbBNnGTj+jhP5BSpqOaIgsuh3pmTU4gcqXoXPk4EiLpkwYPN0Ul
+        /qLOqNyHcPYDLcIbA2Acr93f4aNpysS8MRbuCZ6e5VwYSMI6pT5bEaniKTfZxnAkejiuoRoF70K1
+        Q8hqI/iUvlRSW0ZMZArpgD4rap22S5ychNUlq1DCfkjxAGcxTsno+PK10Ulxm5QlffZERuwIRbmq
+        KcL4q7rAWTQpDMG5ae+sWrmsRDrUpiWnVUvO0kZlT3u6cwOwGN+1TROZpN0RaWIqoQtKZhqUMoGs
+        sypJxcs6oyStS3qUEpEqZrku/yHbSPIRYPOCYtJIjakpTMa023s+AVMQes927E6vnNA0sFUxDdNk
+        r8v81ruxHHHUnBfVEiI1L7fEp6YW2i66kXqow0bpXOMErhJVVEJbhdrluqLBhreC8sd0HYGS6xin
+        wYXMSgRyKi6PN8AQObEfGKAyANpubzNT3Z8u8oUyzD1xrtbcRM9UkCqxbKuJTCJPZXhxJR6VcV5U
+        Yc0FQFlXOXXWQwZo9SzNJXnfLBpz5bXIZ4f53TqCI9TScvTxCB9v9MRcxw2oNxqAifluG4QyYtfG
+        2ZR3OYYeIhPBnKNWfwI6nKiyagAm1/aSalfsVypeYJvDVf2bXBxXU6BRVKLNvjSshyptJGxrbdo/
+        2J0idXcZvTWYnryZmedfup8nyUFyvzTKZNTbnwNcagMlga8DYrXwkSaTszwKyUv5kJFKbpkVVjKl
+        2F3ko7wC5b0gy7nSlkOdr9sRlF/qEPn65OxiZxWtypkiYiAmNRSyJZ4MH+uqWbVquiMREPUhqIFn
+        MZXYoUhBYXTBWS+m0sF05b9jtXja3ejri9ML5+h8VB/1NooMMrAdjxrq4KbtjTahgodIqI9P1VYW
+        mPwZu8AjI86L5O2Enjj0c0mtbLn7VssPjZOuVFHqnFnXb29kj+PAxf0Bdb7NgdEpFpFPACblGTRM
+        hIUKVMhtMO6CFLgA40AQ1A58qC/pVaXP5o73zjFff7kXHxMp9l+S/4byDJA+7xUaLMBH2zIDSDIA
+        JO2FmaQI66SaLalfpMVQs6TMI2xYvE7uxVFKZitv8YxD8Lv7o6RaHg+/MFnX0050JyuNCyHMYLic
+        XeAaRG21XM07kV0JXfjk3PRmeAwqwvva8EwLlDSgyphhG24bHRwnGiUx0uDs9tBifqi/ElGVxJ7A
+        inRLlITjoK7COOOxInwLzidT/b3msuULsfJL3fPlgZ45NEzuwjFUzZva+ZqcEUdKqvO61zo1zt++
+        iqPs07LbQ3FNf+BbNogvHUngds8jBSVJYYWp2mvx78AWl8Oji2e+OInqkBvo+Cmhv9uXmacXH67F
+        24tPW50PKdp0JLMn1YWRfLoyr8Tz55yUcSiZorKuuG3mDzhGHdBoxTPdPqZI3UyGPJolYe5vnJnp
+        Ifx7A6QCw+5g39cc1zUCWeeWeoTktSsOGra900R/MQG46oW943x5fBffn98YGw807cCH81O7oN2C
+        wfmFOQHfKfHtWXJ/L3XJmvofOscNJ3lxCKYko6Qgis8QR0uFCEbku5nmIyTXey6e6JkDqoOBCrWb
+        FMtWF4+m2RIFp9I74qCep7fEknOdFcZJFHEGf8Ii/UQ0acnO8RMo98kcYLvRTXNGBZIHly7IA0ZU
+        YqiaoRiGmwyAqFBT7u7u9kW2YXcD30SQBK3sNRDoloPqEwLi98Pkfq+pclJWUrbr74mjWOalOJhQ
+        HeFTk1wvZVaVyNwseif0I/nF6r0creqjFNUQF/YPAUXy7HiZSeCBUlyBteyIqNA95Qaf9I3K8V1k
+        sSAwDSqWtoss18PXurrzmFy9rHC8NHjGvg6AgPhTIg3f1Gkix6CEMsnThMH6T1DeTzp+6JopZb8X
+        gMbUJUYyi5eERYa6PsNRAAfyopeI7q/L0+vg4sYKe+I6ULVnWKbpBUG7QXoR74g40RK3csmR5fbG
+        Gc7iD8vz5OrqsruwayGTA6z4AUw9sH5UKTk9aFVN3FYIOGz/4h90Fwb2dAZB4JmeAy173RIgxTpO
+        i4JoidLldO0kXMjS1IKZPTfQQiKzCBYP+3P99nzVb7/840PF49DYob5URtxsSP5KJS/kjmWp0jHP
+        6K3rAPrpXcEHVH6DG9oGlOJ1wg2DsHYQNPyuloOvhnU8N+7D3vENDIsytm260HE7NutxOYItIGRb
+        4mLMgHP//P3l95lMucJ9DmuHfYsjBJKqafyvKhwH4FslgtKpTIpd8YnSFvF7cuOa6lEvumLYAdw1
+        QHDDDg2j563foelCLdIlFLYneNaXYRt5EFSP9fZLrrlHsow5lsNLdfFgDfd1gMMOaJwTfnvA9Xiq
+        kTUcq2yq9qV26aad2y49bXiqRcPIru8jIMMBWmiHcLuudBSAGlh7D45WFMv+7QYiOQCTZ3RnBIcP
+        FVk4NhZikL1qixMAWJW84bovKG399su/8ej1TFeEbmlIjcwT6CRJwagrfcmwWY/nP5vh8aY6n6/J
+        pr60+fgJm2vzy4plyDUvhfnnQIxPAZ1zHfBrzWFJ+WUdEhjRtQGen9FlMaBjxfppajOISXMNgCeF
+        zLrOFAQ9ndmWTSw28GjeumWuD1N6O7qGxiUYbrQwztGJrcjHVK+lajnrTZYP9Gs10NJtZjq1fTY6
+        cU6Oe3Ig4MFaTZPitdWDNE3CP8kme8j2caKYlAFWTtSzEkBM94WeMf7mlhtP6FWUIh76GQjycTKJ
+        WwFJd+cIoieg2robQUMcEx7uaQhOM4dPBf4NezV9x3YCn5D5wAj63RyeDuxyjy/lonqf3Y1DGnAo
+        KOExEONxui1xQDccr/QuDtZTGE1/kutM6zFK3bfQrcMQaHtnjf61xdBoJ2Xbh7Zie/ISQbisef5J
+        r8gTs+Ox4lYSTYZlquBCbga4sY9AfkkTi4R6IWBPC3A3z6XZJo8yS//osDXCMuDsVLbkScOC+v+d
+        uU5GO5ca7rzQRYhIeym7lSzWXT1GlR9K7uc2N54Cd66GrbnOVhNCklUz1phkt7s9iV0D5wUq4+LU
+        +sFRFguZjPbE4fuTg1fDt2d74tGwLKRC7ofaKaRVZHgEX1JF/baEG4/gKZIG4QHf4gTMOzsY1Qc/
+        p5Ir9WPQv0IThlCXSXaazvRIVtwumUiQoaopqyUzQkab5gYzcw1ERkR3r52u9LQGzcfpYh2/arAi
+        wW1S81zb/KrAtDIRCjOziAydwEsCs2hB9Y3eefNVpFk3FZeZnSFy9sW1A+rMWbYDrNvCG+DrFVTU
+        CksnptG7l6ZCgc5dsHGnjcubXjDCHxI9p6a9ro/F5ZtsvDi8yV73V/QGgIH2wKBysd1B3BvZjuJZ
+        b93Fx7GLPDm37vrrOgFyDv4NXLCI/is0nVz7MMvQfyJYjFjoIfpVitUueTdLiT+uWuC6pgy6QQMu
+        FQ0nNJUTKq4XKlZAQHPFHd3V2elbdZWss6PUKavlweXipdfbkQVW6XpIo4AxbTPjBiIZLYBvr5hg
+        vJououL9y+RkYy0K6IZn+qbfzujdPtig9s6PPp843bqDAzJoBoTSXN9022NYGkvd1tnk2RhEXjWV
+        bT0vR35ABClUqRrxO1GtFplN4eMRNkB0h/ayQW2Ld9WrqXMeRW97wngBvcwSBA6k2ai1IgCPZKEL
+        k0giO4BByL3ld/qCMsF6WGxf1UU+A0fjXgO+KevplIaXrmvFBVLTwoG+rJGO4DoWv/kFEa9ptZ+O
+        mtWkLu7RmyXP+EUtms2I81nDl+KN0AE8FHi+ZdG/Thv78xAQEZnWZKctpnrcAPGZW4ycWHVOj8GB
+        8MRuQKUWqjkwqEjo+l67dHtFAGCqmpqNYkCO7YJo8ezgi/4yNnTsDSyA505D52F+jrAHt5sAm5r5
+        f1YozzmQmPdEBh9GYjMasZ8izoE8re23yqdAj83bWBFzkW9ZmmcRdbRGdSRnCOz4hHAV5M2/UWie
+        Uufi/lt2r+jNLHwt58kkozsQtJNyYyeWbwHI2r2JkaFOSE2P+GdCs4Lb503JWidqGTFz78/2vZQv
+        w8mb64OLuPc0Y+Bb0H5gUtRt45CC7EhlN/mSWla6v7p/izB2z7Fkf5Tn3E7ike5deoNuSXx6Tg0+
+        PfGka5zUCSXmW+rLeVSTe/Q8octYvDVdO4W59yzEh/e7tkFEkapXLe/hTrPY/0z19aM0ryNxJqer
+        pkSpW87wlYeqyI7gH/X7VQBIEtCspvGeRUbF/A7c9U44JRLBx2rMpSgs7+oxPvp9pKK+qEhWAxO5
+        wvAsL2h13ym9q6zxY6kDa3f4mNodHKOVHsRh4nY53N3dbXeRDnvPo3LXwA8MG/DX8bpRTj+PHPTZ
+        7ybV33Tt4fLd/Lpa2tXRbX9FKzBoXtkZ2PhfN1R9vbuaAea9v3hD1E87AnEg098zjLM313ran441
+        pcK+Jz7cFlKjnNMauUwmMA3x/sgyzAGIERM7okBsGTQnTIvd+wZ9pd92g1WV+k1SWppXpfpqP0iR
+        2F4AQyFC4rk9DvAQNnWQhaVu9YNs87LgX4+yW73ouvV/hlfxo/AKw9sUHqfnOWCtsG74fVf47oA9
+        SExT0ZuDQ+cPVXt6T+VGl+EnXIZ/eBFDz7g1/WtO/jSGtMJ2hzm3Uw8yJpBTwEfObTyVxACB8GAK
+        9L8hthe4DjmmO/B8w7f78KV5LyVejWESqICRr9+9OlaVTLiV0yqL612VunnJpKX32tdo2fltNf/N
+        kvbmoHd//fOvf37ITT6/KT1sDhWIB3qlbqVuOOz01beQVC2taQcFj1ORAksa/cMzK7F/qusCR1Dy
+        o0/8sqm6zi/q4hp7uca9oO7/8Q///Z//tAESsjPpv7x+9/HwZU+dDsiF51g0Nx4YPc+7ATKhZhnc
+        JddGTHxGHDRlnEal1ED5Qo1iOIx8ARraGiOC6RXRAl88o4IoU/uyqsfjF9yhJL3SCmtzxWFRIfU7
+        9IQcpVc43BhvBM4D4zbI+5yBb/bSbhNnW52EgIl+expO12yBuZo0XTRjPDQgVNbFDOlRdywr6nrT
+        Ppu4s7cJvzQWPLPO3vaEtIElnQCUwPHN9ms0VzmF1+7rL9BdQX3XLX7bEYw439EdbQhGxfAy52zG
+        RvSEG09U99a5l3oMCTEhHdmB2yd3CH6TuxrJtQ2TOq99Pt0SH/SYiCZQegwoZcpH/sB0fTVrQCdX
+        wHEyGobRyXX4eLouSCHas4hDYvcpj8dTPpnw6/34A2HskSpnthXa4hG/xtlEuo4ivx4U7/KFcXx9
+        01OkBWQP0m558Pd2urmCkvavaEL2DXz6YMZpN7m4ep5cygh/6Wa6druqWvLx7jRDfVzVClPJrJMN
+        5mHqQRPdhRrRK6xUD5yS+49lDQ/8MOQ+w9/tbE8V/Yccfr8NW8cX37kMtr1nGsbOdqYW2P/3/+W/
+        8EDvw7au+MEeCQd+r3JQBVziAaxGySiCooPQG1ULIE5l+3c300Ea2qPi1p/cxoZfmnM7G23/4Q//
+        AwAA//8DACezXFdnQgAA
+    headers:
+      api-version:
+      - '2.43'
+      cache-control:
+      - no-cache, no-store, max-age=0
+      content-disposition:
+      - attachment; filename=json.json
+      content-encoding:
+      - gzip
+      content-length:
+      - '7938'
+      content-type:
+      - application/json; charset=utf-8
+      date:
+      - Fri, 20 May 2022 17:08:16 UTC
+      server:
+      - tsa_b
+      set-cookie:
+      - guest_id_marketing=v1%3A165306649566838768; Max-Age=63072000; Expires=Sun,
+        19 May 2024 17:08:16 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None
+      - guest_id_ads=v1%3A165306649566838768; Max-Age=63072000; Expires=Sun, 19 May
+        2024 17:08:16 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None
+      - personalization_id="v1_9fPfEVO4cdJJonsdLLpHvg=="; Max-Age=63072000; Expires=Sun,
+        19 May 2024 17:08:16 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None
+      - guest_id=v1%3A165306649566838768; Max-Age=63072000; Expires=Sun, 19 May 2024
+        17:08:16 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None
+      strict-transport-security:
+      - max-age=631138519
+      x-access-level:
+      - read-write-directmessages
+      x-connection-hash:
+      - 756c638396125314e9c11a66a7e13af6ff25e84d0ddd8c8b7d83125b8a729700
+      x-content-type-options:
+      - nosniff
+      x-frame-options:
+      - SAMEORIGIN
+      x-rate-limit-limit:
+      - '180'
+      x-rate-limit-remaining:
+      - '178'
+      x-rate-limit-reset:
+      - '1653067390'
+      x-response-time:
+      - '1036'
+      x-xss-protection:
+      - '0'
+    status:
+      code: 200
+      message: OK
+version: 1
index efd139c02df605de65f825c9abfc780ac1de5412..7d37f93897c1ed8e67c9a3587fea4ef6210e66e0 100644 (file)
@@ -68,6 +68,8 @@
     +--------------------------------------------------------------+---------------------------------------------+
     | `GET /2/users/:id/mentions`_                                 | :meth:`AsyncClient.get_users_mentions`      |
     +--------------------------------------------------------------+---------------------------------------------+
+    | `GET /2/users/:id/timelines/reverse_chronological`_          | :meth:`AsyncClient.get_home_timeline`       |
+    +--------------------------------------------------------------+---------------------------------------------+
     | `GET /2/users/:id/tweets`_                                   | :meth:`AsyncClient.get_users_tweets`        |
     +--------------------------------------------------------------+---------------------------------------------+
     | .. centered:: |Tweet counts|_                                                                              |
 .. _GET /2/tweets/search/recent: https://developer.twitter.com/en/docs/twitter-api/tweets/search/api-reference/get-tweets-search-recent
 .. |Timelines| replace:: *Timelines*
 .. _GET /2/users/:id/mentions: https://developer.twitter.com/en/docs/twitter-api/tweets/timelines/api-reference/get-users-id-mentions
+.. _GET /2/users/:id/timelines/reverse_chronological: https://developer.twitter.com/en/docs/twitter-api/tweets/timelines/api-reference/get-users-id-reverse-chronological
 .. _GET /2/users/:id/tweets: https://developer.twitter.com/en/docs/twitter-api/tweets/timelines/api-reference/get-users-id-tweets
 .. |Tweet counts| replace:: *Tweet counts*
 .. _GET /2/tweets/counts/all: https://developer.twitter.com/en/docs/twitter-api/tweets/counts/api-reference/get-tweets-counts-all
@@ -349,6 +352,8 @@ Timelines
 
 .. automethod:: AsyncClient.get_users_mentions
 
+.. automethod:: AsyncClient.get_home_timeline
+
 .. automethod:: AsyncClient.get_users_tweets
 
 Tweet counts
index 4bf7172613e23613382ae738cc1c912ea84f35b7..fd4be3bb9f8bf8a61dabc8c17d54809d00f9cd72 100644 (file)
@@ -68,6 +68,8 @@
     +--------------------------------------------------------------+----------------------------------------+
     | `GET /2/users/:id/mentions`_                                 | :meth:`Client.get_users_mentions`      |
     +--------------------------------------------------------------+----------------------------------------+
+    | `GET /2/users/:id/timelines/reverse_chronological`_          | :meth:`Client.get_home_timeline`       |
+    +--------------------------------------------------------------+----------------------------------------+
     | `GET /2/users/:id/tweets`_                                   | :meth:`Client.get_users_tweets`        |
     +--------------------------------------------------------------+----------------------------------------+
     | .. centered:: |Tweet counts|_                                                                         |
 .. _GET /2/tweets/search/recent: https://developer.twitter.com/en/docs/twitter-api/tweets/search/api-reference/get-tweets-search-recent
 .. |Timelines| replace:: *Timelines*
 .. _GET /2/users/:id/mentions: https://developer.twitter.com/en/docs/twitter-api/tweets/timelines/api-reference/get-users-id-mentions
+.. _GET /2/users/:id/timelines/reverse_chronological: https://developer.twitter.com/en/docs/twitter-api/tweets/timelines/api-reference/get-users-id-reverse-chronological
 .. _GET /2/users/:id/tweets: https://developer.twitter.com/en/docs/twitter-api/tweets/timelines/api-reference/get-users-id-tweets
 .. |Tweet counts| replace:: *Tweet counts*
 .. _GET /2/tweets/counts/all: https://developer.twitter.com/en/docs/twitter-api/tweets/counts/api-reference/get-tweets-counts-all
@@ -349,6 +352,8 @@ Timelines
 
 .. automethod:: Client.get_users_mentions
 
+.. automethod:: Client.get_home_timeline
+
 .. automethod:: Client.get_users_tweets
 
 Tweet counts
index f51d6954c13d2420b4017c8d0a484f664df545db..4aaa6c51256011c9c1fe80a323c1a68c1a66c550 100644 (file)
@@ -86,6 +86,10 @@ class TweepyAsyncClientTests(IsolatedAsyncioTestCase):
         user_id = 783214  # User ID for @Twitter
         await self.client.get_users_mentions(user_id)
 
+    @tape.use_cassette("test_asyncclient_get_home_timeline.yaml")
+    async def test_get_home_timeline(self):
+        await self.client.get_home_timeline()
+
     @tape.use_cassette("test_asyncclient_get_users_tweets.yaml")
     async def test_get_users_tweets(self):
         user_id = 783214  # User ID for @Twitter
index d238340a5cf9125fe49c7d77195f0252540504b7..054f3d5521c36f72616d9ca1de52be0df7aa84db 100644 (file)
@@ -82,6 +82,10 @@ class TweepyClientTests(unittest.TestCase):
         user_id = 783214  # User ID for @Twitter
         self.client.get_users_mentions(user_id)
 
+    @tape.use_cassette("test_client_get_home_timeline.yaml")
+    def test_get_home_timeline(self):
+        self.client.get_home_timeline()
+
     @tape.use_cassette("test_client_get_users_tweets.yaml")
     def test_get_users_tweets(self):
         user_id = 783214  # User ID for @Twitter
index 3bef8f98679123dc7f9f8fde88f8212993ee70d3..09699f0737c7f1ffe0e9efd99af464d2dd44cd5e 100644 (file)
@@ -1262,6 +1262,111 @@ class AsyncClient(AsyncBaseClient):
             ), data_type=Tweet, user_auth=user_auth
         )
 
+    async def get_home_timeline(self, *, user_auth=True, **params):
+        """get_home_timeline( \
+            *, end_time=None, exclude=None, expansions=None, \
+            max_results=None, media_fields=None, pagination_token=None, \
+            place_fields=None, poll_fields=None, since_id=None, \
+            start_time=None, tweet_fields=None, until_id=None, \
+            user_fields=None, user_auth=True \
+        )
+
+        Allows you to retrieve a collection of the most recent Tweets and
+        Retweets posted by you and users you follow. This endpoint returns up
+        to the last 3200 Tweets.
+
+        .. note::
+
+            When using OAuth 2.0 Authorization Code Flow with PKCE with
+            ``user_auth=False``, a request is made beforehand to Twitter's API
+            to determine the authenticating user's ID. This is cached and only
+            done once per :class:`Client` instance for each access token used.
+
+        Parameters
+        ----------
+        end_time : datetime.datetime | str | None
+            YYYY-MM-DDTHH:mm:ssZ (ISO 8601/RFC 3339). The new UTC timestamp
+            from which the Tweets will be provided. Timestamp is in second
+            granularity and is inclusive (for example, 12:00:01 includes the
+            first second of the minute).
+
+            Please note that this parameter does not support a millisecond
+            value.
+        exclude : list[str] | str | None
+            Comma-separated list of the types of Tweets to exclude from the
+            response.
+        expansions : list[str] | str | None
+            :ref:`expansions_parameter`
+        max_results : int | None
+            Specifies the number of Tweets to try and retrieve, up to a maximum
+            of 100 per distinct request. By default, 100 results are returned
+            if this parameter is not supplied. The minimum permitted value is
+            1. It is possible to receive less than the ``max_results`` per
+            request throughout the pagination process.
+        media_fields : list[str] | str | None
+            :ref:`media_fields_parameter`
+        pagination_token : str | None
+            This parameter is used to move forwards or backwards through
+            'pages' of results, based on the value of the ``next_token`` or
+            ``previous_token`` in the response. The value used with the
+            parameter is pulled directly from the response provided by the API,
+            and should not be modified.
+        place_fields : list[str] | str | None
+            :ref:`place_fields_parameter`
+        poll_fields : list[str] | str | None
+            :ref:`poll_fields_parameter`
+        since_id : int | str | None
+            Returns results with a Tweet ID greater than (that is, more recent
+            than) the specified 'since' Tweet ID. There are limits to the
+            number of Tweets that can be accessed through the API. If the
+            limit of Tweets has occurred since the ``since_id``, the
+            ``since_id`` will be forced to the oldest ID available. More
+            information on Twitter IDs is `here`_.
+        start_time : datetime.datetime | str | None
+            YYYY-MM-DDTHH:mm:ssZ (ISO 8601/RFC 3339). The oldest UTC timestamp
+            from which the Tweets will be provided. Timestamp is in second
+            granularity and is inclusive (for example, 12:00:01 includes the
+            first second of the minute).
+
+            Please note that this parameter does not support a millisecond
+            value.
+        tweet_fields : list[str] | str | None
+            :ref:`tweet_fields_parameter`
+        until_id : int | str | None
+            Returns results with a Tweet ID less than (that is, older than) the
+            specified 'until' Tweet ID. There are limits to the number of
+            Tweets that can be accessed through the API. If the limit of Tweets
+            has occurred since the ``until_id``, the ``until_id`` will be
+            forced to the most recent ID available. More information on Twitter
+            IDs is `here`_.
+        user_fields : list[str] | str | None
+            :ref:`user_fields_parameter`
+        user_auth : bool
+            Whether or not to use OAuth 1.0a User Context to authenticate
+
+        Returns
+        -------
+        dict | requests.Response | Response
+
+        References
+        ----------
+        https://developer.twitter.com/en/docs/twitter-api/tweets/timelines/api-reference/get-users-id-reverse-chronological
+
+        .. _here: https://developer.twitter.com/en/docs/twitter-ids
+        """
+        id = await self._get_authenticating_user_id(oauth_1=user_auth)
+        route = f"/2/users/{id}/timelines/reverse_chronological"
+
+        return await self._make_request(
+            "GET", route, params=params,
+            endpoint_parameters=(
+                "end_time", "exclude", "expansions", "max_results",
+                "media.fields", "pagination_token", "place.fields",
+                "poll.fields", "since_id", "start_time", "tweet.fields",
+                "until_id", "user.fields"
+            ), data_type=Tweet, user_auth=user_auth
+        )
+
     async def get_users_tweets(self, id, *, user_auth=False, **params):
         """get_users_tweets( \
             id, *, end_time=None, exclude=None, expansions=None, \
index c8337fe9090a679654e48dd353770c51861f1056..f9a19140b85a97f5e3dd4bcafeb9a5e68ae7ae2a 100644 (file)
@@ -1357,6 +1357,111 @@ class Client(BaseClient):
             ), data_type=Tweet, user_auth=user_auth
         )
 
+    def get_home_timeline(self, *, user_auth=True, **params):
+        """get_home_timeline( \
+            *, end_time=None, exclude=None, expansions=None, \
+            max_results=None, media_fields=None, pagination_token=None, \
+            place_fields=None, poll_fields=None, since_id=None, \
+            start_time=None, tweet_fields=None, until_id=None, \
+            user_fields=None, user_auth=True \
+        )
+
+        Allows you to retrieve a collection of the most recent Tweets and
+        Retweets posted by you and users you follow. This endpoint returns up
+        to the last 3200 Tweets.
+
+        .. note::
+
+            When using OAuth 2.0 Authorization Code Flow with PKCE with
+            ``user_auth=False``, a request is made beforehand to Twitter's API
+            to determine the authenticating user's ID. This is cached and only
+            done once per :class:`Client` instance for each access token used.
+
+        Parameters
+        ----------
+        end_time : datetime.datetime | str | None
+            YYYY-MM-DDTHH:mm:ssZ (ISO 8601/RFC 3339). The new UTC timestamp
+            from which the Tweets will be provided. Timestamp is in second
+            granularity and is inclusive (for example, 12:00:01 includes the
+            first second of the minute).
+
+            Please note that this parameter does not support a millisecond
+            value.
+        exclude : list[str] | str | None
+            Comma-separated list of the types of Tweets to exclude from the
+            response.
+        expansions : list[str] | str | None
+            :ref:`expansions_parameter`
+        max_results : int | None
+            Specifies the number of Tweets to try and retrieve, up to a maximum
+            of 100 per distinct request. By default, 100 results are returned
+            if this parameter is not supplied. The minimum permitted value is
+            1. It is possible to receive less than the ``max_results`` per
+            request throughout the pagination process.
+        media_fields : list[str] | str | None
+            :ref:`media_fields_parameter`
+        pagination_token : str | None
+            This parameter is used to move forwards or backwards through
+            'pages' of results, based on the value of the ``next_token`` or
+            ``previous_token`` in the response. The value used with the
+            parameter is pulled directly from the response provided by the API,
+            and should not be modified.
+        place_fields : list[str] | str | None
+            :ref:`place_fields_parameter`
+        poll_fields : list[str] | str | None
+            :ref:`poll_fields_parameter`
+        since_id : int | str | None
+            Returns results with a Tweet ID greater than (that is, more recent
+            than) the specified 'since' Tweet ID. There are limits to the
+            number of Tweets that can be accessed through the API. If the
+            limit of Tweets has occurred since the ``since_id``, the
+            ``since_id`` will be forced to the oldest ID available. More
+            information on Twitter IDs is `here`_.
+        start_time : datetime.datetime | str | None
+            YYYY-MM-DDTHH:mm:ssZ (ISO 8601/RFC 3339). The oldest UTC timestamp
+            from which the Tweets will be provided. Timestamp is in second
+            granularity and is inclusive (for example, 12:00:01 includes the
+            first second of the minute).
+
+            Please note that this parameter does not support a millisecond
+            value.
+        tweet_fields : list[str] | str | None
+            :ref:`tweet_fields_parameter`
+        until_id : int | str | None
+            Returns results with a Tweet ID less than (that is, older than) the
+            specified 'until' Tweet ID. There are limits to the number of
+            Tweets that can be accessed through the API. If the limit of Tweets
+            has occurred since the ``until_id``, the ``until_id`` will be
+            forced to the most recent ID available. More information on Twitter
+            IDs is `here`_.
+        user_fields : list[str] | str | None
+            :ref:`user_fields_parameter`
+        user_auth : bool
+            Whether or not to use OAuth 1.0a User Context to authenticate
+
+        Returns
+        -------
+        dict | requests.Response | Response
+
+        References
+        ----------
+        https://developer.twitter.com/en/docs/twitter-api/tweets/timelines/api-reference/get-users-id-reverse-chronological
+
+        .. _here: https://developer.twitter.com/en/docs/twitter-ids
+        """
+        id = self._get_authenticating_user_id(oauth_1=user_auth)
+        route = f"/2/users/{id}/timelines/reverse_chronological"
+
+        return self._make_request(
+            "GET", route, params=params,
+            endpoint_parameters=(
+                "end_time", "exclude", "expansions", "max_results",
+                "media.fields", "pagination_token", "place.fields",
+                "poll.fields", "since_id", "start_time", "tweet.fields",
+                "until_id", "user.fields"
+            ), data_type=Tweet, user_auth=user_auth
+        )
+
     def get_users_tweets(self, id, *, user_auth=False, **params):
         """get_users_tweets( \
             id, *, end_time=None, exclude=None, expansions=None, \