commit fc9070eaa6dc699b581f0bf701d2c92194911400 Author: Emilien Devos <4016501+unixfox@users.noreply.github.com> Date: Fri Jul 12 00:49:34 2024 +0200 push working script diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml new file mode 100644 index 0000000..45f5ebb --- /dev/null +++ b/.github/workflows/build-docker.yml @@ -0,0 +1,39 @@ +name: Docker Multi-Architecture Build + +on: + push: + paths-ignore: + - "**.md" + branches: + - master + +jobs: + build-docker: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + with: + platforms: all + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v3 + with: + version: latest + - name: Login to Quay.io + uses: docker/login-action@v3 + with: + registry: quay.io + username: ${{ secrets.QUAY_USERNAME }} + password: ${{ secrets.QUAY_PASSWORD }} + - name: Build and push + uses: docker/build-push-action@v5 + with: + context: . + file: ./Dockerfile + platforms: linux/amd64,linux/arm64/v8 + push: true + tags: quay.io/invidious/youtube-trusted-session-generator:latest + cache-from: type=gha + cache-to: type=gha,mode=max diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..82f9275 --- /dev/null +++ b/.gitignore @@ -0,0 +1,162 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/latest/usage/project/#working-with-version-control +.pdm.toml +.pdm-python +.pdm-build/ + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..54f4023 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,18 @@ +FROM python:3.12-alpine + +RUN apk add --no-cache \ + chromium \ + nss \ + freetype \ + freetype-dev \ + harfbuzz \ + ca-certificates \ + ttf-freefont + +WORKDIR /usr/app/src +COPY index.py requirements.txt ./ + +RUN pip install -r requirements.txt + +# Run +CMD [ "python", "./index.py"] \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..b2b3131 --- /dev/null +++ b/README.md @@ -0,0 +1,26 @@ +# YouTube trusted session generator + +## Description + +This script will output two parameters: po_token and visitor_data. Needed for passing YouTube checks in Invidious. + +## Tutorial without Docker +1. Create a new virtualenv: `virtualenv venv` +2. Activate the virtualenv: `source venv/bin/activate` +3. Install the dependencies: `pip install -r requirements.txt` +4. Run the script: `python index.py` +5. Copy paste the values of these the two parameters (po_token and visitor_data) in config.yaml + ``` + po_token: XXX + visitor_data: XXX + ``` +6. Restart Invidious. + +## Tutorial with Docker +1. Run the script: `docker run quay.io/invidious/youtube-trusted-session-generator` +2. Copy paste the values of these the two parameters (po_token and visitor_data) in config.yaml + ``` + po_token: XXX + visitor_data: XXX + ``` +3. Restart Invidious. diff --git a/index.py b/index.py new file mode 100644 index 0000000..50a905c --- /dev/null +++ b/index.py @@ -0,0 +1,28 @@ +import asyncio +from nodriver import start, cdp, loop +import time +import json +import sys + +async def main(): + browser = await start(headless=True) + tab = browser.main_tab + tab.add_handler(cdp.network.RequestWillBeSent, send_handler) + page = await browser.get('https://www.youtube.com/embed/jNQXAC9IVRw') + await tab.wait(cdp.network.RequestWillBeSent) + button_play = await tab.select("#movie_player") + await button_play.click() + time.sleep(5) + +async def send_handler(event: cdp.network.RequestWillBeSent): + if "/youtubei/v1/player" in event.request.url: + post_data = event.request.post_data + post_data_json = json.loads(post_data) + print("visitor_data: " + post_data_json["context"]["client"]["visitorData"]) + print("po_token: " + post_data_json["serviceIntegrityDimensions"]["poToken"]) + sys.exit(0) + return + +if __name__ == '__main__': + + loop().run_until_complete(main()) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..496d28b --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +nodriver==0.32 +undetected-chromedriver==3.5.5