Is there a simple way to fetch the cookie from the browser using aiohttp?
Not sure about whether this is simple but there is a way:
import asyncio import aiohttp async def main(): urls = [ 'http://httpbin.org/cookies/set?test=ok', ] for url in urls: async with aiohttp.ClientSession(cookie_jar=aiohttp.CookieJar()) as s: async with s.get(url) as r: print('JSON', await r.json()) cookies = s.cookie_jar.filter_cookies('http://httpbin.org') for key, cookie in cookies.items(): print('Key: "%s", Value: "%s"' % (cookie.key, cookie.value)) loop = asyncio.get_event_loop() loop.run_until_complete(main())
The program generates the following output:
JSON: {'cookies': {'test': 'ok'}} Key: "test", Value: "ok"
Example adapted from https://aiohttp.readthedocs.io/en/stable/client_advanced.html#custom-cookies + https://docs.aiohttp.org/en/stable/client_advanced.html#cookie-jar
Now if you want to do a request using a previously set cookie:
import asyncio import aiohttp url = 'http://example.com' # Filtering for the cookie, saving it into a varibale async with aiohttp.ClientSession(cookie_jar=aiohttp.CookieJar()) as s: cookies = s.cookie_jar.filter_cookies('http://example.com') for key, cookie in cookies.items(): if key == 'test': cookie_value = cookie.value # Using the cookie value to do anything you want: # e.g. sending a weird request containing the cookie in the header instead. headers = {"Authorization": "Basic f'{cookie_value}'"} async with s.get(url, headers=headers) as r: print(await r.json()) loop = asyncio.get_event_loop() loop.run_until_complete(main())
For testing urls containing a host part made up by an IP address use aiohttp.ClientSession(cookie_jar=aiohttp.CookieJar(unsafe=True)), according to https://github.com/aio-libs/aiohttp/issues/1183#issuecomment-247788489