WebRTC Spoofer

WebRTC Spoofer (Logitech Brio 4K & Blue Yeti Mic as Virtual Matrix 4) with Video & Audio Requested Good For Ome.tv an Uhmegle

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         WebRTC Spoofer
// @namespace    http://tampermonkey.net/
// @version      8.0
// @description  WebRTC Spoofer (Logitech Brio 4K & Blue Yeti Mic as Virtual Matrix 4) with Video & Audio Requested Good For Ome.tv an Uhmegle
// @author       Cxsmo
// @match        *://*/*
// @grant        none
// @license MIT
// ==/UserScript==

(function () {
    'use strict';

    // Forcefully overwrite original methods
    const originalEnumerateDevices = navigator.mediaDevices.enumerateDevices.bind(navigator.mediaDevices);
    const originalGetUserMedia = navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices);

    // Webcam Emulation (Logitech Brio 4K)
    const brioProperties = {
        deviceId: "logitech-brio-4k-webcam-id", // Fake device ID
        groupId: "logitech-brio-group-id", // Fake group ID
        label: "Logitech BRIO 4K Stream Edition", // Fake webcam label
        kind: "videoinput",
        capabilities: {
            width: 3840, // 4K resolution
            height: 2160,
            frameRate: 60, // 60 FPS
            aspectRatio: 16 / 9,
            colorDepth: 10, // 10-bit color depth for higher-quality video
        },
    };

    // Microphone Emulation (Blue Yeti as Virtual Matrix 4)
    const blueYetiProperties = {
        deviceId: "blue-yeti-mic-id", // Fake device ID (for the Virtual Matrix 4 mic)
        groupId: "blue-yeti-group-id", // Fake group ID
        label: "Blue Yeti USB Microphone", // Fake mic label
        kind: "audioinput",
        capabilities: {
            sampleRate: 48000, // 48kHz sample rate
            channelCount: 2, // Stereo sound
            volume: 100, // Maximum volume
        },
    };

    // Override enumerateDevices to ensure fake device data
    navigator.mediaDevices.enumerateDevices = async function () {
        const devices = await originalEnumerateDevices();

        // Force overriding the device label and IDs for video and audio devices
        return devices.map((device) => {
            if (device.kind === "videoinput") {
                // Force webcam properties (Logitech Brio 4K)
                return {
                    ...device,
                    deviceId: brioProperties.deviceId,
                    groupId: brioProperties.groupId,
                    label: brioProperties.label,
                };
            } else if (device.kind === "audioinput") {
                // Force microphone properties to only show the Blue Yeti mic (Virtual Matrix 4)
                return {
                    ...device,
                    deviceId: blueYetiProperties.deviceId,
                    groupId: blueYetiProperties.groupId,
                    label: blueYetiProperties.label,
                };
            }
            return device;
        });
    };

    // Override getUserMedia to ensure requested constraints match fake properties
    navigator.mediaDevices.getUserMedia = function (constraints) {
        // Handle video constraints (Logitech Brio 4K)
        if (!constraints.video && !constraints.audio) {
            // If neither audio nor video is requested, default to requesting both
            constraints.video = {
                width: { ideal: brioProperties.capabilities.width },
                height: { ideal: brioProperties.capabilities.height },
                frameRate: { ideal: brioProperties.capabilities.frameRate },
                facingMode: "user", // Optional: set to front-facing camera
            };
        } else if (constraints.video) {
            // If video is requested, apply the Logitech Brio-like settings
            constraints.video = {
                width: { ideal: brioProperties.capabilities.width },
                height: { ideal: brioProperties.capabilities.height },
                frameRate: { ideal: brioProperties.capabilities.frameRate },
                facingMode: "user", // Optional: set to front-facing camera
                ...constraints.video,
            };
        }

        // Handle audio constraints (Blue Yeti Mic as Virtual Matrix 4)
        if (!constraints.audio) {
            // If audio is not requested, apply default Blue Yeti settings
            constraints.audio = {
                deviceId: { ideal: blueYetiProperties.deviceId },
                channelCount: { ideal: blueYetiProperties.capabilities.channelCount },
                sampleRate: { ideal: blueYetiProperties.capabilities.sampleRate },
                volume: blueYetiProperties.capabilities.volume,
            };
        } else if (constraints.audio) {
            // If audio is requested, apply Blue Yeti microphone settings
            constraints.audio = {
                deviceId: { ideal: blueYetiProperties.deviceId },
                channelCount: { ideal: blueYetiProperties.capabilities.channelCount },
                sampleRate: { ideal: blueYetiProperties.capabilities.sampleRate },
                volume: blueYetiProperties.capabilities.volume,
                ...constraints.audio,
            };
        }

        return originalGetUserMedia(constraints);
    };

    // Override getSettings for MediaStreamTrack to provide fake settings for streams
    const originalGetSettings = MediaStreamTrack.prototype.getSettings;
    MediaStreamTrack.prototype.getSettings = function () {
        const settings = originalGetSettings.call(this);
        return {
            ...settings,
            width: brioProperties.capabilities.width,
            height: brioProperties.capabilities.height,
            frameRate: brioProperties.capabilities.frameRate,
            aspectRatio: brioProperties.capabilities.aspectRatio,
            colorDepth: brioProperties.capabilities.colorDepth,
            sampleRate: blueYetiProperties.capabilities.sampleRate,
            channelCount: blueYetiProperties.capabilities.channelCount,
            volume: blueYetiProperties.capabilities.volume,
        };
    };

    // Add a check for the WebRTC environment and log the details
    function checkWebRTC() {
        if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
            console.log("WebRTC is supported on this page.");
        } else {
            console.warn("WebRTC is not supported. Some features may not work.");
        }
    }

    // Check WebRTC support on page load
    checkWebRTC();

    // Add validation to block resolution 640x360 and only allow 1080p (1920x1080) or 4K (3840x2160)
    const originalMediaTrackConstraints = MediaStreamTrack.prototype.getSettings;
    MediaStreamTrack.prototype.getSettings = function () {
        const settings = originalMediaTrackConstraints.call(this);
        // Block 640x360 resolution by not allowing it in constraints
        if (settings.width === 640 && settings.height === 360) {
            console.warn("Blocked 640x360 resolution.");
            return {
                ...settings,
                width: 1920, // Force to 1080p resolution
                height: 1080,
            };
        }
        // If the resolution is not 640x360, we allow 1080p (1920x1080) or 4K (3840x2160)
        if (settings.width <= 1920 && settings.height <= 1080) {
            console.log("Resolution allowed:", settings.width, settings.height);
            return settings;
        } else {
            // If the resolution is higher than 1080p, force to 4K resolution
            return {
                ...settings,
                width: 3840, // Force to Brio 4K resolution
                height: 2160,
            };
        }
    };

    // Log the result to make sure the spoofing works
    console.log("WebRTC Spoofer: Logitech Brio 4K webcam and Blue Yeti USB microphone (Virtual Matrix 4) emulation active.");
})();