From 0aa2366a875464756507abf42709a3db676f4cee Mon Sep 17 00:00:00 2001 From: Harmon Date: Tue, 16 Nov 2021 07:52:59 -0600 Subject: [PATCH] Add support for Twitter API v2 List lookup endpoints --- cassettes/test_get_followed_lists.yaml | 66 +++ cassettes/test_get_list.yaml | 65 +++ cassettes/test_get_list_followers.yaml | 123 +++++ cassettes/test_get_list_members.yaml | 103 ++++ cassettes/test_get_list_memberships.yaml | 99 ++++ cassettes/test_get_list_tweets.yaml | 233 +++++++++ cassettes/test_get_owned_lists.yaml | 69 +++ ... => test_manage_and_get_pinned_lists.yaml} | 192 +++++--- docs/client.rst | 128 ++++- docs/models.rst | 6 + tests/test_client.py | 41 +- tweepy/__init__.py | 1 + tweepy/client.py | 455 ++++++++++++++++-- tweepy/list.py | 35 ++ 14 files changed, 1483 insertions(+), 133 deletions(-) create mode 100644 cassettes/test_get_followed_lists.yaml create mode 100644 cassettes/test_get_list.yaml create mode 100644 cassettes/test_get_list_followers.yaml create mode 100644 cassettes/test_get_list_members.yaml create mode 100644 cassettes/test_get_list_memberships.yaml create mode 100644 cassettes/test_get_list_tweets.yaml create mode 100644 cassettes/test_get_owned_lists.yaml rename cassettes/{test_manage_list.yaml => test_manage_and_get_pinned_lists.yaml} (65%) create mode 100644 tweepy/list.py diff --git a/cassettes/test_get_followed_lists.yaml b/cassettes/test_get_followed_lists.yaml new file mode 100644 index 0000000..61513b0 --- /dev/null +++ b/cassettes/test_get_followed_lists.yaml @@ -0,0 +1,66 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - Python/3.10.0 Requests/2.26.0 Tweepy/4.3.0 + method: GET + uri: https://api.twitter.com/2/users/372575989/followed_lists + response: + body: + string: !!binary | + H4sIAAAAAAAAAKpWSkksSVSyiq5WykxRslIyNLcwt7QwNTBW0lHKS8xNBQqFBis4Z5ZkphYr1epA + VVlaWhoZmRkZIRT5p6VlJqcWK6gpOJfmlJQWpSrVxuoo5aaCzK5WKkotBorGJ+eX5pUoWRnV1gIA + AAD//wMAs7LZ53cAAAA= + headers: + api-version: + - '2.30' + cache-control: + - no-cache, no-store, max-age=0 + content-disposition: + - attachment; filename=json.json + content-encoding: + - gzip + content-length: + - '128' + content-type: + - application/json; charset=utf-8 + date: + - Mon, 15 Nov 2021 23:40:27 UTC + server: + - tsa_b + set-cookie: + - personalization_id="v1_8Es7xcFmkiEOwzSNGOFWDA=="; Max-Age=63072000; Expires=Wed, + 15 Nov 2023 23:40:27 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None + - guest_id=v1%3A163701962770266612; Max-Age=63072000; Expires=Wed, 15 Nov 2023 + 23:40:27 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None + strict-transport-security: + - max-age=631138519 + x-access-level: + - read + x-connection-hash: + - fc14f027f77c919ed872be0f72b6d09b49fe0761fdf0524cd135ef26665b270e + x-content-type-options: + - nosniff + x-frame-options: + - SAMEORIGIN + x-rate-limit-limit: + - '15' + x-rate-limit-remaining: + - '14' + x-rate-limit-reset: + - '1637020527' + x-response-time: + - '97' + x-xss-protection: + - '0' + status: + code: 200 + message: OK +version: 1 diff --git a/cassettes/test_get_list.yaml b/cassettes/test_get_list.yaml new file mode 100644 index 0000000..f08d498 --- /dev/null +++ b/cassettes/test_get_list.yaml @@ -0,0 +1,65 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - Python/3.10.0 Requests/2.26.0 Tweepy/4.3.0 + method: GET + uri: https://api.twitter.com/2/lists/84839422 + response: + body: + string: !!binary | + H4sIAAAAAAAAAKpWSkksSVSyqlbKTFGyUrIwsTC2NDEyUtJRykvMTQWK+KelZSZnJuYohJRnlpSk + Fik4Jifnl+aVFCvV1gIAAAD//wMA28iK2j0AAAA= + headers: + api-version: + - '2.30' + cache-control: + - no-cache, no-store, max-age=0 + content-disposition: + - attachment; filename=json.json + content-encoding: + - gzip + content-length: + - '86' + content-type: + - application/json; charset=utf-8 + date: + - Mon, 15 Nov 2021 23:40:28 UTC + server: + - tsa_b + set-cookie: + - personalization_id="v1_Aw9VuVg/CLJcjVZCjX82Lw=="; Max-Age=63072000; Expires=Wed, + 15 Nov 2023 23:40:28 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None + - guest_id=v1%3A163701962808455938; Max-Age=63072000; Expires=Wed, 15 Nov 2023 + 23:40:28 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None + strict-transport-security: + - max-age=631138519 + x-access-level: + - read + x-connection-hash: + - fc9e2cdf5462c36c98e5dd040cb6988b4e2063917c37ebc235455c4fe24343f9 + x-content-type-options: + - nosniff + x-frame-options: + - SAMEORIGIN + x-rate-limit-limit: + - '75' + x-rate-limit-remaining: + - '74' + x-rate-limit-reset: + - '1637020528' + x-response-time: + - '72' + x-xss-protection: + - '0' + status: + code: 200 + message: OK +version: 1 diff --git a/cassettes/test_get_list_followers.yaml b/cassettes/test_get_list_followers.yaml new file mode 100644 index 0000000..7a8655f --- /dev/null +++ b/cassettes/test_get_list_followers.yaml @@ -0,0 +1,123 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - Python/3.10.0 Requests/2.26.0 Tweepy/4.3.0 + method: GET + uri: https://api.twitter.com/2/lists/84839422/followers + response: + body: + string: !!binary | + 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 + headers: + api-version: + - '2.30' + cache-control: + - no-cache, no-store, max-age=0 + content-disposition: + - attachment; filename=json.json + content-encoding: + - gzip + content-length: + - '3415' + content-type: + - application/json; charset=utf-8 + date: + - Mon, 15 Nov 2021 23:40:28 UTC + server: + - tsa_b + set-cookie: + - personalization_id="v1_I59ov2pIWDJYXAR/YUv+xw=="; Max-Age=63072000; Expires=Wed, + 15 Nov 2023 23:40:28 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None + - guest_id=v1%3A163701962834890720; Max-Age=63072000; Expires=Wed, 15 Nov 2023 + 23:40:28 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None + strict-transport-security: + - max-age=631138519 + x-access-level: + - read + x-connection-hash: + - 17be92252e12c1b432119645a59453e288159898b8dbb918b4fd7fb3c1792801 + x-content-type-options: + - nosniff + x-frame-options: + - SAMEORIGIN + x-rate-limit-limit: + - '180' + x-rate-limit-remaining: + - '179' + x-rate-limit-reset: + - '1637020528' + x-response-time: + - '157' + x-xss-protection: + - '0' + status: + code: 200 + message: OK +version: 1 diff --git a/cassettes/test_get_list_members.yaml b/cassettes/test_get_list_members.yaml new file mode 100644 index 0000000..e942421 --- /dev/null +++ b/cassettes/test_get_list_members.yaml @@ -0,0 +1,103 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - Python/3.10.0 Requests/2.26.0 Tweepy/4.3.0 + method: GET + uri: https://api.twitter.com/2/lists/84839422/members + response: + body: + string: !!binary | + H4sIAAAAAAAAAHyZS28cxxHHv8pgD0EC6DD97tYpS3IpUhQpgg8ZhmMIw90WOeByZzEzS9oWCAS7 + cmLkeYhzywN2Ho6RALGTQ2REQA7+KAMrh1jfITWzj+mZreZBhNC189vp6qp/VfU+7wyiPOrcf+d5 + Jx507ncIIyZkUlNtJOeC85B27nVG0ZUF40acDm6ivH8BS5PMpovls9Xy7b0lhnKuGOGGhFrr0BjN + a8zJTZznNg1OLqJ4GI0GTdrCujLWTGI4lUoygIaKMhqG68wjm99Ym2coc2V0mFIbJaUOtVRKUqLU + OrN7NrQorzLUrFAKyo0inBJwnWJc1KzjcdS3+FstTA6HG6YFpZJTrrQ0HPHdfhxdxShubnFoIWew + N2OELo+CYSex//Xn78X9BOfZyrQCKsWE0oxqbjRTVIYaOdnk3OYXNsVPdmmskVJSI0NWRp7hmmvn + YPeTKzvKs2C/d9Bt4q7mFvgTOSimCQGCIpRyAodBkfPM4miEn8XC1MIRIoQRRAppkPA4ztN47Dvb + ha0JhEBjiikhyixbBx5GabkxFLi0NYECYBwORlKpkeNY+nB3NIijJnZhmltqKFFcCohkOGqjqDGI + F5/EA5tgyMUHKvvuQQvKIMuICiGXiTTr0C2bp0mco8ClrQmElwshELWQhCJA8Ffs9WTs+JFDehDC + NWF+/3UnWZ5GQ48Pu6cOjSgqtKKYnCxpG2mUxUMUtTCtcAzihIlQYudQzD4tZq+K2SfF7J/F7COU + 9zAaRyMXpxgoMmF37HUzGkWD1kbna4tPtHCgfeYOnB0FvWwcff1lgu+4d9ziMUkYolQPQNxG5+iB + LkwNDKg6lAokLC7iYTwexyNP3h7uOBxaVkMQZIFsL0ovbQ5fGxw/wNXzMj8HUxMGUofVrhoGaeOD + uRlVwUCZDJLzVfr5E7MFCaGwYnVh9Ubr8uu8U2V0gDIURBuG+H0ZOyhpLa4qECQSBqp9teX31ZYD + gybEGKZCZ5uHFiSgn4xtsGOH4yZmZatMDoaUlZ2KO88PpMD3Tq5KlDD4xzDYcR6d413H3NKAUJBC + LMy3kwTvriqDgwBBlgLaqxpxZK8nre9Pq6XVUxDH0C2CnCOBU8x+XUxBkWbF9F/F7DOQJvw1ouxi + 9PDQYSoDGRtq3iyLWZwn6aP1AFyu188LQcAfkq5nRDH7VTF9Wcx+Xky/Ql9mI/6g8SolKgzN3dG3 + 1d3c8Z51ZWwDhcQqNHw6eASd+JUPNje6MAhopSkSOlCTExA2T112k4IKbspajJXiAxufX5wl6YHN + WvW4YXFZpUoyiXQ0G8Oof1mOCa3Md9abHGVCrJHpDiNP31YaWggF7l5HbEIDZVO8+j5M4tHJhd0e + Jv3LjSOHB+08DDEN3kofPLKxWYovfOfFhR0C43mnn0xGefr+034ygKJz/53OyVHn3dv6O0CHwxC0 + GAm3t0plRPc9t9QQaKOpUSCc/kp8uhd8J9hN7frkdbq3JsHQRBtKYeZCcnwjmQwHnh5/aWuDYIRD + pG6cpJ6aMDe5mgkgDoEPfeldablxFNir4AeTLc024e92L/QmaeOgKzg3HCn1W/ba05ZetwCacYYp + OrxYBPvxqPqDNgX6H0zFPi+mfyzldfEfXFgfxc/sELobl0m1NgSaBcRv3uLeKOxEQ89oCMUmvu0E + ejN/tUkfNAoOTAACJvlQrkfDNx/+7ZtXv3z9i0/++/FfiumnxfSvxfTPWGvrJqur20RKoSnTWPtx + OoqvIfnj/P1W5NfrDoeDwoY0vLMvgr7VF1huS0skdLSA41hirmDbR17Y9lEDJsu7CqTIObA9iLQo + ePOTl9/+5sWbF18E//vso29f/fDNzz70fsde8ztgnjIwqyIq3O/bLIvPoIVuO3Ipx4Q0PBnCkKph + IMJq1TVUkaS8uBlGeZx45vJd99UEg7GUwTSOJOnkDMIez9O5ycFQCTlBsAq6Vd6JoZDS4CI4xBkE + So3opvlOAg82H1+t1s/C6MqoEgLtnqB1+nEx/QMkgOdOBqbuRtBzmF0ZD7mT3b1r0PJyAE6TVgG3 + pWU8N9QIxqFkyhC7MZmPbrhLSpt7A1NxCKPY8WBD5cK2MDk3iDA+wzjOkaHyqPcWyijXHQDVnMEY + iV3Z2CjPPZd6S5sLEoZB/iIn1R1kQfdwt3XYg6xccy4ZFRNwQthlwEYC0Y8H7MLkYKBDFxq9N3n9 + 8X9e/+Pf+FicXDcipaRAgcHaq2L202L2p/I2wdMiH9ibrA2jijOKBfH0q2L22+pq4sUdtb2JY1XX + hl0kHNv+JF3Tm3xuzZZGB0WgR2DErTA70SBJxsH3F0j0peafca9PlTKEC8zptdae7nlFFUwujELS + G9mUnGqKWdvXfHX1rAkF1CO0PTw+6uEOhvXV8xrkhsDBI64tZr9fHvvLamT7O76bSRb33eMqNR2K + BJbonpuyZXlw+jnwLowxiiDh+PjZs7gfR8NSw/JR+8CW1qWxJlIJHlZY81/ppl9RHQacFDcCG8y7 + OXTOnvLQPXlUMyTIe/mzAurx31Xu/rKY/aiUeWhvpl94Q8j1uaSq6uQcaNkIBdAJBVUrFPT2e61m + zu2Ueo7rQdU0dCWYrm1t4uVv03kaxn+IR0xeT56gT8Ny/TSMVJQT7KeNI5vZKG3/yLSU+KWxvmo1 + AjorgvW1IFfB20l6GWz6GpWDt50dcQ1ttwix5v9RAjo/OrdDz32hewfBmZIwCGM/FVTjWtBrX2De + lMvnLkFSKTnWGuwn17HnHRammgLKrEQYIoqxkSSXOGRuce6xuYbNGCQPtiMYbj23OqWlvl1Ssuz9 + sOr3eAzuOE4maR+vxY+P3WthBZ0FwWaGoJKmIM6CYZzldlRKcp5AIA2C7548+V41Bvbg71aP+ZXN + /SIqlIBdoxGF+60y3L57r3Nly59Tn3dSm02G+dNq6u/cJ2EILPte/jRPLmFiB8/K8rdHaLe0MsbI + MhM7t7f/BwAA//8DACGrwl2PHQAA + headers: + api-version: + - '2.30' + cache-control: + - no-cache, no-store, max-age=0 + content-disposition: + - attachment; filename=json.json + content-encoding: + - gzip + content-length: + - '2244' + content-type: + - application/json; charset=utf-8 + date: + - Mon, 15 Nov 2021 23:40:28 UTC + server: + - tsa_b + set-cookie: + - personalization_id="v1_HB4AISsVuRwhCUTUD14jkg=="; Max-Age=63072000; Expires=Wed, + 15 Nov 2023 23:40:28 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None + - guest_id=v1%3A163701962871088445; Max-Age=63072000; Expires=Wed, 15 Nov 2023 + 23:40:28 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None + strict-transport-security: + - max-age=631138519 + x-access-level: + - read + x-connection-hash: + - d43a528453097434589e08eef021c1fcaf7b53343b1be8a7c2f3e259ea74d6fb + x-content-type-options: + - nosniff + x-frame-options: + - SAMEORIGIN + x-rate-limit-limit: + - '900' + x-rate-limit-remaining: + - '899' + x-rate-limit-reset: + - '1637020528' + x-response-time: + - '157' + x-xss-protection: + - '0' + status: + code: 200 + message: OK +version: 1 diff --git a/cassettes/test_get_list_memberships.yaml b/cassettes/test_get_list_memberships.yaml new file mode 100644 index 0000000..6c3eab8 --- /dev/null +++ b/cassettes/test_get_list_memberships.yaml @@ -0,0 +1,99 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - Python/3.10.0 Requests/2.26.0 Tweepy/4.3.0 + method: GET + uri: https://api.twitter.com/2/users/783214/list_memberships + response: + body: + string: !!binary | + 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 + BpaN0gly7vnznwEAAP//AwBWDnxo9hEAAA== + headers: + api-version: + - '2.30' + cache-control: + - no-cache, no-store, max-age=0 + content-disposition: + - attachment; filename=json.json + content-encoding: + - gzip + content-length: + - '2020' + content-type: + - application/json; charset=utf-8 + date: + - Mon, 15 Nov 2021 23:40:29 UTC + server: + - tsa_b + set-cookie: + - personalization_id="v1_i4VsZQuY+snYsjI718kvww=="; Max-Age=63072000; Expires=Wed, + 15 Nov 2023 23:40:29 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None + - guest_id=v1%3A163701962907172503; Max-Age=63072000; Expires=Wed, 15 Nov 2023 + 23:40:29 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None + strict-transport-security: + - max-age=631138519 + x-access-level: + - read + x-connection-hash: + - a382da012e4685a6634f47b053d09c98fc1b6897d4f4a2cdec6a820465cb8574 + x-content-type-options: + - nosniff + x-frame-options: + - SAMEORIGIN + x-rate-limit-limit: + - '75' + x-rate-limit-remaining: + - '74' + x-rate-limit-reset: + - '1637020529' + x-response-time: + - '203' + x-xss-protection: + - '0' + status: + code: 200 + message: OK +version: 1 diff --git a/cassettes/test_get_list_tweets.yaml b/cassettes/test_get_list_tweets.yaml new file mode 100644 index 0000000..4cabf76 --- /dev/null +++ b/cassettes/test_get_list_tweets.yaml @@ -0,0 +1,233 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - Python/3.10.0 Requests/2.26.0 Tweepy/4.3.0 + method: GET + uri: https://api.twitter.com/2/lists/84839422/tweets + response: + body: + string: !!binary | + H4sIAAAAAAAAAKx8bXMb15XmX7mittaztTTdr+gG50MMkpBIim8SKVHSakt10WgCTfYL1C8EwUyq + RFGWHTlTzm5eJpndbNaxHYmyZUWWZVt2ZlMV/gnwqxk79qf5C/ucexsg0KDXqdpMxhLQ6L597rnn + POc5556rH47VecrHJv/LD8e8+tjkmGqUFL2saoaplW3Fskpla2x8LHV3Uvy4ELHDz/3UCyKWRLXY + ZT5n08tX5mZeVsvMDZnrsyAL69HkjRD/y2ZsfRp/zlRLJ5/PlVklS9LY44y3fM/hzInCDS/kgeeG + acQ4a7lxEoU8YWHEtrmThbzOk6HhKgPD2ayatPjhU85it+FhYM5SN6y7oUNvSBzxOXVJOgjrZPE2 + Z27Lqx8eBHj54LDntIHPM2zx8GDHcyIM63g1lwWHbyes7rIsZIHn+4fPQvom5RM/VOjd193QpVGb + adpKJl95JZ1woleM1e2NdNOZbSpjPxofVLNd1gxbUWzNLmlK+UTNlTTjvrfLDx8cvhOxOlTCMYsA + E4JKpmKeeD77B9V8JYy2/9M4S9wG6ZxFpMnk8FnseJGQzT187GR+JKTzglbshgnHyrzMFqM4daFf + CC6XEx80oznJSiXx8+FBHe8KDp9tu/4k00yTBeIJ+nEtSrlPI9KlKMEzqjqh2wb9thRt420OT+i6 + NmHr5inDqcpESbXlXTfCK+4mFowHNawHG5QnjFKI73GMVFBn4Kq6PqUuXU+L6tQNTbdVslxFs0/U + eWmNvVqZqbR5XE/Oc59PsvnIC1mWsCgkmZlqp03GU2ZN6korYNU1thHFLG1iUbM6lDnjJk7stVIP + 98thGI3DYK6O67u1mMPAYu4lXthgHDfACpKkPwh0D13x0HG/vP37gsyWqhulkqLqlm4p2onMa20v + Td2YVVbm2LZ2vPeTv3z2xTe/3zvee4Qrx3sP8eH4zv3j23t/+eK9v3z25vHeh8d33jjeu4frX//y + D18f/Pab/X+je/YO8Ow3f/q3r+7/7+O9Xxzf+cnx3v853vuX473fHt++cyP88q2n//7ZW1+9++Cr + f76PMf7684ff3v758d6D471fH+/99Hjv/eM7vzu+8+T4zhfHd16I6/+Md/7158++ef9NuofG+8Nf + 77799S9/Tb9ChDv3v3r3X4/33hISDT77k6/eegKhco+bwZ/TM6Xj/d8c72Mmnx7v/xFP/OWz29/u + Y24ffvXGJ9/++qfHd/77Vz++/+2v3yU4+ebgmRAcIz/JJ73/y+P9x8d3/oD7jvd+/s3vH4hfxUT3 + 7or5DRnO0rx75foFxd9cZ0PXZy7GvLbVvrJYKyxOydDLlmbpqqFqZmnAP1uHzxL4HUAlBerwmPGI + nZuaG2erqbvtsikehjCVwwOgpA8jIZzwACRJK4Ifx8wNmA9MiescfgTbgDsl3OG4M+TMC7fdJPUa + ufdLnBWXeSLgIGLTvOWlh898LyLFDM0lXnHK88bMucr0yFw0RTdVSytZZcsaNTTeavk8g2WTxTYB + pFHsOUCUIPDSAPNMyNrrXsMj9/dCx88ScgcAE6vFEa/X6BN3HDJ8OBeNcnmVzYUbgKs0zpw0wzTm + xNxoOPHgfFRLWMVJx1m76TlN1obfJ14jdOsYAq/zeRtvrfPOBKOJrkGsXD1iiDZwGLpsRW3IT9iX + BQgd4/C7JBVXgpabeuS14+J1SdYiR8Rndna55YZziAtx6KYTBVWZtqVh1TVVMS1DOVFVJ8pitsG3 + oRn4e9KksTY8Pxh53FTKZkmxyqZqDLj0albzsjNsmU0BQjeiBqIbopSbAbghTXz4dgyoIWvQsNwq + jAYGBtviYeplZBirhwexB0giC+AIBLcywvjgzIgNXL7qX5na9twr80XJrHLZ0E3dgEGb6jBAzsR8 + y51ka/iTTUfbbjwuP6/4Lk+wdvnXaYDbiL7gJ7atllRoyzaHh12Mb87AGzqrgEYEmCaHe0CPsH+s + ES20CPmIsVFcJ/SMNvB1tcUdly5ilf3OD1gzagvb8NIf0GTb7kuwpZRvCbiF87gtWCYGFkZTc4U9 + Z+RpCVBXDNuMRqHX1EBudF0r6ToA+ERsERxoqd0dLAsMH5Gh7yUwo1cRgcN6m6ewWBlA3ADOzFRL + RhFV4RRDXtERSs4vyliC8MfJKB2fJyLsDMcFmnbvFUTHpFvBzlkr5k7qwavGpdOJ2cQu91/2vQ0A + 0A4PWj5i+UYcBWxAMAccKyJ3kK5zSXAjjB5G7clh9LvU2L5VWbpwYUUdvq7OOOVzYWe2WQyzRrms + mZaq4YthFMJsDahAsQ+GdHmpyuaWJtkKcM8jDgZ3BzTSR+Hk0Cv7D6apsBrcmKCk5rV4nHoJ3NMb + hg26o48IE2wufYl0KLRGetxyOzANNxCKJYw4Jc4aumLALRWC9NIA1aoGbCarcW8cXukT7YwJ5XaF + c7XiCGQR3lYNgdiAE/fwAZaG3RgTpgAKE4ufG+QuYXRj7B/FTWEqXZkDklLYMCP2U3dbESQj4pS4 + 8bZXj6AWenguhPVu8F03xjugm8PPibkmOe57BFEbAIdHgs/C62nF3eGVOn/tstPavbho6MVJq4pK + lEgxDLU0AGTrTawBeWFKLs0B4C7fkiZE+gQBc32P9Bv6HXLQ2MUyhDBsUN8wI+rog/HEBdgx57SK + cX1qaeVKQQwIYAFxdMM2zUHdk8HM34yaW1nMb9r2JPvLF/e//pf3jvfePL7zY9CMs9/+EgTis+P9 + d47332REKPbfOt7fF2zhveM7f6LIv/f+X58///qXr3/1GNQAZORdogA5E3o/J0lDjOdGODRszlrw + yr13cAsr/Iyv9lS1slZ8av8ukZv9P+J6de787NqO+LN6icYHz/n67v8QVOQR8ZCcTb3573/87fHe + z0CZboRDE9n/xfH+gfgqiQym8N+O934PBXz9qyff/uZ/He/9SYwE9vazrz/63VdPn4rXv4vXj9o5 + WKSlKYquqlp5cMmHVmrh2srV9avnqtsrxadLtlKybUQIhL+Bleo+6j7oPuy+OHqj+4AdvYYP9/Ch + +073cfdJ933WfXB0F18+xC0Puk8Z3YULz/E3vrx2dI91Hx/tHd0V9+EDnsV/B+wsRnrQ/QBDHNwU + Tzw9egO332cY54kYSQ6McR52n9IL6fnXus9x4/3uQfcnrPuJGP5or/tC/HYfTz2icY9exwMf0Htu + yocwxrOj+0d3jn4sX/UCvz+kUfCyo9vsrLjrDv6kBw+EmUgZbhZkOCsFGAm682tTS2vGdLNpF3Vq + 2CXVQG5ilDRLG7b+luc4yPSAfzcnhesFkbP1ctYSzglSCJhk2wnYEcIK/VwHu/QjRCUE0hBcrcad + rWEsWAnny9G52vUFbUQM07IAfbqhGOogAO44oEgIKqHbzsPIq3komnG3WT8lPmeX1yDBcF7CPErU + 2kK2Voy8Le6IX14WAcxLv7z9a4yZAb0B1XgB23A5IXoiSMsa8NzlABakkuAXaRYS4IkQqiF2rvRC + Zxq1gescowBRAbUJF5lYu+kSDSDAchFxBRtMmuAnYjzGa1EmtbaRiSiSR4veDGb6ulwBmuFNwUQx + 09Smd87V9dbKuXhYybWpaDlt8vO3FkeUbFhlrWSDVpT0wlpD8AYRrPz1AaAXC+g1mIO1bLgyXcQC + J0wwHeZ2KEAIDhRTNQBcKZ/IkCzb6247azQuhrPD19fXLu+GreWg6RVl1MumTnZQRp48kAh8+a9v + IxVkX97+n+TGcI0n5Fn34ZJ3ui/I6T8m/6SP5Cb3cP2e9M+H+CIcib48AiQ8El/hT3fx5SNyM7r1 + IZzvPobBjY/Igcld5SBP8Ndd4e8TE1/e/g2rdZCv+3HkdvjwnNaM6q3ZzpoZXR6Zk0mUXbWRT9vl + U+f0hLy3+4xeD8Sh6QlJjva7Hx/tSdk/kIJKkHnWfZfEYoR1wC9xA4HL0T7BGgmeAxJg71MMB9Rg + /cy2qlu9iUzxThhlIW+m28OTubWy3o43rnXsenEymglSamMu5bJinDYZwk0ILqTAEnU/p/eTwoU6 + X5D8hIlPIeOz7oOJCVq9XNhnEPS3Pdm4z73wppENC6Z0Fo0LzhT3/BHBVMNEdDBVQIl9qmB7hN7v + YK3f6H5GC493C7D/lLR3dKeI1JDrXazBa5D+xhieeyKMZZ9piqbeGOvB/z5Bby+qvHP0upgdveg5 + LQIGzG3vU3pF78uLHPfvD67LtDF9elWyWvne9WqWb03Nz6Zec2S91JKJXLFka2VbO1Ut0PljMnjM + gf4S00E4IuHeFzqgsEh6+5jCDznY8+7zniF+jr9fE8b7KJ/2wPR6Uie84yFx6CCbLcSDEp9fULi6 + WswFdcVWyiUNFF637AGiIJMrAts8wSLMjCkVIfykZBwfNsZZ7DWa6Q8Kg2qGUtY0/EcQM2C6cxsU + 0RAN6kj8QDnTYeRvUY5Jb+HIB5txlDWaIgEDImYBUuIknSwgc7QaOI2LwXqjMyqBXbaQ02lE9QfK + HCT5OGtjajS9kNbYkdPLY+v3RzYKPRR48kCCGyfYej4gcgci63FUzxyZllK4S1yhtrws4lPESWQt + gnLeAOmFiIw+AkDGG64MvzTzgeAU+Z7TkWK2Ynfbi7IErJxWJPacFFEhg+oc6E+kP/ksZNZ3Nv9G + UyoocOPyYnV93elMF8ODplN2Zxq6WbbVAbtYcX0uNOF6yHq23V3iJ8hmaNpUqB2qU4/j8iVZhZ7n + IZ6IWEi1KyRpCHxQLRJ8Kve7icxwQl6nwjEmPx0hN6LdBKQ6zShpeXm1OXZPsiDKq2JKxOoR8qUH + hSCRLbZmLjfaF5R4ZGaWqaiKqViUvRbyfVkMFoUHKoFBRL5BgkVRTkgmFUVyEtjuFlUcyASG+Egj + EguPxW3Ctk/SqQE2RURlYljcuK3vptcU+/LGqLiGbdnInTTDKA9asuAOgiLwxHPjHnGQBiPqdB7s + e5uK0qKOkHl+Pa/JJcJceUKeAHfczi03awE8YEqnm15Ei+FHIClx3+5ETYZYqhwdU2z2JipIn0MU + rMf2GAT0vcCTjhZmolwCu4flQl4axUHSn5fnCvpRdmerF9rzu+XoFP1YpqnASlV1wNPhkW0epiS2 + GzqYETkWOWOuFE9UX7CmkoFRtSHAsqdCjS03AhgNONIk629liQBSLrO5gAoDLq2yTxUfqizyDTft + DNwHBsCqIa9hLAf6Tqk65e7AfxNCkMEBpyusEnK/s+tSpCCmL/TX5K2WG8KggPADt1eN6f77qTab + hV7akYUqj4qJyeDQ51Q2nYm9CVGJCNPBH40ZGojmTWvSICGxKI0oqheQ4srskmKnV9KlYkZBC1BS + NcU0FETAU6AWEyEyfhJGChBbyBokZuF6k7Z/KFkARNNygf1ikiJw5A7qhvUWvC2FHbciyguEjqnO + u9Z2XZHOYPlXM7Lic7iBKsRJ/iNMuAUABTTTfbhKr1rwknRoWFrVIHOaIkKdkbVPDieItgbZhFUs + gSxsuAs7tXXz6im6IuZtGapqDwTGFcQ2JuvKXoyPMIFZF/KydhT79TMU3r0gcOseVgdCZ61IFs+Q + IgqXg+zjQBrXZdUkwQp7QEsZbaQ2l2VhvyOMW9yXxyKoRxMbmZ6wdegleSWAlTTluFXEKoEIJ4MN + Fw3Pt9VNb2rx6tUCqb2o7c4s3VJXLo4qQLeoVEw7ygMkaW4kZrqA9t7O2XfnamcKflnV//bslNb2 + tKRUbIfN9dTd0xTJEtAy9ePsOOGZVCvU2IBJyYTz5H7S9PBG1yWK9tCn48YpSHcfR6H+/n6JxNuC + pmfjQDVrW1Pr88OavnZuY3qmGs8mjaKmVdu2LQVBwyqpA5tWGzEPt1hOdkSe3Ix8qpGzIHeZs0km + pkAmMfSu6tXtlZn5SquqjrzLAN/TVctSVE0fznenp1aX3HYyydYra9OzbGHuSnWSTfuR3CSNG5nc + VSJo8sJMZP4XOsDLS7SEYTMidVObgF8ICNfnvAvm4ur11WJ8V23gkaICjmx1cNum6kvGEBGR8Nmq + S2xjnLoBWjwGa65Tb8CM18pSwUKANPgT65P58oLsHFgB5nqCfoCNTGVuiF8qHgW3hCiC38hCudNO + T4PnAMOohkwBNxSb+VjjmFPlNGFn4V4OKFPoJpW4QW4bcjZSUVrYUG7VrqpGxShO1NIU29DKpZKm + qYVtnCV3J5qPQKj8SZYnIMtCkMMDlgWcXXJbh5/XqO9iAlwLEcNLIxg0fMOhqRIHj2Eom/gCZD18 + nHp0vd92MMGqksCFkSxrc3YWmnF8Hsj9yhl+8gZGCzdaolRN3VQ1sEzT1EoDBYgbY2AiItvI4E8J + AgiVd+LMPYNUcLgDoDOzca50YUepFIfWLdhAGQmAYQ+mzqSZWe5HwIhVipSwSgGz42xRbMuw6abn + bkyws0M3MbgoCBvZKxJSbRxxVmx7bhMUY9FfXeExD5BIpCu4XDDTnc1gcSnebi8sF2XUtLJh6jZy + fEU9vf6SlxeQ5j05ekPUYLofHL3OkAQ+E1fz4soHog7wukj+ZSUGdzwSCePdvLSJPPEJ8mSM81qe + GFMpFINTBQTfTsotUETcqfjXImRcQxPZLa9Xrl1yzlfXixNRLdtSVayiPWSGf3571kX8X217Gym0 + eIbNInD6bgPORI7UjGIu21Ni6heC629HDKTfBa+Fch3J98/OTbkphFlreuFWhUp5i1T+ZK+u8Y4f + xWJwVR8oT1rKyeepUsGVrAuN3fjy5pJRLGkgbQd9RKaDqKwUXGmTClA1gKawllhkrbK+KOjj3Eug + 924ce0Ty8F0kMtue2+5lAUkU9IuOYi9PFnQJcedeAn9DiN9yc+os9kV5PSDsq/dz0g6R9VEHUsqq + ZtkAXcM27OG9LMTJUPJ12CacUnyrZjFiZzbOFjLon3a3EIHguSIlg2BIVmpZAgpep4VwXIIDiV7i + jubh2+zGGHVhnVxDTp5w2skSW7eARd/D8sJPKYdzd17mdcqL5D7YsDmZPLk8s3jNzGaLs7JLyMxK + ikmlr4FZ+a5kxL2dUEa1DqiYsokIwbfZI+k11/eo+4J0T70Wbp6l5Jxe7EF6G3kvQZuAGjcT9QIu + h9R4ANACIZTZHxjR1gTYwU6af6RRMToohPx+do2eqvSafdZxsTghA9lbSVORopTUAcpTCfN8iwxK + VPW9hNg+ghGmJTnqCaMnEoPQ5YvN8UxmKW23doYt5QkYpU5OM4oQadq9fT2RABG1kcxO1FsinndV + CLrZ3+P78vbP8P/MAWBv5ZyLBHAI1rC8NWpukZwhjVrFnX/FMGyKRopWVu0BriF2aMOIVigSe4Vi + qnl9nz5GQPg4auMuYbGwr8UF+q1ST/rbDzfGzvQbtUQybbxsrVAGDsC6tHplRezrwy8nR0NnulIO + qsvVuqkVjG9+daq2tjyzVi1OhKriikKtEUMNj2s9W6BlOGXJB4o5nmjt6blu7L5E8YP2JMjPRfNM + lG9dg7xTcsqpf4CSYJlhp3K7NWmJMthJF1ktS09IUiqb/Jy8CiTyHniEzIowGHwAeTppRmydUBVP + GLf0gXFpwXLjpG/Qor9mGC53p1Or5u1eLLa2UA1Ys0rwULtcGoDLVYK61GtJ9ptE/rbk8zfGpqmw + l4PgYgTU6SRAiT53r1KurOuYgSv0uAGbBfUDRCZO3+r7yTgb5NR6iSVh1mjAtQWEUuMoMtwvf/UL + CqNOtLHhYsK9v0U+RyxdXhjo+0S0yLtRxFb3f+RB6x9rrOmlyUkJ56WykoyoQqNAXirppmUPVJOW + w3ye46d2PshdKtrXE2Hhb215GFqeq+e3DZ2vO04xywQJV1Wd0nITXHg4moU8TXgGmJ5kngw3SSQz + 3B5W0tJlO/QVUOQ0KU5tAAAcaSUEGL0nhTGL6k3/blqlAKyojZkAeRDE9JdN1msHYbTubDNLRumg + Vi4rplIyTLtkGGahe6gTIe11+0x2ERScwtV/lj3DMfgsGAQ1DwvO8NICOcNilHrbL43TL604aoCh + CbpRCeuxmwnmzjcy0RI8vNdntivrlxar1auj8qmGpRuUwqqFHGed2j2SWVEIqq6uTAK/IC+UVEOg + 5TWPkr1AvEu2cyQZax0exHVkHSRTy02iwtpO15VLS1Nq9XJjVAzQxVK5pJfLRmFtr3AqA53jXrza + QmifZP8kFfZPoF6QJBC1VYDrLm9Sy8oisq8Id0Ga7b4kvmgWhtQ+LK4uS7cwl4jNwcMS6kjpUO8z + 4KTGNyM5HswzxB1TVPWl3AbBf7TPSivbZRs5Pxi5bZiF9o+FypXl63iMx/1FBgFekM1tdXeTx1Eo + UqaTjIktUC+TTzU1altWNBUkdrgIUb4VXm7V5y+sjEpSKsFlVRs5VIHtVUFRZ6gNTRSSqoPiVJLD + x4yqTr5I23lGPXmCjUJfawhkLqt6QBU/L4njg2gfylx8Fy1Boj1RzCNwN0XnjzBkkS+CqB0+ToiI + D5exT1WkYSpWGbTPUAuNV1eiRubmqz+8AVRZWlhP5uaWZkZH06kiXqLdq8KykFU3T6z6RBWLmNt5 + r0Ypb98Faa6CRYInAuG+vP2rCl1ecKl0b4K7CbtgYG8AmA7YDigjPo7MeKdZX64FamiFo5KqyOgt + AERpcKuKJHUdACh8LuZ9MSt1HrCZ2KMEY2mZtTzqe2fbCErU/5aFSExlSi+Mn8OqkcROR4HnICFm + Bbp6dXOhqfHF9lR5RCgYE+xZMU0kEQWhYEs3KcmERH1IYNuZS83A1OGZRpQLQSe4UKx3R+Vgetuy + FuzRF1rIVnSrpCnF5s3vXP2dna211aQ0m1wqjmZZJhJxQhVDGxgt2uIdCpY/KOxSXF2q2kGq1kak + opqLaZVsXTcH99v6JPol0VEcEAKGI5hGuGqBQ5pIiAegfwtkANxlks1RN6fsVKM8MO/pCJAT/Zwo + hB81eHHGW8FWednZXDNGX6aXjbKpWgYVHk5ehuT6+dFe95FMoT9GCv1pbw/5oWg0+lS0O4h8+nH3 + Qa/h6R6e+UA2KT0Tu9nUANB9R6Tkr7Hue9QadfTjk26CR9RnkG97dx/i0hPqNhBdUNQIsSf6kUTD + AfUj3RgTArwHAV6n1quj+2BNuHEf732derBoi180WzyhBP+J2Bzf676gKgE1YMgXd393dK/AjHdn + z5e27OZcxymqRytRGFbVcllVrGHzOoeoMcuDOil7Koq2knGQtKjuUSkUHNfZEtX1lkc9neBZfpQK + MioSLJB1yjeoXZN+Exx3bqh9fMYTG6tpR/bxnL0MruuvuxXfnxJstr++o4iIoELHPXTLHsWwKiCp + ziPE5EtrVbZUYZcuVwbqBRX75PNMWTBSuH8zb/GsZy2/j2zANcGiqe7M5UmbRS9sRg5lwiFV1Roc + CETnjZhzeJDBTBH4o2G7nKvM37q+aq+sXuv149LTm6fMSSecN8rF7J7mRCib3swiuAbVnmqHByEU + /+rVWrQzdUn0VJ2LPFHn47RrzqH6BEqYoDLXeK8HFTFHU6iDnPY+eruyAqLr3i4gsp/k18GXHDGT + E65u6ewsvU5ThpKu06ahm2WrZFFV1rSGihTIdx1Q/IjOQeTNtxHtbUuyTFvGXjzQjsspzAACSC7O + KgHfPfw49PLyRctt8G3aMGgIZBUrBopDKrgxtuFHImCzw88DYD016NZFSbd3qIJe6sbbvYNWEWg3 + uIgo94M3yvX3Re2UNviIFhF6e6Fz+Cise6RA6DkEx2OCQ3vcl2F9uHoeWlbQWFwKCpVAzSqTnmDE + uqoPbqANHiIZJwOkPTzq3xZUbS3OgtY4yVR3Uy8XSXRPOFhs0Zcc+QDKmIsjEMXzJPX/76MkmmVT + sQyhqKSWtdMblGST1P1e19EH1C8m+y2pI+hJr/NL9o0+67eJylaxP7+Pi9TF1IfPF3hEtF/9+YvR + HpjvaRpzlmcWlGwjm2uPTMPUVdEyoiuDp+8WOeEZAdjZS7zedFebHSywSHzqcdRqiQKdm2/Y0W5G + LwM9uwKXpM1LcUqg6TbI4aJNuN9qiqgqsu7ezhYSd7n5M1HsbLlaSRfLyuWlKyPiKmVDKZdNG0H3 + 9B63F0JJb7O8dEy6zLumHlLluPtprwfsMS0OdY59QMuSq/Rjuhdh6AWTbbhUW2ayJet7m6M25qOG + Vsvsa2tFqS0L/9lqqRDiB6R+jDgKGWg9H1Kz1hjEeYMq2aIGfr/7iEJff9Gfy2mJMNj9vZDyTepw + eyOPsh9SrRvfRJS8D+H3pak97n4kxnvze1umgt25mjq9rSRFrmPpFp0KMi0VXGKA6/Bmc1x277pB + JDYOTvbrlekeXhZ45bSdpmtXtOm0+BJV1XTQe2R7xmBVHcEJuWya+VzuGb56iW9uZQEyp0s8kha3 + wqlT1N1qcl4+MyjDzPC7Zy+3Lwb2VGBfL7wbWZqi2iZsjPrCTt495XrybAlbFY0OrOE2U8qIQs/B + hxDxPQsorQRxGyeih3QwBOMWFSiAPP0IEu403XCCzVLLihtvHL7bJAeaycbF2Z42MD/N8Dhu7pV7 + Ng7/KIeg+nkiD/XA46g2gS+7GQu4GLM4DQuZsqWXS7ZqlQtUhrYkZ0FIhrcl12ifUfhmpRnwrM4q + cY1KvVueLEH16m8Je5nNwJWtQo61XNbqSXVqp4jwpVLZUgEvVDnQC5y9MjU9yWYrKyvVpbml88hU + 1ifZYhaLImJfnJEdUS9kG5wSqwQMTDQwEFBdoO3IJsWzKHVpQysZEJlT5QWTQR5Chw5z+6F9DKoy + j0bukl4GuNsq8kN1sImZNtjFDk2+W0PynbpNA44hajK+xLwzhYbl5sVtXrm85twafa+immVqo1RV + 8+/+3iXEBqezdT24OPJepHI2kir8MVg1+zu993Lrwtb1es1cLzJueq+iKbpqQNHW33++61tXFq5W + Z2vzo+/VbQ0eXjLgJX/397qVTXf22mZ7qkgbSiCEVL0CKTTNgffOgDtlhweCmOZb5kgtqPAjWv0i + UNDilrwovXzHPjrZP5gNbdtGeRWwzywrvmTm54BPh28Dpnbxqk1qFKPaVp+XNqjIVZdFKDfc9kRp + Az4nMNilfrmQIT8Q/wIAdzI3rsuCGF52bjHvY1p0iSCyDv1zBh5yJcELKeqTvJw6BgDa1IMaFRqK + CnxgS1lej9bmtKxYlyxpilHW6Mg70vjBliLq0aQERR74m0JESth81AypaCPKz9T3wQb+4QbRlibq + OVhNcRqxV8Mm7BAneS+ILbhaJE/WbtMskNBRhZ4ScjpytyN6P+sTw68CK+ZI2ymNozWQ++xsVTR/ + ehswtUp92yNkXwX8U/yiXagrMC1xKpIijnyCtEk7w8sbeEjs19Os1ptAxk6RQc26jWqn3lnrFLpV + NLOklHRgsmppZX2gjlSh3a6YdnBpi8drZUggGqLGV2fITnx5BI56EwlYX13lQezV602POqhl5J1v + 8purbR6HnMu+Ubl7KzoYeEw5CDVX9rWa7824Dbfe3/ERezbcFxAvEk2C6eLU1tsz9fnduWalGGiQ + /pqmqqtU2RxsfAAlfKv7PhUpcj79qTyI9Vg0AMiTW/npiyeyYeCZ7C94jdrs8yMP8oQU+NWn8kDU + Y6pe9EjmG1S+GDhEJWoRj8XprPw0wNE+qJw4PvUKlSw+Foc/7vXPdlFbvCD/L0TlRAMk0rNv0LkA + Oi/wOG+FF2WWJ/mxAaKAd45+iteKp6k//hP6STyJ994RNRJxYEVQSMzmHv12Vx5RwbN38lFep558 + mrEkyk/6hwlIUaKJGoN9esqBr2zmluHfWnZWjeJaqBrIG5bDVpXBfzVgID2CiJD2gKZHtRqpqGc9 + pTwSB1Ve9E7K7IGRkxbE0QFc+0ScRhG5lThWJzgz3UklIFx/RkNRAkbEufueXPcXorJ18L3k94o5 + NT1lufH1Yr3TVBWbmusN2v4bcJ4FmDTtBQS1TDrtKnVBOG6vPgzDVzXmND2/DnDJa0DU6wAsz1t8 + kG+Jvbd+v7d0IaC/6+X0C4DQSqgdMWW838uX0LY37ZKBRPpt0MKJkUVajJ1zU+G0tzVXnI5SouPf + qmFb2nfkJbIc+AC5CZIKYRtMWrs8+vOxOJfxIM+U7oljL1DxR8hNKK2i+pxcnvygy9Peog2fRxS2 + d5LS0v2UIj+iE4oiEXrQX0NhG8JyhC301rLp8YA3ClXkoDSzsGI514rphanQGQ2sIZ0TVb9z3iJ3 + 734iS4yPup+I+eW+2q9c5ueOqHJJ51uGJzJ8PoXzdsLTm8S+C0e62ruK2dB2Llgjgor/I1TTNOVU + QSEX3v2U/fl9eSRVePKDvJIr00G4NxVNB/DmNQE/dAkX//xFv0fqEW7/QBzSOSk+0As+JBQCUnT/ + wHQlBymZc/4/qw476ny2UDp3sVqsOhhllXiQRv/ky+mnu7Dc+xDm4dEbAgzzFJyM4h3IfkegpDhO + BfDotYJ9JHN3AX6FE1bCQD+Sh93u4YnPqKZ8sjKnWc+mXZ2+fDGuLBUzYMMugXOoVK+yv+PsoIgs + 8hjWM2GrT2UQ2BN6H7T351SGOKlXPBPHiyksHZxodop3eDhqNY0rs4q3UF3rFLeKDCR8BpVJNNUu + 6acKmK/3ewiLD0SVIa+n3xXnAu9SLWFf2vmD/KQiOf5r0h/p9pMjgaIh74D8875w73t/Qztde3dR + NZeXvXp1RHQVeYhmG8TLTxddnn0TZ/8eCfzZAzQJU7hLqPMc36H5p0f35LE78sL3xSHsnkGLA9ty + MnSeOw/iH5OvSKe5XerhE2IoLYckBSdLJU8/f289aE253rp2dcFenRn70X8dHwtc+ifGfjgmKfxN + 0Vw0Nlm2x8eow+pmGiECYKrIlZW6V6uHUbvsWLW0re/q3Nf1VsmPYlvRN5VkSynHehIYvDb2ox/9 + XwAAAP//AwAnqKD+vEwAAA== + headers: + api-version: + - '2.30' + cache-control: + - no-cache, no-store, max-age=0 + content-disposition: + - attachment; filename=json.json + content-encoding: + - gzip + content-length: + - '9649' + content-type: + - application/json; charset=utf-8 + date: + - Mon, 15 Nov 2021 23:40:30 UTC + server: + - tsa_b + set-cookie: + - personalization_id="v1_lz79ltUO1v335/LHVR3DFg=="; Max-Age=63072000; Expires=Wed, + 15 Nov 2023 23:40:30 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None + - guest_id=v1%3A163701962951943854; Max-Age=63072000; Expires=Wed, 15 Nov 2023 + 23:40:30 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None + strict-transport-security: + - max-age=631138519 + x-access-level: + - read + x-connection-hash: + - d3dc1553a22da6162c57858cf6023e814bb807bffd4afdc0da26ad788d0577a4 + x-content-type-options: + - nosniff + x-frame-options: + - SAMEORIGIN + x-rate-limit-limit: + - '900' + x-rate-limit-remaining: + - '899' + x-rate-limit-reset: + - '1637020529' + x-response-time: + - '577' + x-xss-protection: + - '0' + status: + code: 200 + message: OK +version: 1 diff --git a/cassettes/test_get_owned_lists.yaml b/cassettes/test_get_owned_lists.yaml new file mode 100644 index 0000000..35087b2 --- /dev/null +++ b/cassettes/test_get_owned_lists.yaml @@ -0,0 +1,69 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - Python/3.10.0 Requests/2.26.0 Tweepy/4.3.0 + method: GET + uri: https://api.twitter.com/2/users/783214/owned_lists + response: + body: + string: !!binary | + H4sIAAAAAAAAAGSRTWuEMBBA/4rk0JOHZEw08dZuS+lBeujeSimuzi6hGiXGLov43xtLS3T3Egbm + vcl8TKQuXUny94nomuSEAc0SwUEoKUAC5ZKSmJiyRZ/cnxHdEB0u0f6snUNL5vjfo0wApxkTQvpH + UmDBezGexcGrnblVpTeFYDTLpFQ05SoNZtG1aNwQYGA8g0xREZhH/Mam69GuMKUU+CZWvT833aFs + ol03Gmcv0X1VLdGVwlOeBOVt7PvOuisE2GqyAmtdboGEJRCAJ3PSBtFqc9pikMIKez0edYVDdBft + xsaNFrcw87sJ8MM4+JrDQhel/UK3KS65TBS/Ka798H+rXw3/EZMWl/tPxB/If/35myE5Y/P8AwAA + //8DABSm4kUcAgAA + headers: + api-version: + - '2.30' + cache-control: + - no-cache, no-store, max-age=0 + content-disposition: + - attachment; filename=json.json + content-encoding: + - gzip + content-length: + - '297' + content-type: + - application/json; charset=utf-8 + date: + - Mon, 15 Nov 2021 23:40:30 UTC + server: + - tsa_b + set-cookie: + - personalization_id="v1_hmzcZD29dnde4bZA2a6wNg=="; Max-Age=63072000; Expires=Wed, + 15 Nov 2023 23:40:30 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None + - guest_id=v1%3A163701963029853787; Max-Age=63072000; Expires=Wed, 15 Nov 2023 + 23:40:30 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None + strict-transport-security: + - max-age=631138519 + x-access-level: + - read + x-connection-hash: + - 0adc0bb14e0c0ac0873d77f4cfc242e33ceefee8a9ab2d454d1d215d7630df22 + x-content-type-options: + - nosniff + x-frame-options: + - SAMEORIGIN + x-rate-limit-limit: + - '15' + x-rate-limit-remaining: + - '14' + x-rate-limit-reset: + - '1637020530' + x-response-time: + - '92' + x-xss-protection: + - '0' + status: + code: 200 + message: OK +version: 1 diff --git a/cassettes/test_manage_list.yaml b/cassettes/test_manage_and_get_pinned_lists.yaml similarity index 65% rename from cassettes/test_manage_list.yaml rename to cassettes/test_manage_and_get_pinned_lists.yaml index 6fe1b77..accae19 100644 --- a/cassettes/test_manage_list.yaml +++ b/cassettes/test_manage_and_get_pinned_lists.yaml @@ -13,17 +13,17 @@ interactions: Content-Type: - application/json User-Agent: - - Python/3.10.0 Requests/2.26.0 Tweepy/4.1.0 + - Python/3.10.0 Requests/2.26.0 Tweepy/4.3.0 method: POST uri: https://api.twitter.com/2/lists response: body: string: !!binary | - H4sIAAAAAAAAAKpWSkksSVSyqlbKTFGyUjI0MTUyNTYzMzQzMjC2tDQ3tDRQ0lHKS8xNBUqGpBaX - KPhkFpco1dYCAAAA//8DAAZ8t6c4AAAA + H4sIAAAAAAAAAKpWSkksSVSyqlbKTFGyUjI0MTMwtjQysjSzMDKyMDQyszBV0lHKS8xNBUqGpBaX + KPhkFpco1dYCAAAA//8DAFYqGlw4AAAA headers: api-version: - - '2.27' + - '2.30' cache-control: - no-cache, no-store, max-age=0 content-disposition: @@ -35,22 +35,22 @@ interactions: content-type: - application/json; charset=utf-8 date: - - Mon, 25 Oct 2021 07:24:50 UTC + - Mon, 15 Nov 2021 23:40:31 UTC location: - - https://api.twitter.com/2/lists/1452536616203997190 + - https://api.twitter.com/2/lists/1460392296822812685 server: - tsa_b set-cookie: - - personalization_id="v1_f6Q7tQ/Do3NkovyN4sJfog=="; Max-Age=63072000; Expires=Wed, - 25 Oct 2023 07:24:50 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None - - guest_id=v1%3A163514669039140044; Max-Age=63072000; Expires=Wed, 25 Oct 2023 - 07:24:50 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None + - personalization_id="v1_k+MErbX/xD8eWgq/YrNd0Q=="; Max-Age=63072000; Expires=Wed, + 15 Nov 2023 23:40:31 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None + - guest_id=v1%3A163701963092846827; Max-Age=63072000; Expires=Wed, 15 Nov 2023 + 23:40:31 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None strict-transport-security: - max-age=631138519 x-access-level: - read-write-directmessages x-connection-hash: - - b20657636698db22333ea81a4e5d78f071184b672a5e536b229e6cada14038b3 + - 6f6a7fa4a224bf36b49ae9bb1b0a07624359e343ddbccbafeed39d860e77a63d x-content-type-options: - nosniff x-frame-options: @@ -58,11 +58,11 @@ interactions: x-rate-limit-limit: - '300' x-rate-limit-remaining: - - '299' + - '298' x-rate-limit-reset: - - '1635147590' + - '1637019827' x-response-time: - - '412' + - '243' x-xss-protection: - '0' status: @@ -82,18 +82,18 @@ interactions: Content-Type: - application/json Cookie: - - guest_id=v1%3A163514669039140044; personalization_id="v1_f6Q7tQ/Do3NkovyN4sJfog==" + - guest_id=v1%3A163701963092846827; personalization_id="v1_k+MErbX/xD8eWgq/YrNd0Q==" User-Agent: - - Python/3.10.0 Requests/2.26.0 Tweepy/4.1.0 + - Python/3.10.0 Requests/2.26.0 Tweepy/4.3.0 method: POST - uri: https://api.twitter.com/2/lists/1452536616203997190/members + uri: https://api.twitter.com/2/lists/1460392296822812685/members response: body: string: !!binary | H4sIAAAAAAAAAKpWSkksSVSyqlbKLI7PTc1NSi1SsiopKk2trQUAAAD//wMAl7jcXBsAAAA= headers: api-version: - - '2.27' + - '2.30' cache-control: - no-cache, no-store, max-age=0 content-disposition: @@ -105,7 +105,7 @@ interactions: content-type: - application/json; charset=utf-8 date: - - Mon, 25 Oct 2021 07:24:50 UTC + - Mon, 15 Nov 2021 23:40:31 UTC server: - tsa_b strict-transport-security: @@ -113,7 +113,7 @@ interactions: x-access-level: - read-write-directmessages x-connection-hash: - - b20657636698db22333ea81a4e5d78f071184b672a5e536b229e6cada14038b3 + - 6f6a7fa4a224bf36b49ae9bb1b0a07624359e343ddbccbafeed39d860e77a63d x-content-type-options: - nosniff x-frame-options: @@ -123,16 +123,16 @@ interactions: x-rate-limit-remaining: - '299' x-rate-limit-reset: - - '1635147589' + - '1637020531' x-response-time: - - '101' + - '119' x-xss-protection: - '0' status: code: 200 message: OK - request: - body: '{"list_id": "1452536616203997190"}' + body: '{"list_id": "1460392296822812685"}' headers: Accept: - '*/*' @@ -145,9 +145,9 @@ interactions: Content-Type: - application/json Cookie: - - guest_id=v1%3A163514669039140044; personalization_id="v1_f6Q7tQ/Do3NkovyN4sJfog==" + - guest_id=v1%3A163701963092846827; personalization_id="v1_k+MErbX/xD8eWgq/YrNd0Q==" User-Agent: - - Python/3.10.0 Requests/2.26.0 Tweepy/4.1.0 + - Python/3.10.0 Requests/2.26.0 Tweepy/4.3.0 method: POST uri: https://api.twitter.com/2/users/1072250532645998596/pinned_lists response: @@ -156,7 +156,7 @@ interactions: H4sIAAAAAAAAAKpWSkksSVSyqlYqyMzLS01RsiopKk2trQUAAAD//wMAEmYA3BgAAAA= headers: api-version: - - '2.27' + - '2.30' cache-control: - no-cache, no-store, max-age=0 content-disposition: @@ -168,7 +168,7 @@ interactions: content-type: - application/json; charset=utf-8 date: - - Mon, 25 Oct 2021 07:24:51 UTC + - Mon, 15 Nov 2021 23:40:31 UTC server: - tsa_b strict-transport-security: @@ -176,7 +176,7 @@ interactions: x-access-level: - read-write-directmessages x-connection-hash: - - b20657636698db22333ea81a4e5d78f071184b672a5e536b229e6cada14038b3 + - 6f6a7fa4a224bf36b49ae9bb1b0a07624359e343ddbccbafeed39d860e77a63d x-content-type-options: - nosniff x-frame-options: @@ -184,11 +184,71 @@ interactions: x-rate-limit-limit: - '50' x-rate-limit-remaining: - - '49' + - '48' + x-rate-limit-reset: + - '1637019837' + x-response-time: + - '52' + x-xss-protection: + - '0' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Cookie: + - guest_id=v1%3A163701963092846827; personalization_id="v1_k+MErbX/xD8eWgq/YrNd0Q==" + User-Agent: + - Python/3.10.0 Requests/2.26.0 Tweepy/4.3.0 + method: GET + uri: https://api.twitter.com/2/users/1072250532645998596/pinned_lists + response: + body: + string: !!binary | + H4sIAAAAAAAAAKpWSkksSVSyiq5WykxRslIyNDEzMLY0MrI0szAysjA0MrMwVdJRykvMTQVKhqQW + lyj4ZBaXKNXG6ijlpoI0VisVpRaX5pTEJ+eX5pUoWRnW1gIAAAD//wMAQp76YVQAAAA= + headers: + api-version: + - '2.30' + cache-control: + - no-cache, no-store, max-age=0 + content-disposition: + - attachment; filename=json.json + content-encoding: + - gzip + content-length: + - '107' + content-type: + - application/json; charset=utf-8 + date: + - Mon, 15 Nov 2021 23:40:31 UTC + server: + - tsa_b + strict-transport-security: + - max-age=631138519 + x-access-level: + - read-write-directmessages + x-connection-hash: + - 6f6a7fa4a224bf36b49ae9bb1b0a07624359e343ddbccbafeed39d860e77a63d + x-content-type-options: + - nosniff + x-frame-options: + - SAMEORIGIN + x-rate-limit-limit: + - '15' + x-rate-limit-remaining: + - '13' x-rate-limit-reset: - - '1635147591' + - '1637019842' x-response-time: - - '47' + - '45' x-xss-protection: - '0' status: @@ -206,18 +266,18 @@ interactions: Content-Length: - '0' Cookie: - - guest_id=v1%3A163514669039140044; personalization_id="v1_f6Q7tQ/Do3NkovyN4sJfog==" + - guest_id=v1%3A163701963092846827; personalization_id="v1_k+MErbX/xD8eWgq/YrNd0Q==" User-Agent: - - Python/3.10.0 Requests/2.26.0 Tweepy/4.1.0 + - Python/3.10.0 Requests/2.26.0 Tweepy/4.3.0 method: DELETE - uri: https://api.twitter.com/2/lists/1452536616203997190/members/783214 + uri: https://api.twitter.com/2/lists/1460392296822812685/members/783214 response: body: string: !!binary | H4sIAAAAAAAAAKpWSkksSVSyqlbKLI7PTc1NSi1SskpLzClOra0FAAAA//8DAPnKNe0cAAAA headers: api-version: - - '2.27' + - '2.30' cache-control: - no-cache, no-store, max-age=0 content-disposition: @@ -229,7 +289,7 @@ interactions: content-type: - application/json; charset=utf-8 date: - - Mon, 25 Oct 2021 07:24:51 UTC + - Mon, 15 Nov 2021 23:40:31 UTC server: - tsa_b strict-transport-security: @@ -237,7 +297,7 @@ interactions: x-access-level: - read-write-directmessages x-connection-hash: - - b20657636698db22333ea81a4e5d78f071184b672a5e536b229e6cada14038b3 + - 6f6a7fa4a224bf36b49ae9bb1b0a07624359e343ddbccbafeed39d860e77a63d x-content-type-options: - nosniff x-frame-options: @@ -247,9 +307,9 @@ interactions: x-rate-limit-remaining: - '299' x-rate-limit-reset: - - '1635147591' + - '1637020531' x-response-time: - - '66' + - '58' x-xss-protection: - '0' status: @@ -267,18 +327,18 @@ interactions: Content-Length: - '0' Cookie: - - guest_id=v1%3A163514669039140044; personalization_id="v1_f6Q7tQ/Do3NkovyN4sJfog==" + - guest_id=v1%3A163701963092846827; personalization_id="v1_k+MErbX/xD8eWgq/YrNd0Q==" User-Agent: - - Python/3.10.0 Requests/2.26.0 Tweepy/4.1.0 + - Python/3.10.0 Requests/2.26.0 Tweepy/4.3.0 method: DELETE - uri: https://api.twitter.com/2/users/1072250532645998596/pinned_lists/1452536616203997190 + uri: https://api.twitter.com/2/users/1072250532645998596/pinned_lists/1460392296822812685 response: body: string: !!binary | H4sIAAAAAAAAAKpWSkksSVSyqlYqyMzLS01RskpLzClOra0FAAAA//8DAIhhZ3AZAAAA headers: api-version: - - '2.27' + - '2.30' cache-control: - no-cache, no-store, max-age=0 content-disposition: @@ -290,7 +350,7 @@ interactions: content-type: - application/json; charset=utf-8 date: - - Mon, 25 Oct 2021 07:24:51 UTC + - Mon, 15 Nov 2021 23:40:31 UTC server: - tsa_b strict-transport-security: @@ -298,7 +358,7 @@ interactions: x-access-level: - read-write-directmessages x-connection-hash: - - b20657636698db22333ea81a4e5d78f071184b672a5e536b229e6cada14038b3 + - 6f6a7fa4a224bf36b49ae9bb1b0a07624359e343ddbccbafeed39d860e77a63d x-content-type-options: - nosniff x-frame-options: @@ -308,7 +368,7 @@ interactions: x-rate-limit-remaining: - '49' x-rate-limit-reset: - - '1635147591' + - '1637020531' x-response-time: - '46' x-xss-protection: @@ -330,18 +390,18 @@ interactions: Content-Type: - application/json Cookie: - - guest_id=v1%3A163514669039140044; personalization_id="v1_f6Q7tQ/Do3NkovyN4sJfog==" + - guest_id=v1%3A163701963092846827; personalization_id="v1_k+MErbX/xD8eWgq/YrNd0Q==" User-Agent: - - Python/3.10.0 Requests/2.26.0 Tweepy/4.1.0 + - Python/3.10.0 Requests/2.26.0 Tweepy/4.3.0 method: PUT - uri: https://api.twitter.com/2/lists/1452536616203997190 + uri: https://api.twitter.com/2/lists/1460392296822812685 response: body: string: !!binary | - H4sIAAAAAAAAAKpWKi1ISSxJTVGyKikqTa0FAAAA//8DACu2J84QAAAA + H4sIAAAAAAAAAKpWSkksSVSyqlYqLQCyUlOUrEqKSlNrawEAAAD//wMAiqN2DBkAAAA= headers: api-version: - - '2.27' + - '2.30' cache-control: - no-cache, no-store, max-age=0 content-disposition: @@ -349,11 +409,11 @@ interactions: content-encoding: - gzip content-length: - - '42' + - '50' content-type: - application/json; charset=utf-8 date: - - Mon, 25 Oct 2021 07:24:51 UTC + - Mon, 15 Nov 2021 23:40:32 UTC server: - tsa_b strict-transport-security: @@ -361,7 +421,7 @@ interactions: x-access-level: - read-write-directmessages x-connection-hash: - - b20657636698db22333ea81a4e5d78f071184b672a5e536b229e6cada14038b3 + - 6f6a7fa4a224bf36b49ae9bb1b0a07624359e343ddbccbafeed39d860e77a63d x-content-type-options: - nosniff x-frame-options: @@ -369,11 +429,11 @@ interactions: x-rate-limit-limit: - '300' x-rate-limit-remaining: - - '298' + - '299' x-rate-limit-reset: - - '1635147202' + - '1637020531' x-response-time: - - '387' + - '182' x-xss-protection: - '0' status: @@ -391,18 +451,18 @@ interactions: Content-Length: - '0' Cookie: - - guest_id=v1%3A163514669039140044; personalization_id="v1_f6Q7tQ/Do3NkovyN4sJfog==" + - guest_id=v1%3A163701963092846827; personalization_id="v1_k+MErbX/xD8eWgq/YrNd0Q==" User-Agent: - - Python/3.10.0 Requests/2.26.0 Tweepy/4.1.0 + - Python/3.10.0 Requests/2.26.0 Tweepy/4.3.0 method: DELETE - uri: https://api.twitter.com/2/lists/1452536616203997190 + uri: https://api.twitter.com/2/lists/1460392296822812685 response: body: string: !!binary | H4sIAAAAAAAAAKpWSkksSVSyqlZKSc1JLUlNUbIqKSpNra0FAAAA//8DAD5d+0oZAAAA headers: api-version: - - '2.27' + - '2.30' cache-control: - no-cache, no-store, max-age=0 content-disposition: @@ -414,7 +474,7 @@ interactions: content-type: - application/json; charset=utf-8 date: - - Mon, 25 Oct 2021 07:24:51 UTC + - Mon, 15 Nov 2021 23:40:32 UTC server: - tsa_b strict-transport-security: @@ -422,7 +482,7 @@ interactions: x-access-level: - read-write-directmessages x-connection-hash: - - b20657636698db22333ea81a4e5d78f071184b672a5e536b229e6cada14038b3 + - 6f6a7fa4a224bf36b49ae9bb1b0a07624359e343ddbccbafeed39d860e77a63d x-content-type-options: - nosniff x-frame-options: @@ -430,11 +490,11 @@ interactions: x-rate-limit-limit: - '300' x-rate-limit-remaining: - - '299' + - '298' x-rate-limit-reset: - - '1635147591' + - '1637019854' x-response-time: - - '50' + - '48' x-xss-protection: - '0' status: diff --git a/docs/client.rst b/docs/client.rst index 5665dd3..c93b25c 100644 --- a/docs/client.rst +++ b/docs/client.rst @@ -124,23 +124,49 @@ +--------------------------------------------------------------+----------------------------------------+ | .. centered:: :ref:`Lists` | +-------------------------------------------------------------------------------------------------------+ - | .. centered:: |Manage Lists|_ | + | .. centered:: |List Tweets lookup|_ | +--------------------------------------------------------------+----------------------------------------+ - | `DELETE /2/lists/:id`_ | :meth:`Client.delete_list` | + | `GET /2/lists/:id/tweets`_ | :meth:`Client.get_list_tweets` | +--------------------------------------------------------------+----------------------------------------+ - | `DELETE /2/lists/:id/members/:user_id`_ | :meth:`Client.remove_list_member` | + | .. centered:: |List follows|_ | +--------------------------------------------------------------+----------------------------------------+ | `DELETE /2/users/:id/followed_lists/:list_id`_ | :meth:`Client.unfollow_list` | +--------------------------------------------------------------+----------------------------------------+ - | `DELETE /2/users/:id/pinned_lists/:list_id`_ | :meth:`Client.unpin_list` | + | `GET /2/lists/:id/followers`_ | :meth:`Client.get_list_followers` | + +--------------------------------------------------------------+----------------------------------------+ + | `GET /2/users/:id/followed_lists`_ | :meth:`Client.get_followed_lists` | + +--------------------------------------------------------------+----------------------------------------+ + | `POST /2/users/:id/followed_lists`_ | :meth:`Client.follow_list` | + +--------------------------------------------------------------+----------------------------------------+ + | .. centered:: |List lookup|_ | + +--------------------------------------------------------------+----------------------------------------+ + | `GET /2/lists/:id`_ | :meth:`Client.get_list` | + +--------------------------------------------------------------+----------------------------------------+ + | `GET /2/users/:id/owned_lists`_ | :meth:`Client.get_owned_lists` | + +--------------------------------------------------------------+----------------------------------------+ + | .. centered:: |List members|_ | + +--------------------------------------------------------------+----------------------------------------+ + | `DELETE /2/lists/:id/members/:user_id`_ | :meth:`Client.remove_list_member` | + +--------------------------------------------------------------+----------------------------------------+ + | `GET /2/lists/:id/members`_ | :meth:`Client.get_list_members` | + +--------------------------------------------------------------+----------------------------------------+ + | `GET /2/users/:id/list_memberships`_ | :meth:`Client.get_list_memberships` | + +--------------------------------------------------------------+----------------------------------------+ + | `POST /2/lists/:id/members`_ | :meth:`Client.add_list_member` | + +--------------------------------------------------------------+----------------------------------------+ + | .. centered:: |Manage Lists|_ | + +--------------------------------------------------------------+----------------------------------------+ + | `DELETE /2/lists/:id`_ | :meth:`Client.delete_list` | +--------------------------------------------------------------+----------------------------------------+ | `PUT /2/lists/:id`_ | :meth:`Client.update_list` | +--------------------------------------------------------------+----------------------------------------+ | `POST /2/lists`_ | :meth:`Client.create_list` | +--------------------------------------------------------------+----------------------------------------+ - | `POST /2/lists/:id/members`_ | :meth:`Client.add_list_member` | + | .. centered:: |Pinned Lists|_ | +--------------------------------------------------------------+----------------------------------------+ - | `POST /2/users/:id/followed_lists`_ | :meth:`Client.follow_list` | + | `DELETE /2/users/:id/pinned_lists/:list_id`_ | :meth:`Client.unpin_list` | + +--------------------------------------------------------------+----------------------------------------+ + | `GET /2/users/:id/pinned_lists`_ | :meth:`Client.get_pinned_lists` | +--------------------------------------------------------------+----------------------------------------+ | `POST /2/users/:id/pinned_lists`_ | :meth:`Client.pin_list` | +--------------------------------------------------------------+----------------------------------------+ @@ -205,16 +231,29 @@ .. _GET /2/spaces: https://developer.twitter.com/en/docs/twitter-api/spaces/lookup/api-reference/get-spaces .. _GET /2/spaces/by/creator_ids: https://developer.twitter.com/en/docs/twitter-api/spaces/lookup/api-reference/get-spaces-by-creator-ids .. _GET /2/spaces/:id: https://developer.twitter.com/en/docs/twitter-api/spaces/lookup/api-reference/get-spaces-id +.. |List Tweets lookup| replace:: *List Tweets lookup* +.. _GET /2/lists/:id/tweets: https://developer.twitter.com/en/docs/twitter-api/lists/list-tweets/api-reference/get-lists-id-tweets +.. |List follows| replace:: *List follows* +.. _DELETE /2/users/:id/followed_lists/:list_id: https://developer.twitter.com/en/docs/twitter-api/lists/list-follows/api-reference/delete-users-id-followed-lists-list_id +.. _GET /2/lists/:id/followers: https://developer.twitter.com/en/docs/twitter-api/lists/list-follows/api-reference/get-lists-id-followers +.. _GET /2/users/:id/followed_lists: https://developer.twitter.com/en/docs/twitter-api/lists/list-follows/api-reference/get-users-id-followed_lists +.. _POST /2/users/:id/followed_lists: https://developer.twitter.com/en/docs/twitter-api/lists/list-follows/api-reference/post-users-id-followed-lists +.. |List lookup| replace:: *List lookup* +.. _GET /2/lists/:id: https://developer.twitter.com/en/docs/twitter-api/lists/list-lookup/api-reference/get-lists-id +.. _GET /2/users/:id/owned_lists: https://developer.twitter.com/en/docs/twitter-api/lists/list-lookup/api-reference/get-users-id-owned_lists +.. |List members| replace:: *List members* +.. _DELETE /2/lists/:id/members/:user_id: https://developer.twitter.com/en/docs/twitter-api/lists/list-members/api-reference/delete-lists-id-members-user_id +.. _GET /2/lists/:id/members: https://developer.twitter.com/en/docs/twitter-api/lists/list-members/api-reference/get-lists-id-members +.. _GET /2/users/:id/list_memberships: https://developer.twitter.com/en/docs/twitter-api/lists/list-members/api-reference/get-users-id-list_memberships +.. _POST /2/lists/:id/members: https://developer.twitter.com/en/docs/twitter-api/lists/list-members/api-reference/post-lists-id-members .. |Manage Lists| replace:: *Manage Lists* .. _DELETE /2/lists/:id: https://developer.twitter.com/en/docs/twitter-api/lists/manage-lists/api-reference/delete-lists-id -.. _DELETE /2/lists/:id/members/:user_id: https://developer.twitter.com/en/docs/twitter-api/lists/manage-lists/api-reference/delete-lists-id-members-user_id -.. _DELETE /2/users/:id/followed_lists/:list_id: https://developer.twitter.com/en/docs/twitter-api/lists/manage-lists/api-reference/delete-users-id-followed-lists-list_id -.. _DELETE /2/users/:id/pinned_lists/:list_id: https://developer.twitter.com/en/docs/twitter-api/lists/manage-lists/api-reference/delete-users-id-pinned-lists-list_id .. _PUT /2/lists/:id: https://developer.twitter.com/en/docs/twitter-api/lists/manage-lists/api-reference/put-lists-id .. _POST /2/lists: https://developer.twitter.com/en/docs/twitter-api/lists/manage-lists/api-reference/post-lists -.. _POST /2/lists/:id/members: https://developer.twitter.com/en/docs/twitter-api/lists/manage-lists/api-reference/post-lists-id-members -.. _POST /2/users/:id/followed_lists: https://developer.twitter.com/en/docs/twitter-api/lists/manage-lists/api-reference/post-users-id-followed-lists -.. _POST /2/users/:id/pinned_lists: https://developer.twitter.com/en/docs/twitter-api/lists/manage-lists/api-reference/post-users-id-pinned-lists +.. |Pinned Lists| replace:: *Pinned Lists* +.. _DELETE /2/users/:id/pinned_lists/:list_id: https://developer.twitter.com/en/docs/twitter-api/lists/pinned-lists/api-reference/delete-users-id-pinned-lists-list_id +.. _GET /2/users/:id/pinned_lists: https://developer.twitter.com/en/docs/twitter-api/lists/pinned-lists/api-reference/get-users-id-pinned_lists +.. _POST /2/users/:id/pinned_lists: https://developer.twitter.com/en/docs/twitter-api/lists/pinned-lists/api-reference/post-users-id-pinned-lists .. |Batch Compliance| replace:: *Batch Compliance* .. _GET /2/compliance/jobs: https://developer.twitter.com/en/docs/twitter-api/compliance/batch-compliance/api-reference/get-compliance-jobs .. _GET /2/compliance/jobs/:id: https://developer.twitter.com/en/docs/twitter-api/compliance/batch-compliance/api-reference/get-compliance-jobs-id @@ -346,24 +385,55 @@ Spaces lookup Lists ===== -Manage Lists +List Tweets lookup +------------------ + +.. automethod:: Client.get_list_tweets + +List follows ------------ -.. automethod:: Client.delete_list +.. automethod:: Client.unfollow_list + +.. automethod:: Client.get_list_followers + +.. automethod:: Client.get_followed_lists + +.. automethod:: Client.follow_list + +List lookup +----------- + +.. automethod:: Client.get_list + +.. automethod:: Client.get_owned_lists + +List members +------------ .. automethod:: Client.remove_list_member -.. automethod:: Client.unfollow_list +.. automethod:: Client.get_list_members -.. automethod:: Client.unpin_list +.. automethod:: Client.get_list_memberships + +.. automethod:: Client.add_list_member + +Manage Lists +------------ + +.. automethod:: Client.delete_list .. automethod:: Client.update_list .. automethod:: Client.create_list -.. automethod:: Client.add_list_member +Pinned Lists +------------ -.. automethod:: Client.follow_list +.. automethod:: Client.unpin_list + +.. automethod:: Client.get_pinned_lists .. automethod:: Client.pin_list @@ -387,12 +457,16 @@ Expansions and Fields Parameters ``expansions`` -------------- `Expansions`_ enable you to request additional data objects that relate to the -originally returned Space, Tweets, or users. Submit a list of desired +originally returned List, Space, Tweets, or users. Submit a list of desired expansions in a comma-separated list without spaces. The ID that represents the -expanded data object will be included directly in the Space, Tweet, or user -data object, but the expanded object metadata will be returned within the +expanded data object will be included directly in the List, Space, Tweet, or +user data object, but the expanded object metadata will be returned within the ``includes`` response object, and will also include the ID so that you can -match this data object to the original Space or Tweet object. +match this data object to the original Space, Tweet, or user object. + +At this time, the only expansion available to endpoints that primarily return +List objects is ``expansions=owner_id``. You will find the expanded user data +object living in the ``includes`` response object. For methods that return Spaces, the following data objects can be expanded using this parameter: @@ -419,6 +493,15 @@ At this time, the only expansion available to endpoints that primarily return user objects is ``expansions=pinned_tweet_id``. You will find the expanded Tweet data object living in the ``includes`` response object. +.. _list_fields_parameter: + +``list_fields`` +--------------- +This `fields`_ parameter enables you to select which specific `List fields`_ +will deliver with each returned List objects. Specify the desired fields in a +comma-separated list without spaces between commas and fields. These specified +List fields will display directly in the List data objects. + .. _media_fields_parameter: ``media_fields`` @@ -516,6 +599,7 @@ user data objects. .. _Expansions: https://developer.twitter.com/en/docs/twitter-api/expansions .. _fields: https://developer.twitter.com/en/docs/twitter-api/fields +.. _list fields: https://developer.twitter.com/en/docs/twitter-api/data-dictionary/object-model/lists .. _media fields: https://developer.twitter.com/en/docs/twitter-api/data-dictionary/object-model/media .. _place fields: https://developer.twitter.com/en/docs/twitter-api/data-dictionary/object-model/place .. _poll fields: https://developer.twitter.com/en/docs/twitter-api/data-dictionary/object-model/poll diff --git a/docs/models.rst b/docs/models.rst index 559bbdc..208f8e7 100644 --- a/docs/models.rst +++ b/docs/models.rst @@ -56,6 +56,12 @@ Models Reference .. versionadded:: 4.0 + .. class:: tweepy.List + + .. versionadded:: 4.4 + + :reference: https://developer.twitter.com/en/docs/twitter-api/data-dictionary/object-model/lists + .. class:: tweepy.Media :reference: https://developer.twitter.com/en/docs/twitter-api/data-dictionary/object-model/media diff --git a/tests/test_client.py b/tests/test_client.py index c4f1313..eb3aa58 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -154,19 +154,56 @@ class TweepyTestCase(unittest.TestCase): # https://twitter.com/TwitterSpaces/status/1436382283347283969 self.client.get_space(space_id) + @tape.use_cassette("test_get_list_tweets.yaml", serializer="yaml") + def test_get_list_tweets(self): + list_id = 84839422 # List ID for Official Twitter Accounts (@Twitter) + self.client.get_list_tweets(list_id) + @tape.use_cassette("test_follow_and_unfollow_list.yaml", serializer="yaml") def test_follow_and_unfollow_list(self): list_id = 84839422 # List ID for Official Twitter Accounts (@Twitter) self.client.follow_list(list_id) self.client.unfollow_list(list_id) - @tape.use_cassette("test_manage_list.yaml", serializer="yaml") - def test_manage_list(self): + @tape.use_cassette("test_get_list_followers.yaml", serializer="yaml") + def test_get_list_followers(self): + list_id = 84839422 # List ID for Official Twitter Accounts (@Twitter) + self.client.get_list_followers(list_id) + + @tape.use_cassette("test_get_followed_lists.yaml", serializer="yaml") + def test_get_followed_lists(self): + user_id = 372575989 # User ID for @TwitterNews + self.client.get_followed_lists(user_id) + + @tape.use_cassette("test_get_list.yaml", serializer="yaml") + def test_get_list(self): + list_id = 84839422 # List ID for Official Twitter Accounts (@Twitter) + self.client.get_list(list_id) + + @tape.use_cassette("test_get_owned_lists.yaml", serializer="yaml") + def test_get_owned_lists(self): + user_id = 783214 # User ID for @Twitter + self.client.get_owned_lists(user_id) + + @tape.use_cassette("test_get_list_members.yaml", serializer="yaml") + def test_get_list_members(self): + list_id = 84839422 # List ID for Official Twitter Accounts (@Twitter) + self.client.get_list_members(list_id) + + @tape.use_cassette("test_get_list_memberships.yaml", serializer="yaml") + def test_get_list_memberships(self): + user_id = 783214 # User ID for @Twitter + self.client.get_list_memberships(user_id) + + @tape.use_cassette("test_manage_and_get_pinned_lists.yaml", + serializer="yaml") + def test_manage_and_get_pinned_lists(self): response = self.client.create_list("Test List", private=True) list_id = response.data["id"] user_id = 783214 # User ID for @Twitter self.client.add_list_member(list_id, user_id) self.client.pin_list(list_id) + self.client.get_pinned_lists() self.client.remove_list_member(list_id, user_id) self.client.unpin_list(list_id) self.client.update_list(list_id, description="Test List Description") diff --git a/tweepy/__init__.py b/tweepy/__init__.py index c9632dd..0609b94 100644 --- a/tweepy/__init__.py +++ b/tweepy/__init__.py @@ -18,6 +18,7 @@ from tweepy.errors import ( BadRequest, Forbidden, HTTPException, NotFound, TooManyRequests, TweepyException, TwitterServerError, Unauthorized ) +from tweepy.list import List from tweepy.media import Media from tweepy.pagination import Paginator from tweepy.place import Place diff --git a/tweepy/client.py b/tweepy/client.py index 52c974b..1a05640 100644 --- a/tweepy/client.py +++ b/tweepy/client.py @@ -17,6 +17,7 @@ from tweepy.errors import ( BadRequest, Forbidden, HTTPException, TooManyRequests, TwitterServerError, Unauthorized ) +from tweepy.list import List from tweepy.media import Media from tweepy.place import Place from tweepy.poll import Poll @@ -1864,17 +1865,66 @@ class Client: ), data_type=Space ) - # Manage Lists + # List Tweets lookup - def delete_list(self, id): - """Enables the authenticated user to delete a List that they own. + def get_list_tweets(self, id, *, user_auth=False, **params): + """get_list_tweets(id, *, user_auth=False, expansions, max_results, \ + pagination_token, tweet_fields, user_fields) + + Returns a list of Tweets from the specified List. + + .. versionadded:: 4.4 + + Parameters + ---------- + id : Union[List[str], str] + The ID of the List whose Tweets you would like to retrieve. + user_auth : bool + Whether or not to use OAuth 1.0a User context + expansions : Union[List[str], str] + :ref:`expansions_parameter` + max_results : int + The maximum number of results to be returned per page. This can be + a number between 1 and 100. By default, each page will return 100 + results. + pagination_token : str + Used to request the next page of results if all results weren't + returned with the latest request, or to go back to the previous + page of results. To return the next page, pass the next_token + returned in your previous response. To go back one page, pass the + previous_token returned in your previous response. + tweet_fields : Union[List[str], str] + :ref:`tweet_fields_parameter` + user_fields : Union[List[str], str] + :ref:`user_fields_parameter` + + Returns + ------- + Union[dict, requests.Response, Response] + + References + ---------- + https://developer.twitter.com/en/docs/twitter-api/lists/list-tweets/api-reference/get-lists-id-tweets + """ + return self._make_request( + "GET", f"/2/lists/{id}/tweets", params=params, + endpoint_parameters=( + "expansions", "max_results", "pagination_token", + "tweet.fields", "user.fields" + ), data_type=Tweet, user_auth=user_auth + ) + + # List follows + + def unfollow_list(self, list_id): + """Enables the authenticated user to unfollow a List. .. versionadded:: 4.2 Parameters ---------- - id : Union[int, str] - The ID of the List to be deleted. + list_id : Union[int, str] + The ID of the List that you would like the user to unfollow. Returns ------- @@ -1882,13 +1932,225 @@ class Client: References ---------- - https://developer.twitter.com/en/docs/twitter-api/lists/manage-lists/api-reference/delete-lists-id + https://developer.twitter.com/en/docs/twitter-api/lists/list-follows/api-reference/delete-users-id-followed-lists-list_id """ + id = self.access_token.partition('-')[0] + route = f"/2/users/{id}/followed_lists/{list_id}" return self._make_request( - "DELETE", f"/2/lists/{id}", user_auth=True + "DELETE", route, user_auth=True ) + def get_list_followers(self, id, *, user_auth=False, **params): + """get_list_followers( \ + id, *, user_auth=False, expansions, max_results, \ + pagination_token, tweet_fields, user_fields \ + ) + + Returns a list of users who are followers of the specified List. + + .. versionadded:: 4.4 + + Parameters + ---------- + id : Union[List[str], str] + The ID of the List whose followers you would like to retrieve. + user_auth : bool + Whether or not to use OAuth 1.0a User context + expansions : Union[List[str], str] + :ref:`expansions_parameter` + max_results : int + The maximum number of results to be returned per page. This can be + a number between 1 and 100. By default, each page will return 100 + results. + pagination_token : str + Used to request the next page of results if all results weren't + returned with the latest request, or to go back to the previous + page of results. To return the next page, pass the next_token + returned in your previous response. To go back one page, pass the + previous_token returned in your previous response. + tweet_fields : Union[List[str], str] + :ref:`tweet_fields_parameter` + user_fields : Union[List[str], str] + :ref:`user_fields_parameter` + + Returns + ------- + Union[dict, requests.Response, Response] + + References + ---------- + https://developer.twitter.com/en/docs/twitter-api/lists/list-follows/api-reference/get-lists-id-followers + """ + return self._make_request( + "GET", f"/2/lists/{id}/followers", params=params, + endpoint_parameters=( + "expansions", "max_results", "pagination_token", + "tweet.fields", "user.fields" + ), data_type=User, user_auth=user_auth + ) + + def get_followed_lists(self, id, *, user_auth=False, **params): + """get_followed_lists( \ + id, *, user_auth=False, expansions, list_fields, max_results, \ + pagination_token, user_fields \ + ) + + Returns all Lists a specified user follows. + + .. versionadded:: 4.4 + + Parameters + ---------- + id : Union[List[str], str] + The user ID whose followed Lists you would like to retrieve. + user_auth : bool + Whether or not to use OAuth 1.0a User context + expansions : Union[List[str], str] + :ref:`expansions_parameter` + list_fields : Union[List[str], str] + :ref:`list_fields_parameter` + max_results : int + The maximum number of results to be returned per page. This can be + a number between 1 and 100. By default, each page will return 100 + results. + pagination_token : str + Used to request the next page of results if all results weren't + returned with the latest request, or to go back to the previous + page of results. To return the next page, pass the next_token + returned in your previous response. To go back one page, pass the + previous_token returned in your previous response. + user_fields : Union[List[str], str] + :ref:`user_fields_parameter` + + Returns + ------- + Union[dict, requests.Response, Response] + + References + ---------- + https://developer.twitter.com/en/docs/twitter-api/lists/list-follows/api-reference/get-users-id-followed_lists + """ + return self._make_request( + "GET", f"/2/users/{id}/followed_lists", params=params, + endpoint_parameters=( + "expansions", "list.fields", "max_results", "pagination_token", + "user.fields" + ), data_type=List, user_auth=user_auth + ) + + def follow_list(self, list_id): + """Enables the authenticated user to follow a List. + + .. versionadded:: 4.2 + + Parameters + ---------- + list_id : Union[int, str] + The ID of the List that you would like the user to follow. + + Returns + ------- + Union[dict, requests.Response, Response] + + References + ---------- + https://developer.twitter.com/en/docs/twitter-api/lists/list-follows/api-reference/post-users-id-followed-lists + """ + id = self.access_token.partition('-')[0] + route = f"/2/users/{id}/followed_lists" + + return self._make_request( + "POST", route, json={"list_id": str(list_id)}, user_auth=True + ) + + # List lookup + + def get_list(self, id, *, user_auth=False, **params): + """get_list(id, *, user_auth=False, expansions, list_fields, \ + user_fields) + + Returns the details of a specified List. + + .. versionadded:: 4.4 + + Parameters + ---------- + id : Union[List[str], str] + The ID of the List to lookup. + user_auth : bool + Whether or not to use OAuth 1.0a User context + expansions : Union[List[str], str] + :ref:`expansions_parameter` + list_fields : Union[List[str], str] + :ref:`list_fields_parameter` + user_fields : Union[List[str], str] + :ref:`user_fields_parameter` + + Returns + ------- + Union[dict, requests.Response, Response] + + References + ---------- + https://developer.twitter.com/en/docs/twitter-api/lists/list-lookup/api-reference/get-lists-id + """ + return self._make_request( + "GET", f"/2/lists/{id}", params=params, + endpoint_parameters=( + "expansions", "list.fields", "user.fields" + ), data_type=List, user_auth=user_auth + ) + + def get_owned_lists(self, id, *, user_auth=False, **params): + """get_owned_lists(id, *, user_auth=False, expansions, list_fields, \ + max_results, pagination_token, user_fields) + + Returns all Lists owned by the specified user. + + .. versionadded:: 4.4 + + Parameters + ---------- + id : Union[List[str], str] + The user ID whose owned Lists you would like to retrieve. + user_auth : bool + Whether or not to use OAuth 1.0a User context + expansions : Union[List[str], str] + :ref:`expansions_parameter` + list_fields : Union[List[str], str] + :ref:`list_fields_parameter` + max_results : int + The maximum number of results to be returned per page. This can be + a number between 1 and 100. By default, each page will return 100 + results. + pagination_token : str + Used to request the next page of results if all results weren't + returned with the latest request, or to go back to the previous + page of results. To return the next page, pass the next_token + returned in your previous response. To go back one page, pass the + previous_token returned in your previous response. + user_fields : Union[List[str], str] + :ref:`user_fields_parameter` + + Returns + ------- + Union[dict, requests.Response, Response] + + References + ---------- + https://developer.twitter.com/en/docs/twitter-api/lists/list-lookup/api-reference/get-users-id-owned_lists + """ + return self._make_request( + "GET", f"/2/users/{id}/owned_lists", params=params, + endpoint_parameters=( + "expansions", "list.fields", "max_results", "pagination_token", + "user.fields" + ), data_type=List, user_auth=user_auth + ) + + # List members + def remove_list_member(self, id, user_id): """Enables the authenticated user to remove a member from a List they own. @@ -1908,22 +2170,43 @@ class Client: References ---------- - https://developer.twitter.com/en/docs/twitter-api/lists/manage-lists/api-reference/delete-lists-id-members-user_id + https://developer.twitter.com/en/docs/twitter-api/lists/list-members/api-reference/delete-lists-id-members-user_id """ return self._make_request( "DELETE", f"/2/lists/{id}/members/{user_id}", user_auth=True ) - def unfollow_list(self, list_id): - """Enables the authenticated user to unfollow a List. + def get_list_members(self, id, *, user_auth=False, **params): + """get_list_members(id, *, user_auth=False, expansions, max_results, \ + pagination_token, tweet_fields, user_fields) - .. versionadded:: 4.2 + Returns a list of users who are members of the specified List. + + .. versionadded:: 4.4 Parameters ---------- - list_id : Union[int, str] - The ID of the List that you would like the user to unfollow. + id : Union[List[str], str] + The ID of the List whose members you would like to retrieve. + user_auth : bool + Whether or not to use OAuth 1.0a User context + expansions : Union[List[str], str] + :ref:`expansions_parameter` + max_results : int + The maximum number of results to be returned per page. This can be + a number between 1 and 100. By default, each page will return 100 + results. + pagination_token : str + Used to request the next page of results if all results weren't + returned with the latest request, or to go back to the previous + page of results. To return the next page, pass the next_token + returned in your previous response. To go back one page, pass the + previous_token returned in your previous response. + tweet_fields : Union[List[str], str] + :ref:`tweet_fields_parameter` + user_fields : Union[List[str], str] + :ref:`user_fields_parameter` Returns ------- @@ -1931,24 +2214,76 @@ class Client: References ---------- - https://developer.twitter.com/en/docs/twitter-api/lists/manage-lists/api-reference/delete-users-id-followed-lists-list_id + https://developer.twitter.com/en/docs/twitter-api/lists/list-members/api-reference/get-lists-id-members """ - id = self.access_token.partition('-')[0] - route = f"/2/users/{id}/followed_lists/{list_id}" + return self._make_request( + "GET", f"/2/lists/{id}/members", params=params, + endpoint_parameters=( + "expansions", "max_results", "pagination_token", + "tweet.fields", "user.fields" + ), data_type=User, user_auth=user_auth + ) + + def get_list_memberships(self, id, *, user_auth=False, **params): + """get_list_memberships( \ + id, *, user_auth=False, expansions, list_fields, max_results, \ + pagination_token, user_fields \ + ) + + Returns all Lists a specified user is a member of. + + .. versionadded:: 4.4 + + Parameters + ---------- + id : Union[List[str], str] + The user ID whose List memberships you would like to retrieve. + user_auth : bool + Whether or not to use OAuth 1.0a User context + expansions : Union[List[str], str] + :ref:`expansions_parameter` + list_fields : Union[List[str], str] + :ref:`list_fields_parameter` + max_results : int + The maximum number of results to be returned per page. This can be + a number between 1 and 100. By default, each page will return 100 + results. + pagination_token : str + Used to request the next page of results if all results weren't + returned with the latest request, or to go back to the previous + page of results. To return the next page, pass the next_token + returned in your previous response. To go back one page, pass the + previous_token returned in your previous response. + user_fields : Union[List[str], str] + :ref:`user_fields_parameter` + Returns + ------- + Union[dict, requests.Response, Response] + + References + ---------- + https://developer.twitter.com/en/docs/twitter-api/lists/list-members/api-reference/get-users-id-list_memberships + """ return self._make_request( - "DELETE", route, user_auth=True + "GET", f"/2/users/{id}/list_memberships", params=params, + endpoint_parameters=( + "expansions", "list.fields", "max_results", "pagination_token", + "user.fields" + ), data_type=List, user_auth=user_auth ) - def unpin_list(self, list_id): - """Enables the authenticated user to unpin a List. + def add_list_member(self, id, user_id): + """Enables the authenticated user to add a member to a List they own. .. versionadded:: 4.2 Parameters ---------- - list_id : Union[int, str] - The ID of the List that you would like the user to unpin. + id : Union[int, str] + The ID of the List you are adding a member to. + user_id : Union[int, str] + The ID of the user you wish to add as a member of the List. Returns ------- @@ -1956,13 +2291,36 @@ class Client: References ---------- - https://developer.twitter.com/en/docs/twitter-api/lists/manage-lists/api-reference/delete-users-id-pinned-lists-list_id + https://developer.twitter.com/en/docs/twitter-api/lists/list-members/api-reference/post-lists-id-members + """ + return self._make_request( + "POST", f"/2/lists/{id}/members", json={"user_id": str(user_id)}, + user_auth=True + ) + + # Manage Lists + + def delete_list(self, id): + """Enables the authenticated user to delete a List that they own. + + .. versionadded:: 4.2 + + Parameters + ---------- + id : Union[int, str] + The ID of the List to be deleted. + + Returns + ------- + Union[dict, requests.Response, Response] + + References + ---------- + https://developer.twitter.com/en/docs/twitter-api/lists/manage-lists/api-reference/delete-lists-id """ - id = self.access_token.partition('-')[0] - route = f"/2/users/{id}/pinned_lists/{list_id}" return self._make_request( - "DELETE", route, user_auth=True + "DELETE", f"/2/lists/{id}", user_auth=True ) def update_list(self, id, *, description=None, name=None, private=None): @@ -2039,17 +2397,17 @@ class Client: "POST", f"/2/lists", json=json, user_auth=True ) - def add_list_member(self, id, user_id): - """Enables the authenticated user to add a member to a List they own. + # Pinned Lists + + def unpin_list(self, list_id): + """Enables the authenticated user to unpin a List. .. versionadded:: 4.2 Parameters ---------- - id : Union[int, str] - The ID of the List you are adding a member to. - user_id : Union[int, str] - The ID of the user you wish to add as a member of the List. + list_id : Union[int, str] + The ID of the List that you would like the user to unpin. Returns ------- @@ -2057,22 +2415,30 @@ class Client: References ---------- - https://developer.twitter.com/en/docs/twitter-api/lists/manage-lists/api-reference/post-lists-id-members + https://developer.twitter.com/en/docs/twitter-api/lists/pinned-lists/api-reference/delete-users-id-pinned-lists-list_id """ + id = self.access_token.partition('-')[0] + route = f"/2/users/{id}/pinned_lists/{list_id}" + return self._make_request( - "POST", f"/2/lists/{id}/members", json={"user_id": str(user_id)}, - user_auth=True + "DELETE", route, user_auth=True ) - def follow_list(self, list_id): - """Enables the authenticated user to follow a List. + def get_pinned_lists(self, **params): + """get_pinned_lists(*, expansions, list_fields, user_fields) - .. versionadded:: 4.2 + Returns the Lists pinned by a specified user. + + .. versionadded:: 4.4 Parameters ---------- - list_id : Union[int, str] - The ID of the List that you would like the user to follow. + expansions : Union[List[str], str] + :ref:`expansions_parameter` + list_fields : Union[List[str], str] + :ref:`list_fields_parameter` + user_fields : Union[List[str], str] + :ref:`user_fields_parameter` Returns ------- @@ -2080,13 +2446,16 @@ class Client: References ---------- - https://developer.twitter.com/en/docs/twitter-api/lists/manage-lists/api-reference/post-users-id-followed-lists + https://developer.twitter.com/en/docs/twitter-api/lists/pinned-lists/api-reference/get-users-id-pinned_lists """ id = self.access_token.partition('-')[0] - route = f"/2/users/{id}/followed_lists" + route = f"/2/users/{id}/pinned_lists" return self._make_request( - "POST", route, json={"list_id": str(list_id)}, user_auth=True + "GET", route, params=params, + endpoint_parameters=( + "expansions", "list.fields", "user.fields" + ), data_type=List, user_auth = True ) def pin_list(self, list_id): @@ -2105,7 +2474,7 @@ class Client: References ---------- - https://developer.twitter.com/en/docs/twitter-api/lists/manage-lists/api-reference/post-users-id-pinned-lists + https://developer.twitter.com/en/docs/twitter-api/lists/pinned-lists/api-reference/post-users-id-pinned-lists """ id = self.access_token.partition('-')[0] route = f"/2/users/{id}/pinned_lists" diff --git a/tweepy/list.py b/tweepy/list.py new file mode 100644 index 0000000..a49264a --- /dev/null +++ b/tweepy/list.py @@ -0,0 +1,35 @@ +# Tweepy +# Copyright 2009-2021 Joshua Roesslein +# See LICENSE for details. + +from tweepy.mixins import DataMapping, HashableID +from tweepy.utils import parse_datetime + + +class List(HashableID, DataMapping): + + __slots__ = ( + "data", "id", "name", "created_at", "description", "follower_count", + "member_count", "private", "owner_id" + ) + + def __init__(self, data): + self.data = data + self.id = data["id"] + self.name = data["name"] + + self.created_at = data.get("created_at") + if self.created_at is not None: + self.created_at = parse_datetime(self.created_at) + + self.description = data.get("description") + self.follower_count = data.get("follower_count") + self.member_count = data.get("member_count") + self.private = data.get("private") + self.owner_id = data.get("owner_id") + + def __repr__(self): + return f"" + + def __str__(self): + return self.name -- 2.25.1