Repository: yt-dlp/yt-dlp

Issue:
kick.com videos - HTTP Error 403: Forbidden
### DO NOT REMOVE OR SKIP THE ISSUE TEMPLATE

- [X] I understand that I will be **blocked** if I *intentionally* remove or skip any mandatory\* field

### Checklist

- [X] I'm reporting that a **supported** site is broken
- [X] I've verified that I'm running yt-dlp version **2023.03.04** ([update instructions](https://github.com/yt-dlp/yt-dlp#update)) or later (specify commit)
- [X] I've checked that all provided URLs are playable in a browser with the same IP and same login details
- [X] I've checked that all URLs and arguments with special characters are [properly quoted or escaped](https://github.com/yt-dlp/yt-dlp/wiki/FAQ#video-url-contains-an-ampersand--and-im-getting-some-strange-output-1-2839-or-v-is-not-recognized-as-an-internal-or-external-command)
- [X] I've searched [known issues](https://github.com/yt-dlp/yt-dlp/issues/3766) and the [bugtracker](https://github.com/yt-dlp/yt-dlp/issues?q=) for similar issues **including closed ones**. DO NOT post duplicates
- [X] I've read the [guidelines for opening an issue](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#opening-an-issue)
- [X] I've read about [sharing account credentials](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#are-you-willing-to-share-account-details-if-needed) and I'm willing to share it if required

### Region

Sweden

### Provide a description that is worded well enough to be understood

Yt-dlp gets stuck on a 403 forbidden error on kick.com video sites. The site still works and plays in browser but I do get redirected via a cloudflare site which I'm suspecting is the problem. The website version works and plays the video without requiring login on Firefox and Chrome. I'm on the latest 2023.03.04 version of yt-dlp.

Debugging attempts:
Using session cookies via --cookies cookies.txt downloaded through a browser extension does not work. Still getting a 403 error.

Forcing the user agent to be Mozilla via --user-agent "Mozilla/5.0" has no effect. Still getting a 403 error.

Grabbing the m3u8 stream from inspecting memory in browser and downloading it via yt-dlp that way works i.e:
`yt-dlp https://stream.kick.com/ivs/v1/196233775518/LfDRYYsAP6oJ/2023/4/8/2/37/iddbzqX5UQuJ/media/hls/master.m3u8`

Hence it seems to not be able to resolve the website. 

If there is a way to resolve cloudflare I could not find it in the issue tracker and if I missed it I apologize, I don't mean to waste anyone's time. Thank you for all your hard work!

How to reproduce:
`yt-dlp https://kick.com/video/234e331d-f8bd-4935-b72d-0ec5354a652e`

Output including error:
`[generic] 234e331d-f8bd-4935-b72d-0ec5354a652e: Downloading webpage
ERROR: [generic] Unable to download webpage: HTTP Error 403: Forbidden (caused by <HTTPError 403: 'Forbidden'>); please report this issue on  https://github.com/yt-dlp/yt-dlp/issues?q= , filling out the appropriate issue template. Confirm you are on the latest version using  yt-dlp -U`

### Provide verbose output that clearly demonstrates the problem

- [X] Run **your** yt-dlp command with **-vU** flag added (`yt-dlp -vU <your command line>`)
- [ ] If using API, add `'verbose': True` to `YoutubeDL` params instead
- [X] Copy the WHOLE output (starting with `[debug] Command-line config`) and insert it below

### Complete Verbose Output

```shell
yt-dlp https://kick.com/video/234e331d-f8bd-4935-b72d-0ec5354a652e -vU
[debug] Command-line config: ['https://kick.com/video/234e331d-f8bd-4935-b72d-0ec5354a652e', '-vU']
[debug] Encodings: locale cp1252, fs utf-8, pref cp1252, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version 2022.11.11 [8b64402] (pip)
[debug] Python 3.9.6 (CPython AMD64 64bit) - Windows-10-10.0.19045-SP0 (OpenSSL 1.1.1k  25 Mar 2021)
[debug] exe versions: ffmpeg 2020-12-15-git-32586a42da-full_build-www.gyan.dev, ffprobe 2020-12-15-git-32586a42da-full_build-www.gyan.dev
[debug] Optional libraries: Cryptodome-3.16.0, brotli-1.0.9, certifi-2022.12.07, mutagen-1.46.0, sqlite3-2.6.0, websockets-10.4
[debug] Proxy map: {}
[debug] Loaded 1723 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest
Latest version: 2023.03.04, Current version: 2022.11.11
[debug] Downloading _update_spec from https://github.com/yt-dlp/yt-dlp/releases/download/2023.03.04/_update_spec
ERROR: You installed yt-dlp with pip or using the wheel from PyPi; Use that to update
[debug] [generic] Extracting URL: https://kick.com/video/234e331d-f8bd-4935-b72d-0ec5354a652e
[generic] 234e331d-f8bd-4935-b72d-0ec5354a652e: Downloading webpage
ERROR: [generic] Unable to download webpage: HTTP Error 403: Forbidden (caused by <HTTPError 403: 'Forbidden'>); please report this issue on  https://github.com/yt-dlp/yt-dlp/issues?q= , filling out the appropriate issue template. Confirm you are on the latest version using  yt-dlp -U
  File "c:\python39\lib\site-packages\yt_dlp\extractor\common.py", line 674, in extract
    ie_result = self._real_extract(url)
  File "c:\python39\lib\site-packages\yt_dlp\extractor\generic.py", line 2582, in _real_extract
    full_response = self._request_webpage(url, video_id, headers={
  File "c:\python39\lib\site-packages\yt_dlp\extractor\common.py", line 825, in _request_webpage
    raise ExtractorError(errmsg, cause=err)

  File "c:\python39\lib\site-packages\yt_dlp\extractor\common.py", line 807, in _request_webpage
    return self._downloader.urlopen(self._create_request(url_or_request, data, headers, query))
  File "c:\python39\lib\site-packages\yt_dlp\YoutubeDL.py", line 3692, in urlopen
    return self._opener.open(req, timeout=self._socket_timeout)
  File "c:\python39\lib\urllib\request.py", line 523, in open
    response = meth(req, response)
  File "c:\python39\lib\urllib\request.py", line 632, in http_response
    response = self.parent.error(
  File "c:\python39\lib\urllib\request.py", line 561, in error
    return self._call_chain(*args)
  File "c:\python39\lib\urllib\request.py", line 494, in _call_chain
    result = func(*args)
  File "c:\python39\lib\urllib\request.py", line 641, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden
```



Discussion:
Follow these steps:
https://github.com/yt-dlp/yt-dlp/wiki/FAQ#im-getting-http-error-403-and-the-site-has-an-open-issue-on-the-tracker-thats-labeled-cloudflare-related-what-can-i-do
> ```
> Latest version: 2023.03.04, Current version: 2022.11.11
> ERROR: You installed yt-dlp with pip or using the wheel from PyPi; Use that to update
> ```
> 
> The version you are using does not have the Kick extractor. Update your yt-dlp with pip and see if the problem persists. If so, post a new verbose log
> 
> Related: #6553

I'm using the windows executable, not through python. 

That's not what your log says. I can't do anything to help if you're not providing a log from the latest version
> That's not what your log says. I can't do anything to help if you're not providing a log from the latest version

I'm sorry but I don't know why the log says that. 
But I am using the windows executable. See my attached images:

![bild](https://user-images.githubusercontent.com/49168045/230730432-835952e1-4a05-4701-a527-6a02639c7a8b.png)
![bild](https://user-images.githubusercontent.com/49168045/230730483-2c85a00d-ae56-40fe-b26f-ec31fa02842c.png)


I've pushed a change to the Kick extractor. Now it will continue to try to extract the video if the first request fails.

Here's what you can try:

1. With your yt-dlp win exe, run `yt-dlp --update-to nightly`

2. Try `yt-dlp -v https://kick.com/video/234e331d-f8bd-4935-b72d-0ec5354a652e`

3. If that fails, then try navigating to the site in your browser, and passing cookies from browser to yt-dlp:
`yt-dlp -v --cookies-from-browser chrome https://kick.com/video/234e331d-f8bd-4935-b72d-0ec5354a652e`
(or replace `chrome` with whatever browser you visit kick.com with)

4. If the above also fails, then find your browser's user-agent string (you can type "what is my user-agent" into duckduckgo or google), and try running:
`yt-dlp -v --user-agent "USER_AGENT" --cookies-from-browser chrome https://kick.com/video/234e331d-f8bd-4935-b72d-0ec5354a652e`
(replace `USER_AGENT` with your actual user-agent string)

If successful, please reply with which worked for you (2, 3 or 4)

If you are still getting an error, please post the verbose log as text
1. This works.

2. This fails.

![bild](https://user-images.githubusercontent.com/49168045/230733653-91bbea0b-7e6a-4b4a-912f-da0f582a9885.png)
```
G:\YouTube-DL>yt-dlp -v https://kick.com/video/234e331d-f8bd-4935-b72d-0ec5354a652e
[debug] Command-line config: ['-v', 'https://kick.com/video/234e331d-f8bd-4935-b72d-0ec5354a652e']
[debug] Encodings: locale cp1252, fs utf-8, pref cp1252, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version nightly@2023.04.08.161042 [0a6918a4a] (win_exe)
[debug] Python 3.8.10 (CPython AMD64 64bit) - Windows-10-10.0.19045-SP0 (OpenSSL 1.1.1k  25 Mar 2021)
[debug] exe versions: ffmpeg 2020-12-15-git-32586a42da-full_build-www.gyan.dev, ffprobe 2020-12-15-git-32586a42da-full_build-www.gyan.dev
[debug] Optional libraries: Cryptodome-3.17, brotli-1.0.9, certifi-2022.12.07, mutagen-1.46.0, sqlite3-2.6.0, websockets-11.0.1
[debug] Proxy map: {}
[debug] Loaded 1791 extractors
[KickVOD] Setting up session
WARNING: [KickVOD] Unable to download webpage: HTTP Error 403: Forbidden
[debug] [KickVOD] kick.com did not set XSRF-TOKEN cookie
[KickVOD] Extracting URL: https://kick.com/video/234e331d-f8bd-4935-b72d-0ec5354a652e
[KickVOD] 234e331d-f8bd-4935-b72d-0ec5354a652e: Downloading API JSON
ERROR: [KickVOD] 234e331d-f8bd-4935-b72d-0ec5354a652e: Unable to download JSON metadata: HTTP Error 403: Forbidden (caused by <HTTPError 403: 'Forbidden'>); please report this issue on  https://github.com/yt-dlp/yt-dlp/issues?q= , filling out the appropriate issue template. Confirm you are on the latest version using  yt-dlp -U
  File "yt_dlp\extractor\common.py", line 694, in extract
  File "yt_dlp\extractor\kick.py", line 110, in _real_extract
  File "yt_dlp\extractor\kick.py", line 27, in _call_api
  File "yt_dlp\extractor\common.py", line 1048, in download_content
  File "yt_dlp\extractor\common.py", line 1012, in download_handle
  File "yt_dlp\extractor\common.py", line 882, in _download_webpage_handle
  File "yt_dlp\extractor\common.py", line 839, in _request_webpage

  File "yt_dlp\extractor\common.py", line 821, in _request_webpage
  File "yt_dlp\YoutubeDL.py", line 3743, in urlopen
  File "urllib\request.py", line 531, in open
  File "urllib\request.py", line 640, in http_response
  File "urllib\request.py", line 569, in error
  File "urllib\request.py", line 502, in _call_chain
  File "urllib\request.py", line 649, in http_error_default
urllib.error.HTTPError: HTTP Error 403: Forbidden
```

4. This also fails. Log:
```
G:\YouTube-DL>yt-dlp -v --cookies-from-browser chrome https://kick.com/video/234e331d-f8bd-4935-b72d-0ec5354a652e
[debug] Command-line config: ['-v', '--cookies-from-browser', 'chrome', 'https://kick.com/video/234e331d-f8bd-4935-b72d-0ec5354a652e']
[debug] Encodings: locale cp1252, fs utf-8, pref cp1252, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version nightly@2023.04.08.161042 [0a6918a4a] (win_exe)
[debug] Python 3.8.10 (CPython AMD64 64bit) - Windows-10-10.0.19045-SP0 (OpenSSL 1.1.1k  25 Mar 2021)
[debug] exe versions: ffmpeg 2020-12-15-git-32586a42da-full_build-www.gyan.dev, ffprobe 2020-12-15-git-32586a42da-full_build-www.gyan.dev
[debug] Optional libraries: Cryptodome-3.17, brotli-1.0.9, certifi-2022.12.07, mutagen-1.46.0, sqlite3-2.6.0, websockets-11.0.1
[Cookies] Extracting cookies from chrome
[debug] Extracting cookies from: "C:\Users\Crag\AppData\Local\Google\Chrome\User Data\Default\Network\Cookies"
[debug] Found local state file at "C:\Users\Crag\AppData\Local\Google\Chrome\User Data\Local State"
[Cookies] Extracted 71 cookies from chrome
[debug] cookie version breakdown: {'v10': 71, 'other': 0, 'unencrypted': 0}
[debug] Proxy map: {}
[debug] Loaded 1791 extractors
[KickVOD] Setting up session
WARNING: [KickVOD] Unable to download webpage: HTTP Error 403: Forbidden
[debug] [KickVOD] kick.com did not set XSRF-TOKEN cookie
[KickVOD] Extracting URL: https://kick.com/video/234e331d-f8bd-4935-b72d-0ec5354a652e
[KickVOD] 234e331d-f8bd-4935-b72d-0ec5354a652e: Downloading API JSON
ERROR: [KickVOD] 234e331d-f8bd-4935-b72d-0ec5354a652e: Unable to download JSON metadata: HTTP Error 403: Forbidden (caused by <HTTPError 403: 'Forbidden'>); please report this issue on  https://github.com/yt-dlp/yt-dlp/issues?q= , filling out the appropriate issue template. Confirm you are on the latest version using  yt-dlp -U
  File "yt_dlp\extractor\common.py", line 694, in extract
  File "yt_dlp\extractor\kick.py", line 110, in _real_extract
  File "yt_dlp\extractor\kick.py", line 27, in _call_api
  File "yt_dlp\extractor\common.py", line 1048, in download_content
  File "yt_dlp\extractor\common.py", line 1012, in download_handle
  File "yt_dlp\extractor\common.py", line 882, in _download_webpage_handle
  File "yt_dlp\extractor\common.py", line 839, in _request_webpage

  File "yt_dlp\extractor\common.py", line 821, in _request_webpage
  File "yt_dlp\YoutubeDL.py", line 3743, in urlopen
  File "urllib\request.py", line 531, in open
  File "urllib\request.py", line 640, in http_response
  File "urllib\request.py", line 569, in error
  File "urllib\request.py", line 502, in _call_chain
  File "urllib\request.py", line 649, in http_error_default
urllib.error.HTTPError: HTTP Error 403: Forbidden
```
![bild](https://user-images.githubusercontent.com/49168045/230733367-c6b4c85a-7985-4485-8566-f17044647794.png)

5. This also fails. Log:
```
G:\YouTube-DL>yt-dlp -v --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/111.0" --cookies-from-browser chrome https://kick.com/video/234e331d-f8bd-4935-b72d-0ec5354a652e
[debug] Command-line config: ['-v', '--user-agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/111.0', '--cookies-from-browser', 'chrome', 'https://kick.com/video/234e331d-f8bd-4935-b72d-0ec5354a652e']
[debug] Encodings: locale cp1252, fs utf-8, pref cp1252, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version nightly@2023.04.08.161042 [0a6918a4a] (win_exe)
[debug] Python 3.8.10 (CPython AMD64 64bit) - Windows-10-10.0.19045-SP0 (OpenSSL 1.1.1k  25 Mar 2021)
[debug] exe versions: ffmpeg 2020-12-15-git-32586a42da-full_build-www.gyan.dev, ffprobe 2020-12-15-git-32586a42da-full_build-www.gyan.dev
[debug] Optional libraries: Cryptodome-3.17, brotli-1.0.9, certifi-2022.12.07, mutagen-1.46.0, sqlite3-2.6.0, websockets-11.0.1
[Cookies] Extracting cookies from chrome
[debug] Extracting cookies from: "C:\Users\Crag\AppData\Local\Google\Chrome\User Data\Default\Network\Cookies"
[debug] Found local state file at "C:\Users\Crag\AppData\Local\Google\Chrome\User Data\Local State"
[Cookies] Extracted 71 cookies from chrome
[debug] cookie version breakdown: {'v10': 71, 'other': 0, 'unencrypted': 0}
[debug] Proxy map: {}
[debug] Loaded 1791 extractors
[KickVOD] Setting up session
WARNING: [KickVOD] Unable to download webpage: HTTP Error 403: Forbidden
[debug] [KickVOD] kick.com did not set XSRF-TOKEN cookie
[KickVOD] Extracting URL: https://kick.com/video/234e331d-f8bd-4935-b72d-0ec5354a652e
[KickVOD] 234e331d-f8bd-4935-b72d-0ec5354a652e: Downloading API JSON
ERROR: [KickVOD] 234e331d-f8bd-4935-b72d-0ec5354a652e: Unable to download JSON metadata: HTTP Error 403: Forbidden (caused by <HTTPError 403: 'Forbidden'>); please report this issue on  https://github.com/yt-dlp/yt-dlp/issues?q= , filling out the appropriate issue template. Confirm you are on the latest version using  yt-dlp -U
  File "yt_dlp\extractor\common.py", line 694, in extract
  File "yt_dlp\extractor\kick.py", line 110, in _real_extract
  File "yt_dlp\extractor\kick.py", line 27, in _call_api
  File "yt_dlp\extractor\common.py", line 1048, in download_content
  File "yt_dlp\extractor\common.py", line 1012, in download_handle
  File "yt_dlp\extractor\common.py", line 882, in _download_webpage_handle
  File "yt_dlp\extractor\common.py", line 839, in _request_webpage

  File "yt_dlp\extractor\common.py", line 821, in _request_webpage
  File "yt_dlp\YoutubeDL.py", line 3743, in urlopen
  File "urllib\request.py", line 531, in open
  File "urllib\request.py", line 640, in http_response
  File "urllib\request.py", line 569, in error
  File "urllib\request.py", line 502, in _call_chain
  File "urllib\request.py", line 649, in http_error_default
urllib.error.HTTPError: HTTP Error 403: Forbidden
```

![bild](https://user-images.githubusercontent.com/49168045/230733472-cc2ff3da-d221-4224-ab25-66c7f064caf3.png)

None worked unfortunately.

> --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/111.0"

Are you using firefox to browse kick.com? Then use `--cookies-from-browser firefox`
> > --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/111.0"
> 
> Are you using firefox to browse kick.com? Then use `--cookies-from-browser firefox`

No luck unfortunately. 

```
G:\YouTube-DL>yt-dlp -v --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/111.0" --cookies-from-browser firefox https://kick.com/video/234e331d-f8bd-4935-b72d-0ec5354a652e
[debug] Command-line config: ['-v', '--user-agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/111.0', '--cookies-from-browser', 'firefox', 'https://kick.com/video/234e331d-f8bd-4935-b72d-0ec5354a652e']
[debug] Encodings: locale cp1252, fs utf-8, pref cp1252, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version nightly@2023.04.08.161042 [0a6918a4a] (win_exe)
[debug] Python 3.8.10 (CPython AMD64 64bit) - Windows-10-10.0.19045-SP0 (OpenSSL 1.1.1k  25 Mar 2021)
[debug] exe versions: ffmpeg 2020-12-15-git-32586a42da-full_build-www.gyan.dev, ffprobe 2020-12-15-git-32586a42da-full_build-www.gyan.dev
[debug] Optional libraries: Cryptodome-3.17, brotli-1.0.9, certifi-2022.12.07, mutagen-1.46.0, sqlite3-2.6.0, websockets-11.0.1
[Cookies] Extracting cookies from firefox
[debug] Extracting cookies from: "C:\Users\Crag\AppData\Roaming\Mozilla\Firefox\Profiles\2h71j2pe.default-release\cookies.sqlite"
[Cookies] Extracted 136 cookies from firefox
[debug] Proxy map: {}
[debug] Loaded 1791 extractors
[KickVOD] Setting up session
WARNING: [KickVOD] Unable to download webpage: HTTP Error 403: Forbidden
[KickVOD] Extracting URL: https://kick.com/video/234e331d-f8bd-4935-b72d-0ec5354a652e
[KickVOD] 234e331d-f8bd-4935-b72d-0ec5354a652e: Downloading API JSON
ERROR: [KickVOD] 234e331d-f8bd-4935-b72d-0ec5354a652e: Unable to download JSON metadata: HTTP Error 403: Forbidden (caused by <HTTPError 403: 'Forbidden'>); please report this issue on  https://github.com/yt-dlp/yt-dlp/issues?q= , filling out the appropriate issue template. Confirm you are on the latest version using  yt-dlp -U
  File "yt_dlp\extractor\common.py", line 694, in extract
  File "yt_dlp\extractor\kick.py", line 110, in _real_extract
  File "yt_dlp\extractor\kick.py", line 27, in _call_api
  File "yt_dlp\extractor\common.py", line 1048, in download_content
  File "yt_dlp\extractor\common.py", line 1012, in download_handle
  File "yt_dlp\extractor\common.py", line 882, in _download_webpage_handle
  File "yt_dlp\extractor\common.py", line 839, in _request_webpage

  File "yt_dlp\extractor\common.py", line 821, in _request_webpage
  File "yt_dlp\YoutubeDL.py", line 3743, in urlopen
  File "urllib\request.py", line 531, in open
  File "urllib\request.py", line 640, in http_response
  File "urllib\request.py", line 569, in error
  File "urllib\request.py", line 502, in _call_chain
  File "urllib\request.py", line 649, in http_error_default
urllib.error.HTTPError: HTTP Error 403: Forbidden
```
![bild](https://user-images.githubusercontent.com/49168045/230733853-d5db442e-24ac-433c-9e69-60ea90deb359.png)

While I still can't reproduce the 403 error myself, I am pretty sure that the problem here is cloudflare fingerprinting.

I *can* get a 403 if I send a curl request to `https://kick.com/` with the default curl user-agent:
```
$ curl -f "https://kick.com/"
curl: (22) The requested URL returned error: 403

$ curl --head "https://kick.com/"
HTTP/2 403 
date: Sat, 08 Apr 2023 17:11:04 GMT
content-type: text/html
cross-origin-embedder-policy: require-corp
cross-origin-opener-policy: same-origin
cross-origin-resource-policy: same-origin
permissions-policy: accelerometer=(),autoplay=(),camera=(),clipboard-read=(),clipboard-write=(),fullscreen=(),geolocation=(),gyroscope=(),hid=(),interest-cohort=(),magnetometer=(),microphone=(),payment=(),publickey-credentials-get=(),screen-wake-lock=(),serial=(),sync-xhr=(),usb=()
referrer-policy: same-origin
x-frame-options: SAMEORIGIN
cache-control: private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
expires: Thu, 01 Jan 1970 00:00:01 GMT
set-cookie: __cf_bm=Gb_aJJrlyi0gy.V5MYZdgB.uUfrEGSwU.Bt4SuTO0qI-1680973864-0-AQUOPrPVbPLGX+T9ne10ZNgmZIOtelh7HWAdHzoCIVPPSrGSGPhJqVowxxmCI8/XLaFrH4sb25CXC9G9HmJPzMI=; path=/; expires=Sat, 08-Apr-23 17:41:04 GMT; domain=.kick.com; HttpOnly; Secure; SameSite=None
server: cloudflare
cf-ray: 7b4c209d8c5d230f-ORD
alt-svc: h3=":443"; ma=86400, h3-29=":443"; ma=86400
```
...and the body of the response is a captcha challenge page.

crunchyroll implements this same type of fingerprinting, and the steps I had you try were taken from the workaround I discovered when experimenting with the CR extractor back when it was broken:
https://github.com/yt-dlp/yt-dlp/pull/5294#issuecomment-1289735453
(note the same `__cf_bm` cloudflare cookie being set)

Crunchyroll only shields their API with cloudflare; you can still request the front page of CR and the site will set the cookies necessary to bypass the fingerprinting and access the API with yt-dlp. I tried to do something similar with the Kick extractor, but the difference/problem is that the front page of Kick is shielded by cloudflare, too. 

I'm guessing only certain IP ranges are having their requests screened, which is why some users are affected by this issue and some are not. Not sure about that, though. 

Unfortunately, I don't think there is anything we can do as of right now. With yt-dlp's current capabilities, CF fingerprinting is a problem without a solution
Does `yt-dlp -v --user-agent "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" https://kick.com/video/234e331d-f8bd-4935-b72d-0ec5354a652e` work?

(I spent 10 minutes scrolling through the Discord history to find this :trollface:)
using yt-dlp to download from kick.com fails (403) for me when using a vpn, succeeds when using home IP.
web browser displays kick.com video through vpn.

some sort of fingerprinting issue.

Kick being new can afford to utilize javascript hacks to identify legit users (on low trust IPs), youtube and twitch have apps on myriad of hardware all using the same(?) API for efficiency, any such measures would end up with a lot of upset users.
@jackloomen I highly doubt this will work, but what happens if you use `--geo-bypass-country XX`, where `XX` is your home country's [two letter code](https://en.m.wikipedia.org/wiki/ISO_3166-2#Current_codes)?



> youtube and twitch have apps on myriad of hardware all using the same(?) API for efficiency, any such measures would end up with a lot of upset users

Youtube use different APIs on different devices. Unfortunately for them, we just need one obscure API to work with yt-dlp :trollface:
> I highly doubt this will work, but what happens if you use `--geo-bypass-country XX`, where `XX` is your home country's [two letter code](https://en.m.wikipedia.org/wiki/ISO_3166-2#Current_codes)?

Nothing happened,  also i tried 3 different vpn end point in 3 different countries to the same effect of 403.
they are probably discriminating against some or all vpn providers, or single out datacenters.
I'd be curious whether they're detecting VPNs, or just only 403ing some countries. What happens if you use a VPN based in your home country?
> I'd be curious whether they're detecting VPNs, or just only 403ing some countries. What happens if you use a VPN based in your home country?

one of the three countries I tested was my country, the other was US and germany.
I'm not using a VPN but I'm situated in Sweden. Appreciate all ideas here but no clue how to work around Cloudflare fingerprinting if that's the problem.
does `--legacy-server-connect` help with this issue?
> does `--legacy-server-connect` help with this issue?

this appears to fix the issue.
just re-verified that the regular approach results in 403, adding --legacy-server-connect results in successful download.
Website works but yt-dlp gets 403'd with the latest nightly.

However, you can still download the VOD by getting the master m3u8 and plugging that into yt-dlp as described in this video guide.

https://streamable.com/xbel1y
I was using yt-dlp to get the HLS url to pass it to my ffmpeg based video player. It was working last week. I tried today with a today git yt-dlp and I get the dreaded 403.
workaround for now is to add `--legacy-server-connect` to your command
> workaround for now is to add `--legacy-server-connect` to your command

Holy heck, thank you so much! This works

EDIT: Suddenly this stopped working as well. Hmmm darn it. 403 Errors again.
Would it be possible to set up some sort of streaming extractor for the m3u8 URLs from a real browser extension to yt-dlp? I noticed an app I tried for streaming ipad browser video to apple tv, called "Web Video Cast" does work for kick.com. I am guessing this is because the website does run in a proper browser on the ipad, so it can run all of the cloudflare crap and its able to maintain this connection
`--legacy-server-connect` unfortunately stopped working.
> `--legacy-server-connect` unfortunately stopped working.

still works for me, your ip[|range] may be blacklisted.
> still works for me, your ip[|range] may be blacklisted.

Well that's weird. I can still watch normally on the website.
Using the master.m3u8 link instead of the public URL still works perfectly for me as shown in this video. 

No `--legacy-server-connect` needed at all. 

https://streamable.com/xbel1y
> Website works but yt-dlp gets 403'd with the latest nightly.
> 
> However, you can still download the VOD by getting the master m3u8 and plugging that into yt-dlp as described in this video guide.
> 
> https://streamable.com/xbel1y

Working method, 100% recommend. Thanks
> still works for me, your ip[|range] may be blacklisted.

Nobody is getting IP blacklisted. They're just not using the master.m3u8 link from the public-facing link. 
> Well that's weird. I can still watch normally on the website.

Out of interest, did you have to go through one of these annoying screens? They block yt-dlp :(
![Checking if the site connection is secure](https://user-images.githubusercontent.com/83270075/236441080-9dd65522-9ba6-4953-8e2e-bf0a8927f621.png)

> No --legacy-server-connect needed at all.

`--legacy-server-connect` is easier imo

> Nobody is getting IP blacklisted. They're just not using the master.m3u8 link from the public-facing link.

Just because it can be bypassed doesn't mean people aren't getting IP blacklisted
> Website works but yt-dlp gets 403'd with the latest nightly.
> 
> However, you can still download the VOD by getting the master m3u8 and plugging that into yt-dlp as described in this video guide.
> 
> https://streamable.com/xbel1y

When inspecting the page in the Network tab today it didn't return any m3u8 playlists any more. 

Are there any method to incorporate using PhantomJS, the headless browser to dodge the browser fingerprinting?
https://phantomjs.org

I've had to use PhantomJS as a fallback when downloading YouTube video playlists recently. 
Yt-dlp seems to check for, and use PhantomJS if it returns errors and the executable is present in the same folder but only for YouTube. The kick.com component doesn't seem to use it as a fallback from the logs.

I.e process fallback:
1. Try normal download
2. On 403 error use --legacy-server-connect
3. On another 403 error use PhantomJS

Appreciate suggestions thanks again!
> When inspecting the page in the Network tab today it didn't return any m3u8 playlists any more.

Just use uBlock's network logger. Shows it even more easily than the inspector tab. 
> workaround for now is to add `--legacy-server-connect` to your command

is this safe to use, Is RFC 5746 secure renegotiation important? (like would it be similar to accessing a webpage over http where it could have been tampered with? )
> > workaround for now is to add `--legacy-server-connect` to your command
> 
> is this safe to use, Is RFC 5746 secure renegotiation important? (like would it be similar to accessing a webpage over http where it could have been tampered with? )

You're literally downloading silly videos with meaningless streamers and e-girls, not your bank account. Relax. 
> > > workaround for now is to add `--legacy-server-connect` to your command
> > 
> > 
> > is this safe to use, Is RFC 5746 secure renegotiation important? (like would it be similar to accessing a webpage over http where it could have been tampered with? )
> 
> You're literally downloading silly videos with meaningless streamers and e-girls, not your bank account. Relax.

Isn't one of the risks of standard HTTP, a man in the middle attack where you essentially send the user a fake webpage that downloads malicious software? 
Of course this would be very unlikely, I'm just wondering if the legacy option could open this possibility. 
Tested today with --legacy-server-connect with a git version from last sunday, still forbidden 403, that to get the HLS url to pass it to my video player (--print urls).
> Are there any method to incorporate using PhantomJS, the headless browser to dodge the browser fingerprinting? https://phantomjs.org

PhantomJS is for Javascript, although I guess it could theoretically be used to bypass fingerprinting, or to solve the captcha that the 403 error returns 👀



> I've had to use PhantomJS as a fallback when downloading YouTube video playlists recently.

`yt-dlp --update-to nightly` should fix that. Otherwise, report it at https://github.com/yt-dlp/yt-dlp/issues/6131



> On 403 error use --legacy-server-connect

Apparently, extractors can't set `--legacy-server-connect`, and it won't be feasible to fix that until https://github.com/yt-dlp/yt-dlp/pull/2861 is merged. Also:

> Tested today with --legacy-server-connect with a git version from last sunday, still forbidden 403

**Yep, the `--legacy-server-connect` workaround seems to be broken!** Use @Pentaphon's method (https://streamable.com/xbel1y)
--legacy-server-connect workaround with VPN server in the US achieved full line speed for me, only tried downloading VODs.

aria2 downloader if that's relevant.
> --legacy-server-connect workaround with VPN server in the US achieved full line speed for me, only tried downloading VODs.

perhaps they're slowly rolling out an update which blocks the legacy server connect workaround 👀

Out of interest, can you reproduce without aria2c? If yes, can you please post a verbose log
Guys, what you should understand: they are big and rich, they _will_ manage to make technically small alternatives nearly impossible to make work or at least a massive pain to keep them working. They want to force you to use their web engine (and SDK) which they have full control on (obfuscated javascript running in their ultra massive and complex web engines you must compile with an insanely complex c++ toolchain).

There will be a time when only hardcore technical regulation will protect us against them: forced interop with simple, but able to do a good enough job, protocols and stable in time.

It's political lobbying and lawyers which will be mostly needed.
@sylware 
1. You can’t expect us devs to organise that
2. I think your comments apply to some sites (mainly TikTok), but I don’t think they apply to kick.com
It is for everybody aware of the issue, not only the devs.

It is very likely that many sites, if not nearly all, will have javascript generators which will then generated the HLS urls in the browser. That means it will require to actually run the javascript code in a simulated web engine since the reverse engineering will be insane.
> It is very likely that many sites, if not nearly all, will have javascript generators which will then generated the HLS urls in the browser. That means it will require to actually run the javascript code in a simulated web engine since the reverse engineering will be insane.

1. kick.com don't use that currently, so this is off topic
2. my understanding is that youtube already does that. It doesn't matter though, because we've got a (really bad) javascript simulator called `jsinterp.py`, and whenever it breaks, we use an actual javascript interpreter (PhantomJS)
phantomjs is just a front end to big tech web engines. That defeats in part one of the very good reasons to use yt-dlp: it is orders of magnitude leaner than a big tech web engine, and that including the SDK (because python).

But anyway, what do I have to configure to make yt-dlp work again with kick.com in order to get that HLS url to give to my video player?
> I've pushed a change to the Kick extractor. Now it will continue to try to extract the video if the first request fails.
> 
> Here's what you can try:
> 
> 1. With your yt-dlp win exe, run `yt-dlp --update-to nightly`
> 2. Try `yt-dlp -v https://kick.com/video/234e331d-f8bd-4935-b72d-0ec5354a652e`
> 3. If that fails, then try navigating to the site in your browser, and passing cookies from browser to yt-dlp:
>    `yt-dlp -v --cookies-from-browser chrome https://kick.com/video/234e331d-f8bd-4935-b72d-0ec5354a652e`
>    (or replace `chrome` with whatever browser you visit kick.com with)
> 4. If the above also fails, then find your browser's user-agent string (you can type "what is my user-agent" into duckduckgo or google), and try running:
>    `yt-dlp -v --user-agent "USER_AGENT" --cookies-from-browser chrome https://kick.com/video/234e331d-f8bd-4935-b72d-0ec5354a652e`
>    (replace `USER_AGENT` with your actual user-agent string)
> 
> If successful, please reply with which worked for you (2, 3 or 4)
> 
> If you are still getting an error, please post the verbose log as text

Thank you so much! Step 4 worked for me after trying the previous steps.
Thx for the tips (I did already tried some user agent strings, maybe I should try more), but my whole usage of yt-dlp is interoperability with noscript/basic (x)html browsers (links/lynx/netsurf/etc), namely I do not use big tech web engines. But if I was to use such toxic abominations, I would not use yt-dlp but a chromium/blink/webkit plugin, come on guys.
> I've pushed a change to the Kick extractor. Now it will continue to try to extract the video if the first request fails.
> 
> Here's what you can try:
> 
> 1. With your yt-dlp win exe, run `yt-dlp --update-to nightly`
> 2. Try `yt-dlp -v https://kick.com/video/234e331d-f8bd-4935-b72d-0ec5354a652e`
> 3. If that fails, then try navigating to the site in your browser, and passing cookies from browser to yt-dlp:
>    `yt-dlp -v --cookies-from-browser chrome https://kick.com/video/234e331d-f8bd-4935-b72d-0ec5354a652e`
>    (or replace `chrome` with whatever browser you visit kick.com with)
> 4. If the above also fails, then find your browser's user-agent string (you can type "what is my user-agent" into duckduckgo or google), and try running:
>    `yt-dlp -v --user-agent "USER_AGENT" --cookies-from-browser chrome https://kick.com/video/234e331d-f8bd-4935-b72d-0ec5354a652e`
>    (replace `USER_AGENT` with your actual user-agent string)
> 
> If successful, please reply with which worked for you (2, 3 or 4)
> 
> If you are still getting an error, please post the verbose log as text

4 did work, the others failed with different errors.

3 failed with the following:

V:\other\vlcsnap>yt-dlp -v --cookies-from-browser brave https://kick.com/[redacted]
[debug] Command-line config: ['-v', '--cookies-from-browser', 'brave', 'https://kick.com/[redacted]']
[debug] Encodings: locale cp1252, fs utf-8, pref cp1252, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version nightly@2023.06.03.063406 [2fb35f600] (win_exe)
[debug] Python 3.8.10 (CPython AMD64 64bit) - Windows-10-10.0.19045-SP0 (OpenSSL 1.1.1k  25 Mar 2021)
[debug] exe versions: ffmpeg git-2020-08-14-a762fd2, ffprobe git-2020-08-14-a762fd2, phantomjs 2.1.1
[debug] Optional libraries: Cryptodome-3.18.0, brotli-1.0.9, certifi-2023.05.07, mutagen-1.46.0, sqlite3-2.6.0, websockets-11.0.3
[Cookies] Extracting cookies from brave
[debug] Extracting cookies from: "C:\Users\[redacted]\AppData\Local\BraveSoftware\Brave-Browser\User Data\Default\Network\Cookies"
[debug] Found local state file at "C:\Users\[redacted]\AppData\Local\BraveSoftware\Brave-Browser\User Data\Local State"
[Cookies] Extracted 554 cookies from brave
[debug] cookie version breakdown: {'v10': 554, 'other': 0, 'unencrypted': 0}
[debug] Proxy map: {}
[debug] Loaded 1840 extractors
[Kick] Setting up session
WARNING: [Kick] Unable to download webpage: HTTP Error 403: Forbidden
[Kick] Extracting URL: https://kick.com/[redacted]
[Kick] [redacted]: Downloading API JSON
ERROR: [Kick] [redacted]: Unable to download JSON metadata: HTTP Error 403: Forbidden (caused by <HTTPError 403: 'Forbidden'>); please report this issue on  https://github.com/yt-dlp/yt-dlp/issues?q= , filling out the appropriate issue template. Confirm you are on the latest version using  yt-dlp -U
  File "yt_dlp\extractor\common.py", line 703, in extract
  File "yt_dlp\extractor\kick.py", line 59, in _real_extract
  File "yt_dlp\extractor\kick.py", line 27, in _call_api
  File "yt_dlp\extractor\common.py", line 1057, in download_content
  File "yt_dlp\extractor\common.py", line 1021, in download_handle
  File "yt_dlp\extractor\common.py", line 891, in _download_webpage_handle
  File "yt_dlp\extractor\common.py", line 848, in _request_webpage

  File "yt_dlp\extractor\common.py", line 830, in _request_webpage
  File "yt_dlp\YoutubeDL.py", line 3776, in urlopen
  File "urllib\request.py", line 531, in open
  File "urllib\request.py", line 640, in http_response
  File "urllib\request.py", line 569, in error
  File "urllib\request.py", line 502, in _call_chain
  File "urllib\request.py", line 649, in http_error_default
urllib.error.HTTPError: HTTP Error 403: Forbidden

>    `yt-dlp -v --user-agent "USER_AGENT" --cookies-from-browser chrome https://kick.com/video/234e331d-f8bd-4935-b72d-0ec5354a652e`
>    (replace `USER_AGENT` with your actual user-agent string)

 That worked for me with nightly build.


> > `yt-dlp -v --user-agent "USER_AGENT" --cookies-from-browser chrome https://kick.com/video/234e331d-f8bd-4935-b72d-0ec5354a652e`
> > (replace `USER_AGENT` with your actual user-agent string)
> 
> That worked for me with nightly build.

Got it working here too. Note that you don't need _all_ the cookies from your browser, just the ones from Kick and Cloudflare domains. (The Kick domain alone will not work.)

Unfortunately, this isn't a reliable solution for downloading livestreams, because eventually the session will time out and 403, and you will have to (manually) navigate to Kick in a browser again.
> and you will have to (manually) navigate to Kick in a browser again

Obviously still not reliable for livestreams, but if you have curl installed (`winget install curl`) you can run the following to automate it:
```
curl https://kick.com/ -c kickdotcomcookies.txt -H "User-Agent: ujhgtfjhgfbv"
yt-dlp https://kick.com --cookies kickdotcomcookies.txt --add-header "User-Agent: ujhgtfjhgfbv"
```
`ujhgtfjhgfbv` is a random string from me banging my keyboard. i'd recommend replacing it (in both commands) since I expect it to get blocked after I post this
> > and you will have to (manually) navigate to Kick in a browser again
> 
> Obviously still not reliable for livestreams, but if you have curl installed (`winget install curl`) you can run the following to automate it:
> 
> ```
> curl https://kick.com/ -c kickdotcomcookies.txt -H "User-Agent: ujhgtfjhgfbv"
> yt-dlp https://kick.com --cookies kickdotcomcookies.txt --add-header "User-Agent: ujhgtfjhgfbv"
> ```
> 
> `ujhgtfjhgfbv` is a random string from me banging my keyboard. i'd recommend replacing it (in both commands) since I expect it to get blocked after I post this

Could you elaborate on how this works? I'm on Windows, using the binary version of anything if possible. I dropped the curl binary next to yt-dlp's, and used those commands in a batch file. curl dumps info on the screen as well as creating a cookie file. I fed this cookie file and the custom user agent into yt-dlp, forcing it to access the Kick front page, but it still shows a 403. Running any VOD download after this also fails whether I supply these cookies and user agents or not...
> Could you elaborate on how this works? 

I don't think it does. The response to the curl request sets cookies but they don't get you past the cloudflare protection.

This does work, though: https://github.com/yt-dlp/yt-dlp/wiki/FAQ#im-getting-http-error-403-and-the-site-has-an-open-issue-on-the-tracker-thats-labeled-cloudflare-related-what-can-i-do
Is there any way to pass a client ID or user oauth login session to avoid the fingerprinting?
> Could you elaborate on how this works?

Cloudflare seem to have blocked it :(

Here's a new automated workaround (once again, the manual workaround is documented [here](https://github.com/yt-dlp/yt-dlp/wiki/FAQ#im-getting-http-error-403-and-the-site-has-an-open-issue-on-the-tracker-thats-labeled-cloudflare-related-what-can-i-do))
1. download [curl-impersonate](https://github.com/lwthiker/curl-impersonate)
a. MacOS: download [this link](https://github.com/lwthiker/curl-impersonate/releases/download/v0.6.0-alpha.1/curl-impersonate-v0.6.0-alpha.1.x86_64-macos.tar.gz)
b. Linux: download one of the top 3 files [here](https://github.com/lwthiker/curl-impersonate/releases/tag/v0.6.0-alpha.1). Run `uname -m` to find out which one
c. Windows: [curl-impersonate-win](https://github.com/depler/curl-impersonate-win/releases/tag/20230227)
2. extract the folder, and copy the below files to the same folder as yt-dlp (you may discard the remain files):
a. MacOS and Linux: `curl_chrome110` and `curl-impersonate-chrome`
b. Windows: all the files, I guess
3. you can now run the below commands to download videos from kick.com. The only part you need to modify is URL in the yt-dlp command (and the file name, if you don't like `kickcomcookies.txt` for some reason)
```
curl_chrome110 https://kick.com/ -c kickcomcookies.txt
yt-dlp --add-header "User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36" --cookies kickcomcookies.txt URL
```

React with a :+1: if it worked :)
> > Could you elaborate on how this works?
> 
> Cloudflare seem to have blocked it :(
> 
> Here's a new automated workaround (once again, the manual workaround is documented [here](https://github.com/yt-dlp/yt-dlp/wiki/FAQ#im-getting-http-error-403-and-the-site-has-an-open-issue-on-the-tracker-thats-labeled-cloudflare-related-what-can-i-do))
> 
>     1. download [curl-impersonate](https://github.com/lwthiker/curl-impersonate)
>        a. MacOS: download [this link](https://github.com/lwthiker/curl-impersonate/releases/download/v0.6.0-alpha.1/curl-impersonate-v0.6.0-alpha.1.x86_64-macos.tar.gz)
>        b. Linux: download one of the top 3 files [here](https://github.com/lwthiker/curl-impersonate/releases/tag/v0.6.0-alpha.1). Run `uname -m` to find out which one
>        c. Windows: [curl-impersonate-win](https://github.com/depler/curl-impersonate-win/releases/tag/20230227)
> 
>     2. extract the folder, and copy the below files to the same folder as yt-dlp (you may discard the remain files):
>        a. MacOS and Linux: `curl_chrome110` and `curl-impersonate-chrome`
>        b. Windows: all the files, I guess
> 
>     3. you can now run the below commands to download videos from kick.com. The only part you need to modify is URL in the yt-dlp command (and the file name, if you don't like `kickcomcookies.txt` for some reason)
> 
> 
> ```
> curl_chrome110 https://kick.com/ -c kickcomcookies.txt
> yt-dlp --add-header "User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36" --cookies kickcomcookies.txt URL
> ```
> 
> React with a 👍 if it worked :)

Works perfectly! Thank you so much, I had no clue curl-impersonate was a thing.
The only feature lacking is downloading clips from kick.com but that may be a limitation with yt-dlp. 

> but that may be a limitation with yt-dlp.

Yep, but feel free to open a site feature request :)
Just an insight for those who receive a HTTP 403 error if using only yt-dlp:

• Apparently Kick serves their frontend using HTTP/3 instead of HTTP/2.
• HTTP/3 uses the QUIC protocol instead of TCP.
• QUIC requires TLS 1.3 support for securing connections.
• TLS 1.3 (and QUIC) support is native on Windows 11, but experimental on Windows 10, starting with Windows 10 Version 1903 (Build 17634).

If you have an older version of Windows, you can't enable support for HTTP/3, QUIC and TLS 1.3 on a system-wide level. This can cause yt-dlp to fail the CloudFlare bot detection. Downloading using the m3u8 files still work as they are served over HTTP/2.

Maybe it's possible to tell yt-dlp to use a third-party external library that implements TLS 1.3? Or this whole process can't bypass system-wide limitations? Browsers seem to be able to bypass this. I know that using a 4+ year old version of Windows is an edge case, but if it's easy to bypass, it might be worth it.
@RevSnowfox #7595 will most likely fix it


__**For those who don't want to go through the message history, [here's an automated workaround](https://github.com/yt-dlp/yt-dlp/issues/6748#issuecomment-1713442441), and [here's a manual workaround](https://github.com/yt-dlp/yt-dlp/wiki/FAQ#im-getting-http-error-403-and-the-site-has-an-open-issue-on-the-tracker-thats-labeled-cloudflare-related-what-can-i-do)**__
Looks like this is unfortunately a thing again, even when retrieving cookies using curl-impersonate.
> Looks like this is unfortunately a thing again, even when retrieving cookies using curl-impersonate.

Cookies and user-agent no longer work for me. Getting 403 Forbidden when it used to work.
I also noticed HTTP 403 errors today. Disabling/Enabling HTTP/3 in the cookie-generating browser (Firefox in my case; network.http.http3.enable -> false/true) fixes/breaks the cookie method reproducibly though.

Possibly related: There are two new cookies "KP_UIDz-ssn" and "KP_UIDz" set after calling https://kick.com/some_UUID_lookalike_string/another_UUID/fp?x-kpsdk-v=j-0.0.0

Apparently they have implemented Kasada antibot like Twitch did a while ago (https://github.com/yt-dlp/yt-dlp/issues/7183), which includes some kind of protocol fingerprinting.
note that #7595 (curl_cffi) still works

```shell
$ yt-dlp --ignore-config --impersonate chrome -vF 'https://kick.com/video/dd8c8125-cf6b-46c8-ad87-770507c389ec'
[debug] Command-line config: ['--ignore-config', '--impersonate', 'chrome', '-vF', 'https://kick.com/video/dd8c8125-cf6b-46c8-ad87-770507c389ec']
[debug] Encodings: locale UTF-8, fs utf-8, pref UTF-8, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version stable@2023.11.16 from yt-dlp/yt-dlp [24f827875]
[debug] Lazy loading extractors is disabled
[debug] Python 3.11.6 (CPython x86_64 64bit) - Linux-6.6.4-arch1-1-x86_64-with-glibc2.38 (OpenSSL 3.1.4 24 Oct 2023, glibc 2.38)
[debug] exe versions: ffmpeg 6.1 (setts), ffprobe 6.1
[debug] Optional libraries: Cryptodome-3.12.0, brotlicffi-1.1.0.0, certifi-2023.11.17, curl_cffi-0.5.10, mutagen-1.47.0, requests-2.31.0, sqlite3-3.44.2, urllib3-2.1.0, websockets-12.0
[debug] Proxy map: {}
[debug] Request Handlers: urllib, requests, websockets, curl_cffi
[debug] Loaded 1915 extractors
[KickVOD] Setting up session
[KickVOD] Extracting URL: https://kick.com/video/dd8c8125-cf6b-46c8-ad87-770507c389ec
[KickVOD] dd8c8125-cf6b-46c8-ad87-770507c389ec: Downloading API JSON
[KickVOD] dd8c8125-cf6b-46c8-ad87-770507c389ec: Downloading m3u8 information
[debug] Formats sorted by: hasvid, ie_pref, lang, quality, res, fps, hdr:12(7), vcodec:vp9.2(10), channels, acodec, size, br, asr, proto, vext, aext, hasaud, source, id
[info] Available formats for dd8c8125-cf6b-46c8-ad87-770507c389ec:
ID      EXT RESOLUTION FPS │  FILESIZE   TBR PROTO │ VCODEC      ACODEC
──────────────────────────────────────────────────────────────────────────
160p    mp4 284x160     30 │ ~ 1.73GiB  230k m3u8  │ avc1.4D401F mp4a.40.2
360p    mp4 640x360     30 │ ~ 4.74GiB  630k m3u8  │ avc1.4D401F mp4a.40.2
480p    mp4 852x480     30 │ ~12.50GiB 1663k m3u8  │ avc1.4D401F mp4a.40.2
720p60  mp4 1280x720    60 │ ~27.50GiB 3658k m3u8  │ avc1.4D401F mp4a.40.2
1080p60 mp4 1920x1080   60 │ ~54.81GiB 7291k m3u8  │ avc1.64002A mp4a.40.2
```
> note that #7595 (curl_cffi) still works

Seems to be dead now on latest #7595 


```
% ./yt-dlp.sh --ignore-config --impersonate chrome -vF 'https://kick.com/video/c631d25b-f419-423c-87e6-b0ca5f674443'

[...]

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/tmp/yt-dlp-dev/yt_dlp/extractor/common.py", line 847, in _request_webpage
    return self._downloader.urlopen(self._create_request(url_or_request, data, headers, query))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/yt-dlp-dev/yt_dlp/YoutubeDL.py", line 4125, in urlopen
    raise _CompatHTTPError(e) from e
yt_dlp.networking.exceptions._CompatHTTPError: HTTP Error 403: Forbidden

```

@HuronExplodium why did you remove all the useful info from your log? I can't reproduce your issue
> @HuronExplodium why did you remove all the useful info from your log? I can't reproduce your issue

Did not think that part would be useful @bashonly :smile: 

Here you go sir

```
% ./yt-dlp.sh --ignore-config --impersonate chrome -vF 'https://kick.com/video/c631d25b-f419-423c-87e6-b0ca5f674443'  

[debug] Command-line config: ['--ignore-config', '--impersonate', 'chrome', '-vF', 'https://kick.com/video/c631d25b-f419-423c-87e6-b0ca5f674443']
[debug] Encodings: locale UTF-8, fs utf-8, pref UTF-8, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version stable@2023.11.16 from yt-dlp/yt-dlp [24f827875] (source)
[debug] Lazy loading extractors is disabled
[debug] Git HEAD: 5d4e50982
[debug] Python 3.11.2 (CPython x86_64 64bit) - Linux-6.6.3-arch1-1-x86_64-with-glibc2.38 (OpenSSL 3.1.4 24 Oct 2023, glibc 2.38)
[debug] exe versions: ffmpeg 6.1 (setts), ffprobe 6.1, rtmpdump 2.4
[debug] Optional libraries: Cryptodome-3.17, brotli-1.0.9, certifi-2022.12.07, curl_cffi-0.5.10, mutagen-1.46.0, requests-2.31.0, sqlite3-3.44.2, urllib3-2.1.0, websockets-12.0
[debug] Proxy map: {}
[debug] Request Handlers: urllib, requests, websockets, curl_cffi
[debug] Loaded 1915 extractors
[KickVOD] Setting up session
ERROR: [curl_cffi] Unexpected error: BytesWarning: str() on a bytes instance; please report this issue on  https://github.com/yt-dlp/yt-dlp/issues?q= , filling out the appropriate issue template. Confirm you are on the latest version using  yt-dlp -U
Traceback (most recent call last):
  File "/tmp/yt-dlp-dev/yt_dlp/networking/common.py", line 131, in send
    response = handler.send(request)
               ^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/yt-dlp-dev/yt_dlp/networking/_helper.py", line 204, in wrapper
    return func(self, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/yt-dlp-dev/yt_dlp/networking/common.py", line 351, in send
    return self._send(request)
           ^^^^^^^^^^^^^^^^^^^
  File "/tmp/yt-dlp-dev/yt_dlp/networking/_curlcffi.py", line 178, in _send
    curl_response = session.request(
                    ^^^^^^^^^^^^^^^^
  File "/home/xtat/.pyenv/versions/3.11.2/lib/python3.11/site-packages/curl_cffi/requests/session.py", line 618, in request
    req, buffer, header_buffer, q, header_recved, quit_now = self._set_curl_options(
                                                             ^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/xtat/.pyenv/versions/3.11.2/lib/python3.11/site-packages/curl_cffi/requests/session.py", line 223, in _set_curl_options
    c.setopt(CurlOpt.CUSTOMREQUEST, method.encode())
  File "/home/xtat/.pyenv/versions/3.11.2/lib/python3.11/site-packages/curl_cffi/curl.py", line 190, in setopt
    self._check_error(ret, "setopt(%s, %s)" % (option, value))
                                                       ^^^^^
BytesWarning: str() on a bytes instance

WARNING: [KickVOD] Unable to download webpage: HTTP Error 403: Forbidden
[debug] [KickVOD] kick.com did not set XSRF-TOKEN cookie
[KickVOD] Extracting URL: https://kick.com/video/c631d25b-f419-423c-87e6-b0ca5f674443
[KickVOD] c631d25b-f419-423c-87e6-b0ca5f674443: Downloading API JSON
ERROR: [curl_cffi] Unexpected error: BytesWarning: str() on a bytes instance; please report this issue on  https://github.com/yt-dlp/yt-dlp/issues?q= , filling out the appropriate issue template. Confirm you are on the latest version using  yt-dlp -U
Traceback (most recent call last):
  File "/tmp/yt-dlp-dev/yt_dlp/networking/common.py", line 131, in send
    response = handler.send(request)
               ^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/yt-dlp-dev/yt_dlp/networking/_helper.py", line 204, in wrapper
    return func(self, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/yt-dlp-dev/yt_dlp/networking/common.py", line 351, in send
    return self._send(request)
           ^^^^^^^^^^^^^^^^^^^
  File "/tmp/yt-dlp-dev/yt_dlp/networking/_curlcffi.py", line 178, in _send
    curl_response = session.request(
                    ^^^^^^^^^^^^^^^^
  File "/home/xtat/.pyenv/versions/3.11.2/lib/python3.11/site-packages/curl_cffi/requests/session.py", line 618, in request
    req, buffer, header_buffer, q, header_recved, quit_now = self._set_curl_options(
                                                             ^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/xtat/.pyenv/versions/3.11.2/lib/python3.11/site-packages/curl_cffi/requests/session.py", line 230, in _set_curl_options
    c.setopt(CurlOpt.URL, url.encode())
  File "/home/xtat/.pyenv/versions/3.11.2/lib/python3.11/site-packages/curl_cffi/curl.py", line 190, in setopt
    self._check_error(ret, "setopt(%s, %s)" % (option, value))
                                                       ^^^^^
BytesWarning: str() on a bytes instance

ERROR: [KickVOD] c631d25b-f419-423c-87e6-b0ca5f674443: Unable to download JSON metadata: HTTP Error 403: Forbidden (caused by <HTTPError 403: Forbidden>); please report this issue on  https://github.com/yt-dlp/yt-dlp/issues?q= , filling out the appropriate issue template. Confirm you are on the latest version using  yt-dlp -U
  File "/tmp/yt-dlp-dev/yt_dlp/extractor/common.py", line 715, in extract
    ie_result = self._real_extract(url)
                ^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/yt-dlp-dev/yt_dlp/extractor/kick.py", line 109, in _real_extract
    response = self._call_api(f'video/{video_id}', video_id)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/yt-dlp-dev/yt_dlp/extractor/kick.py", line 26, in _call_api
    return self._download_json(
           ^^^^^^^^^^^^^^^^^^^^
  File "/tmp/yt-dlp-dev/yt_dlp/extractor/common.py", line 1069, in download_content
    res = getattr(self, download_handle.__name__)(url_or_request, video_id, **kwargs)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/yt-dlp-dev/yt_dlp/extractor/common.py", line 1033, in download_handle
    res = self._download_webpage_handle(
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/yt-dlp-dev/yt_dlp/extractor/common.py", line 903, in _download_webpage_handle
    urlh = self._request_webpage(url_or_request, video_id, note, errnote, fatal, data=data, headers=headers, query=query, expected_status=expected_status)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/yt-dlp-dev/yt_dlp/extractor/common.py", line 860, in _request_webpage
    raise ExtractorError(errmsg, cause=err)

  File "/tmp/yt-dlp-dev/yt_dlp/YoutubeDL.py", line 4084, in urlopen
    return self._request_director.send(req)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/yt-dlp-dev/yt_dlp/networking/common.py", line 131, in send
    response = handler.send(request)
               ^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/yt-dlp-dev/yt_dlp/networking/_helper.py", line 204, in wrapper
    return func(self, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/yt-dlp-dev/yt_dlp/networking/common.py", line 351, in send
    return self._send(request)
           ^^^^^^^^^^^^^^^^^^^
  File "/tmp/yt-dlp-dev/yt_dlp/networking/_requests.py", line 340, in _send
    raise HTTPError(res, redirect_loop=max_redirects_exceeded)
yt_dlp.networking.exceptions.HTTPError: HTTP Error 403: Forbidden

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/tmp/yt-dlp-dev/yt_dlp/extractor/common.py", line 847, in _request_webpage
    return self._downloader.urlopen(self._create_request(url_or_request, data, headers, query))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/yt-dlp-dev/yt_dlp/YoutubeDL.py", line 4125, in urlopen
    raise _CompatHTTPError(e) from e
yt_dlp.networking.exceptions._CompatHTTPError: HTTP Error 403: Forbidden
```
In this case it's not using curl_cffi and falling back to requests which does not impersonate chrome.

yt-dlp.sh is set to raise warnings as errors (I still don't understand why), and due to some bugs with curl_cffi that byteswarning is being raised. yt-dlp falls back to another handler in this case.
Small update. Make sure to update the user agent in [curl-impersonates](https://github.com/depler/curl-impersonate-win/releases/tag/20230227) config file to the latest Chrome version as well as the header for yt-dlp. This seems to work successfully with the following conditions:
- Refresh cookies about every 6 minutes or so
- Do not connect to Kick more often than once every 2 minutes 

Refreshing cookies too often or connecting too often, you start getting 403s again.

New Chrome user agent:
```Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36```

Example command to refresh and download new cookies:
```curl.exe" --config config/chrome110.config --header @config/chrome110.header https://kick.com/ -c kickcomcookies.txt```

Example when downloading after saving cookies as kickcomcookies.txt:
```yt-dlp --add-header "User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36" --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36" --cookies kickcomcookies.txt https://www.kick.com/roflgator -o roflgator.mp4```

Update the user agent string in the config file for curl impersonate:
**\config\chrome110.header**
```
sec-ch-ua: "Chromium";v="110", "Not A(Brand";v="24", "Google Chrome";v="110"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9```
Small update: so far I was able to download VODs with the m3u8 master or playlist files, but as of now (December 17th), even those give me a 403.

Yes, this is without the curl-impersonate trick. I was able to use the generic HLS extractor with the m3u8 files so far, but not anymore. Apparently Kick extended Kasada bot protection for all important URLs they serve, not just of the VOD replay pages.
> Small update: so far I was able to download VODs with the m3u8 master or playlist files, but as of now (December 17th), even those give me a 403.
> 
> Yes, this is without the curl-impersonate trick. I was able to use the generic HLS extractor with the m3u8 files so far, but not anymore. Apparently Kick extended Kasada bot protection for all important URLs they serve, not just of the VOD replay pages.

Downloading with the m3u8 master file works for me currently
curl-impersonate seems to be blocked by cloudflare now. it's returning this page when running curl_chrome110

`Just a moment...`
curl-cffi 0.5.10 / curl-impersonate still works for me.

Resolving patch:
diff --git a/yt_dlp/extractor/kick.py b/yt_dlp/extractor/kick.py
--- a/yt_dlp/extractor/kick.py
+++ b/yt_dlp/extractor/kick.py
@@ -13,7 +13,8 @@
 
 class KickBaseIE(InfoExtractor):
     def _real_initialize(self):
-        self._request_webpage(HEADRequest('https://kick.com/'), None, 'Setting up session', fatal=False)
+        self._request_webpage(
+            HEADRequest('https://kick.com/'), None, 'Setting up session', fatal=False, impersonate=True)
         xsrf_token = self._get_cookies('https://kick.com/').get('XSRF-TOKEN')
         if not xsrf_token:
             self.write_debug('kick.com did not set XSRF-TOKEN cookie')
@@ -25,7 +26,7 @@ def _real_initialize(self):
     def _call_api(self, path, display_id, note='Downloading API JSON', headers={}, **kwargs):
         return self._download_json(
             f'https://kick.com/api/v1/{path}', display_id, note=note,
-            headers=merge_dicts(headers, self._API_HEADERS), **kwargs)
+            headers=merge_dicts(headers, self._API_HEADERS), impersonate=True, **kwargs)
 
 
 class KickIE(KickBaseIE):
@@ -82,26 +83,27 @@ def _real_extract(self, url):
 class KickVODIE(KickBaseIE):
     _VALID_URL = r'https?://(?:www\.)?kick\.com/video/(?P<id>[\da-f]{8}-(?:[\da-f]{4}-){3}[\da-f]{12})'
     _TESTS = [{
-        'url': 'https://kick.com/video/54244b5e-050a-4df4-a013-b2433dafbe35',
-        'md5': '73691206a6a49db25c5aa1588e6538fc',
+        'url': 'https://kick.com/video/58bac65b-e641-4476-a7ba-3707a35e60e3',
+        'md5': '3870f94153e40e7121a6e46c068b70cb',
         'info_dict': {
-            'id': '54244b5e-050a-4df4-a013-b2433dafbe35',
+            'id': '58bac65b-e641-4476-a7ba-3707a35e60e3',
             'ext': 'mp4',
-            'title': 'Making 710-carBoosting. Kinda No Pixel inspired.  !guilded  - !links',
-            'description': 'md5:a0d3546bf7955d0a8252ffe0fd6f518f',
-            'channel': 'kmack710',
-            'channel_id': '16278',
-            'uploader': 'Kmack710',
-            'uploader_id': '16412',
-            'upload_date': '20221206',
-            'timestamp': 1670318289,
-            'duration': 40104.0,
+            'title': '🤠REBIRTH IS BACK!!!!🤠!stake CODE JAREDFPS 🤠',
+            'description': 'md5:02b0c46f9b4197fb545ab09dddb85b1d',
+            'channel': 'jaredfps',
+            'channel_id': '26608',
+            'uploader': 'JaredFPS',
+            'uploader_id': '26799',
+            'upload_date': '20240402',
+            'timestamp': 1712097108,
+            'duration': 33859.0,
             'thumbnail': r're:^https?://.*\.jpg',
-            'categories': ['Grand Theft Auto V'],
+            'categories': ['Call of Duty: Warzone'],
         },
         'params': {
             'skip_download': 'm3u8',
         },
+        'expected_warnings': [r'impersonation'],
     }]
 
     def _real_extract(self, url):


Test patch: