Benjamin-Loison / YouTube-operational-API

YouTube operational API works when YouTube Data API v3 fails.
401 stars 52 forks source link

Official instance no-key service returns HTTP error 500 #301

Open Benjamin-Loison opened 2 months ago

Benjamin-Loison commented 2 months ago
curl 'https://yt.lemnoslife.com/search?part=snippet&q=test'
Output: ```json { "kind": "youtube#searchListResponse", "etag": "NotImplemented", "nextPageToken": "Ep8DEgR0ZXN0GpYDRWdJUUFVZ1VnZ0VMWkdKcVVHNVlZV0ZqUVZXQ0FRdENUbWxqYUdaWFdGQnZUWUlCQ3psc2JESmZRa1JhY0VrMGdnRUxkVzlUYUZCcFN6WTROemlDQVF0WlFYaE1kV1ZGUzNGdFZZSUJDMjlOZDFwQlZUUmFTRzF2Z2dFTFMzTkdaRzAwWVZvd2VGR0NBUXQyWlZCak5WWTBhRjlyWjRJQkMybFdZbTl3VjNsQ1VqVlpnZ0VMZDAxNlNVaDFWMmhmU1RDQ0FRdE9VekI0UWtSR2RsVkljNElCQzNWb2FVSkJVVzFyWkdJd2dnRUxNRFExWjBJd2FWbzRSMEdDQVF0R2MzWktlbVpZV2treE9JSUJDelZqZVhOUVVHNWFSV2hOZ2dFTFIzcFRlalZHUWxwUlpUQ0NBUXRRUzE5RlNqTkVlV2xwUVlJQkN6SmhORlY0WkhrNVZGRlpnZ0VMY1ZGR2EzVnlNRVpIVjJlQ0FRdHZMVlY0TUZWemVWbHJZN0lCQmdvRUNCZ1FBdW9CQkFnQ0VEYyUzRBiB4OgYIgtzZWFyY2gtZmVlZA==", "items": [ { "kind": "youtube#searchResult", "etag": "NotImplemented", "id": { "kind": "youtube#video", "videoId": "dbjPnXaacAU" }, "snippet": { "channelId": "UCXp1pqN0VP459pjypvK_Rww", "title": "selective attention test", "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/dbjPnXaacAU\/hqdefault.jpg?sqp=-oaymwE9COADEI4CSFryq4qpAy8IARUAAAAAGAElAADIQj0AgKJDeAHwAQH4Af4EgALoAooCDAgAEAEYZSBdKFQwDw==&rs=AOn4CLALu3RyRBYLM7OXvQpZqhIqp4Thkg", "width": 480, "height": 270 } ], "channelTitle": "Garri Frischer", "channelHandle": "@TheGarriFrischer", "timestamp": "12 years ago", "duration": 41, "views": 1061345, "badges": [], "channelApproval": null, "channelThumbnails": [ { "url": "https:\/\/yt3.ggpht.com\/ytc\/AIdro_m2030_0rNNCS27eVabMCsnTrHpnJtjnfjw1hkNl5I=s68-c-k-c0x00ffffff-no-rj", "width": 68, "height": 68 } ], "detailedMetadataSnippet": [ { "text": "By Garri Frischer, Rikard Zeilon, Linn Mattsson, Stefan Parkbring. Lights,camera work - Johan Karlsson." } ], "chapters": [] } }, { "kind": "youtube#searchResult", "etag": "NotImplemented", "id": { "kind": "youtube#video", "videoId": "BNichfWXPoM" }, "snippet": { "channelId": "UCjU6ZwoTQtKWfz1urL7XcbA", "title": "ZhuQue-3 10-kilometre VTVL test", "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/BNichfWXPoM\/hq720.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAElAADIQj0AgKJDeAHwAQH4Af4JgALQBYoCDAgAEAEYYCBgKGAwDw==&rs=AOn4CLA9rSAS-cEIKnv9Pqq7DTkvxZpMEw", "width": 360, "height": 202 }, { "url": "https:\/\/i.ytimg.com\/vi\/BNichfWXPoM\/hq720.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGAHwAQH4Af4JgALQBYoCDAgAEAEYYCBgKGAwDw==&rs=AOn4CLCH2yupxJN8KqOkz7xenczuK0AJhg", "width": 720, "height": 404 } ], "channelTitle": "SciNews", "channelHandle": "@SciNewsRo", "timestamp": "20 hours ago", "duration": 131, "views": 18599, "badges": [], "channelApproval": "Verified", "channelThumbnails": [ { "url": "https:\/\/yt3.ggpht.com\/ytc\/AIdro_llX8NzZxxxeqNikyizk2LrYCJeu2FgVLdsfG0516Wq7rc=s68-c-k-c0x00ffffff-no-rj", "width": 68, "height": 68 } ], "detailedMetadataSnippet": [ { "text": "LandSpace's ZhuQue-3 launch vehicle (\u6731\u96c0\u4e09, ZQ-3) successfully performed a 10-kilometre vertical takeoff, vertical landing\u00a0..." } ], "chapters": [] } }, { "kind": "youtube#searchResult", "etag": "NotImplemented", "id": { "kind": "youtube#video", "videoId": "9ll2_BDZpI4" }, "snippet": { "channelId": "UCMXzc5fADodNEdkSbHXZlpg", "title": "Cybertruck Crash Test is HORRIFYING, Here\u2019s Why", "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/9ll2_BDZpI4\/hq720.jpg?sqp=-oaymwEjCOgCEMoBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLCqLyZdjLA19yPv9Q9dVcpNgEZVzw", "width": 360, "height": 202 }, { "url": "https:\/\/i.ytimg.com\/vi\/9ll2_BDZpI4\/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLApDvdIdp7RimXrU_ofPFgGA7OEAA", "width": 720, "height": 404 } ], "channelTitle": "AI DRIVR", "channelHandle": "@AIDRIVR", "timestamp": "9 months ago", "duration": 490, "views": 5325590, "badges": [], "channelApproval": "Verified", "channelThumbnails": [ { "url": "https:\/\/yt3.ggpht.com\/ytc\/AIdro_mr-Y7BqklAPMJO7-MSgIUo-eiQee61Ze2XwF17l55Gdhc=s68-c-k-c0x00ffffff-no-rj", "width": 68, "height": 68 } ], "detailedMetadataSnippet": [ { "text": "Consider supporting this channel on Patreon: https:\/\/patreon.com\/AIDRIVR." } ], "chapters": [] } }, { "kind": "youtube#searchResult", "etag": "NotImplemented", "id": { "kind": "youtube#video", "videoId": "uoShPiK6878" }, "snippet": { "channelId": "UCrhxnApeiomD9BeXb7Q2CuA", "title": "NEW CAR VS OLD CAR CRASH TEST", "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/uoShPiK6878\/hqdefault.jpg?sqp=-oaymwEjCOADEI4CSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLD1_D3j3RK2rztJDkHB4H6LBBjwSA", "width": 480, "height": 270 } ], "channelTitle": "K1CarTV", "channelHandle": "@K1CarTV", "timestamp": "3 weeks ago", "duration": 679, "views": 421721, "badges": [], "channelApproval": "Verified", "channelThumbnails": [ { "url": "https:\/\/yt3.ggpht.com\/e55awD1ZXbmg6JrcBeopQFivJjs93SHFLLD3Gyzbb-z2-3DSh4Rp4mOji4Lss3UnTDCh7nss=s68-c-k-c0x00ffffff-no-rj", "width": 68, "height": 68 } ], "detailedMetadataSnippet": [ { "text": "newcar #oldcars #carcrashtest #iihs #euroncap What would happen if an old car crashed with a new car? New Car VS Old Car\u00a0..." } ], "chapters": [] } }, { "kind": "youtube#searchResult", "etag": "NotImplemented", "id": { "kind": "youtube#video", "videoId": "YAxLueEKqmU" }, "snippet": { "channelId": "UC4rlAVgAK0SGk-yTfe48Qpw", "title": "How Good Are Your Eyes? Cool and Quick Test", "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/YAxLueEKqmU\/hq720.jpg?sqp=-oaymwEjCOgCEMoBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLBGi1fBaYdrzuegkQj1P9BfKCf9Gw", "width": 360, "height": 202 }, { "url": "https:\/\/i.ytimg.com\/vi\/YAxLueEKqmU\/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLBj6uen-LOSVMXmSoeN9Q4HOP-3AQ", "width": 720, "height": 404 } ], "channelTitle": "BRIGHT SIDE", "channelHandle": "@BRIGHTSIDEOFFICIAL", "timestamp": "6 years ago", "duration": 497, "views": 59625349, "badges": [ "CC" ], "channelApproval": "Verified", "channelThumbnails": [ { "url": "https:\/\/yt3.ggpht.com\/QnTNTL6lvpKA-OWYdSwke3kF9GEBoriwaaHlbOOo4E7hRuXBEiO1mrYsvmk8xQznjg3GKWUT=s68-c-k-c0x00ffffff-no-rj", "width": 68, "height": 68 } ], "detailedMetadataSnippet": [ { "text": "How good is your eyesight? Here's a simple eyesight " }, { "text": "test", "bold": true }, { "text": " that will show how sharp your eyes are. We all know that \u201ceyes are the\u00a0..." } ], "chapters": [ { "title": null, "time": 0, "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/YAxLueEKqmU\/hqdefault_71000.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLCwwSE5NJgwSr0Nu5602D_66p8ZqQ", "width": 336, "height": 188 } ] }, { "title": null, "time": 0, "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/YAxLueEKqmU\/hqdefault_143933.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLB6fC-KNbZJCgPLrfc28f2Q9Cfz3w", "width": 336, "height": 188 } ] }, { "title": null, "time": 0, "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/YAxLueEKqmU\/hqdefault_233866.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLB-i8XyL5GPLEqFLN7QkLUSb9bsPQ", "width": 336, "height": 188 } ] }, { "title": null, "time": 0, "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/YAxLueEKqmU\/hqdefault_329866.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLCRBIQnt4WkC4CbD-K0_JMc5GKu3w", "width": 336, "height": 188 } ] }, { "title": null, "time": 0, "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/YAxLueEKqmU\/hqdefault_446766.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLAOEfkecM77Puva3MSAO3gtZfC0TA", "width": 336, "height": 188 } ] } ] } }, { "kind": "youtube#searchResult", "etag": "NotImplemented", "id": { "kind": "youtube#video", "videoId": "oMwZAU4ZHmo" }, "snippet": { "channelId": "UCfUG3KOVqkL1lY305OQCS1A", "title": "Guess the Hidden Word and Number | ILLUSION TEST", "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/oMwZAU4ZHmo\/hq720.jpg?sqp=-oaymwEjCOgCEMoBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLAzPklbHsLpvEVresgtY5OF7w5YcQ", "width": 360, "height": 202 }, { "url": "https:\/\/i.ytimg.com\/vi\/oMwZAU4ZHmo\/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLC8U556uGDt0IaQlpDACMDFI79oqQ", "width": 720, "height": 404 } ], "channelTitle": "QUIZZER CAT", "channelHandle": "@quizzercat", "timestamp": "1 year ago", "duration": 498, "views": 1019602, "badges": [], "channelApproval": "Verified", "channelThumbnails": [ { "url": "https:\/\/yt3.ggpht.com\/Gm0HDUAV6oHBL76S3Mzhz7exVKfBUnJiQ6YAPWzDTrfmniwMwuW_NTR-cKsC3VHMGDv683rk=s68-c-k-c0x00ffffff-no-rj", "width": 68, "height": 68 } ], "detailedMetadataSnippet": [ { "text": "Welcome to the exciting optical illusion video quiz! You will be " }, { "text": "testing", "bold": true }, { "text": " your visual perception skills by trying to decipher hidden\u00a0..." } ], "chapters": [] } }, { "kind": "youtube#searchResult", "etag": "NotImplemented", "id": { "kind": "youtube#video", "videoId": "KsFdm4aZ0xQ" }, "snippet": { "channelId": "UCNvzD7Z-g64bPXxGzaQaa4g", "title": "Test Drive Unlimited Solar Crown - Before You Buy", "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/KsFdm4aZ0xQ\/hq720.jpg?sqp=-oaymwEjCOgCEMoBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLDS2N0B4n4fnt2BZVj0uRFH00sg5w", "width": 360, "height": 202 }, { "url": "https:\/\/i.ytimg.com\/vi\/KsFdm4aZ0xQ\/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLCHEU2_WJscJSpPB5YlytzayeFnmw", "width": 720, "height": 404 } ], "channelTitle": "gameranx", "channelHandle": "@gameranxTV", "timestamp": "20 hours ago", "duration": 994, "views": 189096, "badges": [], "channelApproval": "Verified", "channelThumbnails": [ { "url": "https:\/\/yt3.ggpht.com\/ytc\/AIdro_mT3hsjvr0yyS6bW4inz3956572zV_j4t7TLsEOkK0G1VM=s68-c-k-c0x00ffffff-no-rj", "width": 68, "height": 68 } ], "detailedMetadataSnippet": [ { "text": "Test", "bold": true }, { "text": " Drive Unlimited Solar Crown marks the return of the classic racing franchise. How is it? Let's talk. Subscribe for more:\u00a0..." } ], "chapters": [] } }, { "kind": "youtube#searchResult", "etag": "NotImplemented", "id": { "kind": "youtube#video", "videoId": "vePc5V4h_kg" }, "snippet": { "channelId": "UCY1kMZp36IQSyNx_9h4mpCg", "title": "Shark Attack Test- Human Blood vs. Fish Blood", "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/vePc5V4h_kg\/hq720.jpg?sqp=-oaymwEjCOgCEMoBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLDAzN0HPEiRfceIOAHPr1AvwIiSvw", "width": 360, "height": 202 }, { "url": "https:\/\/i.ytimg.com\/vi\/vePc5V4h_kg\/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLBYEDbqoR6h3x0X_75ekfThfcq-tQ", "width": 720, "height": 404 } ], "channelTitle": "Mark Rober", "channelHandle": "@MarkRober", "timestamp": "4 years ago", "duration": 997, "views": 109665634, "badges": [ "CC" ], "channelApproval": "Verified", "channelThumbnails": [ { "url": "https:\/\/yt3.ggpht.com\/ytc\/AIdro_kwFxfJF-fQml8fUIvrd36ZstE2RO-C-IwDB-0qxQoc3Q=s68-c-k-c0x00ffffff-no-rj", "width": 68, "height": 68 } ], "detailedMetadataSnippet": [ { "text": "I personally got in the water and tested if Sharks had a preference of human blood vs. fish blood. Point of clarification: A few\u00a0..." } ], "chapters": [] } }, { "kind": "youtube#searchResult", "etag": "NotImplemented", "id": { "kind": "youtube#video", "videoId": "iVbopWyBR5Y" }, "snippet": { "channelId": "UC4rlAVgAK0SGk-yTfe48Qpw", "title": "A Color Test That Can Tell Your Mental Age", "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/iVbopWyBR5Y\/hq720.jpg?sqp=-oaymwEjCOgCEMoBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLDU9GqamIW_vLC4FFb7vxGz7_ZUHw", "width": 360, "height": 202 }, { "url": "https:\/\/i.ytimg.com\/vi\/iVbopWyBR5Y\/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLCQ9GjPbwKdwOpgqu3w88veyr_TQA", "width": 720, "height": 404 } ], "channelTitle": "BRIGHT SIDE", "channelHandle": "@BRIGHTSIDEOFFICIAL", "timestamp": "6 years ago", "duration": 457, "views": 45248237, "badges": [ "CC" ], "channelApproval": "Verified", "channelThumbnails": [ { "url": "https:\/\/yt3.ggpht.com\/QnTNTL6lvpKA-OWYdSwke3kF9GEBoriwaaHlbOOo4E7hRuXBEiO1mrYsvmk8xQznjg3GKWUT=s68-c-k-c0x00ffffff-no-rj", "width": 68, "height": 68 } ], "detailedMetadataSnippet": [ { "text": "A lot of the times your brain \u201cfeels\u201d way younger or older than you are. That's called mental age. Do you wanna know yours?" } ], "chapters": [ { "title": null, "time": 0, "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/iVbopWyBR5Y\/hqdefault.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLDIgP783BfP0KUJ3WyhC2fW7UW8Uw", "width": 336, "height": 188 } ] }, { "title": null, "time": 0, "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/iVbopWyBR5Y\/hqdefault_26933.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLCS5syuXq8vxIOrjn74m5UU2baEVw", "width": 336, "height": 188 } ] }, { "title": null, "time": 0, "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/iVbopWyBR5Y\/hqdefault_38866.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLCDdrkYz_GN5PhbYRNOJB3hyiFqYg", "width": 336, "height": 188 } ] }, { "title": null, "time": 0, "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/iVbopWyBR5Y\/hqdefault_56000.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLAnpvLQ_ehJkeUucXZlGwcR8_BRbg", "width": 336, "height": 188 } ] }, { "title": null, "time": 0, "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/iVbopWyBR5Y\/hqdefault_72900.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLC_XJBPRPjiJdVgV9fU_kBUGnZl4A", "width": 336, "height": 188 } ] }, { "title": null, "time": 0, "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/iVbopWyBR5Y\/hqdefault_111800.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLB4Y4UbfDWek4rpuulEY4F-Ud4x4w", "width": 336, "height": 188 } ] }, { "title": null, "time": 0, "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/iVbopWyBR5Y\/hqdefault_165766.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLD05zwPqf-X4i1QndHlIk2JE9jgzg", "width": 336, "height": 188 } ] }, { "title": null, "time": 0, "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/iVbopWyBR5Y\/hqdefault_179866.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLBYzrOUGdSTaK789XgdaJ5xGSqLSQ", "width": 336, "height": 188 } ] }, { "title": null, "time": 0, "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/iVbopWyBR5Y\/hqdefault_228800.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLARCPGv6jTAXN3eIa2sPG8ir3di0Q", "width": 336, "height": 188 } ] }, { "title": null, "time": 0, "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/iVbopWyBR5Y\/hqdefault_235833.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLBa1P4Je6X4gmTqQ5Up8yfo71Y1tw", "width": 336, "height": 188 } ] }, { "title": null, "time": 0, "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/iVbopWyBR5Y\/hqdefault_283166.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLC1BQhvyI-TAybXAQN4HFVAtaJiDg", "width": 336, "height": 188 } ] }, { "title": null, "time": 0, "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/iVbopWyBR5Y\/hqdefault_295766.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLD1YAPT-A7x2WySH2eifdRA8Is5vQ", "width": 336, "height": 188 } ] }, { "title": null, "time": 0, "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/iVbopWyBR5Y\/hqdefault_305266.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLBQYE7JYkeV6Xb-FJpDjy6CDqr4qw", "width": 336, "height": 188 } ] }, { "title": null, "time": 0, "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/iVbopWyBR5Y\/hqdefault_310900.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLB_ZSN-iXHoLUWPHaBBdf45KeYrVA", "width": 336, "height": 188 } ] }, { "title": null, "time": 0, "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/iVbopWyBR5Y\/hqdefault_342733.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLDbQwdBvP3AK2bryfsL9ECZNNSkOg", "width": 336, "height": 188 } ] }, { "title": null, "time": 0, "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/iVbopWyBR5Y\/hqdefault_354133.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLBlrvmiiM6eeyqdwGz6j9mXGmZeuQ", "width": 336, "height": 188 } ] }, { "title": null, "time": 0, "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/iVbopWyBR5Y\/hqdefault_365333.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLAxFGD_uvlHOXKND1qxxeOrUdStIg", "width": 336, "height": 188 } ] }, { "title": null, "time": 0, "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/iVbopWyBR5Y\/hqdefault_396033.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLDfSYtW5b3MuTRvunx5VnGBgJIX6Q", "width": 336, "height": 188 } ] }, { "title": null, "time": 0, "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/iVbopWyBR5Y\/hqdefault_413000.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLCjRueYkPixvNkg-2SD1Ra3ffp0tg", "width": 336, "height": 188 } ] } ] } }, { "kind": "youtube#searchResult", "etag": "NotImplemented", "id": { "kind": "youtube#video", "videoId": "wMzIHuWh_I0" }, "snippet": { "channelId": "UCXAhoI7XO2kafTMjocm0jCg", "title": "Seekae - Test & Recognise (Flume Re-Work)", "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/wMzIHuWh_I0\/hq720.jpg?sqp=-oaymwEjCOgCEMoBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLD1W3eeUaqM-zkWSm0hhxvnBk0a0g", "width": 360, "height": 202 }, { "url": "https:\/\/i.ytimg.com\/vi\/wMzIHuWh_I0\/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLAL8LSlYqLAHZfoNEa5Q9Kbz0pP-Q", "width": 720, "height": 404 } ], "channelTitle": "Flume", "channelHandle": null, "timestamp": "10 years ago", "duration": 304, "views": 39320295, "badges": [], "channelApproval": "Official Artist Channel", "channelThumbnails": [ { "url": "https:\/\/yt3.ggpht.com\/l2_vEYN8STsN4tEWUaOmyiyJ8fUZCPj0GYB84hLuiApSTczXCU7kMuCFEeIjMPqcUjzKWLyF=s88-c-k-c0x00ffffff-no-rj", "width": 68, "height": 68 } ], "detailedMetadataSnippet": [ { "text": "Seekae - " }, { "text": "Test", "bold": true }, { "text": " & Recognise - Flume Edit Subscribe to the Flume YouTube channel for more music & videos: http:\/\/flu.me\/YouTube\u00a0..." } ], "chapters": [] } }, { "kind": "youtube#searchResult", "etag": "NotImplemented", "id": { "kind": "youtube#video", "videoId": "NS0xBDFvUHs" }, "snippet": { "channelId": "UCvYhgH0hXziSz9IyPztzUug", "title": "Eva and Friends Exam Test at School", "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/NS0xBDFvUHs\/hq720.jpg?sqp=-oaymwEjCOgCEMoBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLBbJxP9D0ssTbbPIFvfPA2r1QAc-A", "width": 360, "height": 202 }, { "url": "https:\/\/i.ytimg.com\/vi\/NS0xBDFvUHs\/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLAyZb_0rUPDz4oC-WDh1PtM6k3u0w", "width": 720, "height": 404 } ], "channelTitle": "Eva Bravo Play", "channelHandle": "@EvaBravoPlay", "timestamp": "3 months ago", "duration": 2107, "views": 13442020, "badges": [ "4K" ], "channelApproval": "Verified", "channelThumbnails": [ { "url": "https:\/\/yt3.ggpht.com\/ytc\/AIdro_n_x2t1hs44jgaYhSikVwc0_QLRZVRYrXZ6PCwfQeJdKok=s68-c-k-c0x00ffffff-no-rj", "width": 68, "height": 68 } ], "detailedMetadataSnippet": [ { "text": "Eva and Friends try to pass the Exam " }, { "text": "Test", "bold": true }, { "text": " at school and other funny school adventures for kids 00:00 Eva and Friends Exam " }, { "text": "Test", "bold": true }, { "text": "\u00a0..." } ], "chapters": [ { "title": null, "time": 0, "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/NS0xBDFvUHs\/hqdefault_1866.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLBWGUb6STyiPhIWRPNweeL0awlYig", "width": 336, "height": 188 } ] }, { "title": null, "time": 0, "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/NS0xBDFvUHs\/hqdefault_529966.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLC_dkVEfY9ttqBa4dko5OfJUdZGcA", "width": 336, "height": 188 } ] }, { "title": null, "time": 0, "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/NS0xBDFvUHs\/hqdefault_1293866.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLAerRxuCvfLswSR0gmxPV-TqFlpOA", "width": 336, "height": 188 } ] }, { "title": null, "time": 0, "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/NS0xBDFvUHs\/hqdefault_1804866.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLDxb6wvdMcWFebof_frobrwYHo-aw", "width": 336, "height": 188 } ] } ] } }, { "kind": "youtube#searchResult", "etag": "NotImplemented", "id": { "kind": "youtube#video", "videoId": "uhiBAQmkdb0" }, "snippet": { "channelId": "UC0ytBCDB-F7hxfEHmfgSY0A", "title": "IQ Test For Genius Only - How Smart Are You ?", "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/uhiBAQmkdb0\/hq720.jpg?sqp=-oaymwEjCOgCEMoBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLDDhUDnmNSxvjeBbwqNBdZ_Z44l5Q", "width": 360, "height": 202 }, { "url": "https:\/\/i.ytimg.com\/vi\/uhiBAQmkdb0\/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLAJr_mTdypt1JIcz9ZldXlx3IYqXA", "width": 720, "height": 404 } ], "channelTitle": "Genius Test", "channelHandle": "@GeniusTests", "timestamp": "5 years ago", "duration": 388, "views": 10045453, "badges": [], "channelApproval": null, "channelThumbnails": [ { "url": "https:\/\/yt3.ggpht.com\/GG1vWZ2jrcNyHZhGS4LY76L9TQpMLZxSRnIsDX44CRVvm0UarZJZ-e2Mj8C_v8BaFz6r10-bYw=s68-c-k-c0x00ffffff-no-rj", "width": 68, "height": 68 } ], "detailedMetadataSnippet": [ { "text": "Quick IQ " }, { "text": "TEST", "bold": true }, { "text": " - Are you a Genius ? IQ " }, { "text": "Test", "bold": true }, { "text": " For Genius Only - How Smart Are You ? By Genius " }, { "text": "Test", "bold": true }, { "text": "." } ], "chapters": [] } }, { "kind": "youtube#searchResult", "etag": "NotImplemented", "id": { "kind": "youtube#video", "videoId": "045gB0iZ8GA" }, "snippet": { "channelId": "UCs-vWZu3t2ky3oImX83S_2Q", "title": "2024 RAM vs CHEVY vs FORD TORTURE TEST! Heavy towing, dirt roads - SHOCK WINNER & major problems", "thumbnails": [ { "url": "https:\/\/i9.ytimg.com\/vi\/045gB0iZ8GA\/hq720_custom_1.jpg?sqp=COCci7cG-oaymwEjCOgCEMoBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLDUsQPLfmuR5LuoCU2eKp4FodSSZA", "width": 360, "height": 202 }, { "url": "https:\/\/i9.ytimg.com\/vi\/045gB0iZ8GA\/hq720_custom_1.jpg?sqp=COCci7cG-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLAkq2G6atS5hjWAnPINTRgy8CeBBw", "width": 720, "height": 404 } ], "channelTitle": "4WD 24-7", "channelHandle": "@4WD247", "timestamp": "4 hours ago", "duration": 3040, "views": 37849, "badges": [ "4K" ], "channelApproval": "Verified", "channelThumbnails": [ { "url": "https:\/\/yt3.ggpht.com\/ytc\/AIdro_lTLgvhtKVX0nbKfz9w6m0PAZJ9MQPJTOKb7rL7FcM2ph0=s68-c-k-c0x00ffffff-no-rj", "width": 68, "height": 68 } ], "detailedMetadataSnippet": [ { "text": "For the FIRST time, we are " }, { "text": "testing", "bold": true }, { "text": " all of the American rigs you commonly see on our Aussie roads! Models we're " }, { "text": "testing", "bold": true }, { "text": "\u00a0..." } ], "chapters": [] } }, { "kind": "youtube#searchResult", "etag": "NotImplemented", "id": { "kind": "youtube#video", "videoId": "FsvJzfXZI18" }, "snippet": { "channelId": "UCTrSsPMmZavLbc3Ex7VhjDg", "title": "Testing The Assassination Attempt of Donald Trump", "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/FsvJzfXZI18\/hq720.jpg?sqp=-oaymwEjCOgCEMoBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLAf28Zv91NBxtKWgSLbL5Kr0MFIKQ", "width": 360, "height": 202 }, { "url": "https:\/\/i.ytimg.com\/vi\/FsvJzfXZI18\/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLDD01Nvn-F6Wk2M0o1vKHb-UkrfKw", "width": 720, "height": 404 } ], "channelTitle": "Brandon Herrera", "channelHandle": "@BrandonHerrera", "timestamp": "1 month ago", "duration": 1003, "views": 7756137, "badges": [ "4K" ], "channelApproval": "Verified", "channelThumbnails": [ { "url": "https:\/\/yt3.ggpht.com\/ytc\/AIdro_lKTZ9o7UIG4sgEI_ud4wLnASHNVT16xw0ldQ8FGfdpE1w=s68-c-k-c0x00ffffff-no-rj", "width": 68, "height": 68 } ], "detailedMetadataSnippet": [ { "text": "Today we use ballistic data and high speed imagery to put to be some of the myths and conspiracy theories around the attempted\u00a0..." } ], "chapters": [] } }, { "kind": "youtube#searchResult", "etag": "NotImplemented", "id": { "kind": "youtube#video", "videoId": "5cysPPnZEhM" }, "snippet": { "channelId": "UCoUXxtd712vGe5p5lBk_eMg", "title": "The Smile Test", "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/5cysPPnZEhM\/hqdefault.jpg?sqp=-oaymwEjCOADEI4CSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLBdhxvdlpDAxk5Jk0raZMzHuMWgQg", "width": 480, "height": 270 } ], "channelTitle": "In59seconds", "channelHandle": "@In59seconds", "timestamp": "10 years ago", "duration": 59, "views": 21084609, "badges": [ "CC" ], "channelApproval": "Verified", "channelThumbnails": [ { "url": "https:\/\/yt3.ggpht.com\/ytc\/AIdro_k6v6o3Lz0Ypp-bdHwJSBhugY1iW5mJQklD7lYMmGosNA=s68-c-k-c0x00ffffff-no-rj", "width": 68, "height": 68 } ], "detailedMetadataSnippet": [ { "text": "The presenter and producers not responsible for any adverse effects resulting from the use of the information presented in this\u00a0..." } ], "chapters": [] } }, { "kind": "youtube#searchResult", "etag": "NotImplemented", "id": { "kind": "youtube#video", "videoId": "GzSz5FBZQe0" }, "snippet": { "channelId": "UCgrNz-aDmcr2uuto8_DL2jg", "title": "New progress made in China's reusable rocket test", "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/GzSz5FBZQe0\/hq720.jpg?sqp=-oaymwEjCOgCEMoBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLAp9aMISYzmH2STvdivVSAUaA8XFw", "width": 360, "height": 202 }, { "url": "https:\/\/i.ytimg.com\/vi\/GzSz5FBZQe0\/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLAI9pYX5Nv7sOrYx3KV4rUQPpdC4A", "width": 720, "height": 404 } ], "channelTitle": "CGTN", "channelHandle": "@cgtn", "timestamp": "6 hours ago", "duration": 144, "views": 2629, "badges": [], "channelApproval": null, "channelThumbnails": [ { "url": "https:\/\/yt3.ggpht.com\/5a5D_Wc4hjQ_u5F3r0WWaaA9VB5Ml-SdPKLSwSoIHkHb1F--SexiM4eFfCHeXtAOr5akpEEWBwI=s68-c-k-c0x00ffffff-no-rj", "width": 68, "height": 68 } ], "detailedMetadataSnippet": [ { "text": "For more: https:\/\/news.cgtn.com\/news\/2024-09-12\/New-progress-made-in-China-s-reusable-rocket-" }, { "text": "test", "bold": true }, { "text": "-1wPAvudz7mo\/p.html\u00a0..." } ], "chapters": [] } }, { "kind": "youtube#searchResult", "etag": "NotImplemented", "id": { "kind": "youtube#video", "videoId": "PK_EJ3DyiiA" }, "snippet": { "channelId": "UCdqp0KK_Io7TwK5cJMBvB0Q", "title": "WhistlinDiesel Cybertruck Durability Test #1", "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/PK_EJ3DyiiA\/hq720.jpg?sqp=-oaymwEjCOgCEMoBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLAWAIeGGgaNjWIRF2rcQ-3yYMcGDg", "width": 360, "height": 202 }, { "url": "https:\/\/i.ytimg.com\/vi\/PK_EJ3DyiiA\/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLCJdw9CU5ncA5Q1FMrkdGhL9CUYnQ", "width": 720, "height": 404 } ], "channelTitle": "WhistlinDiesel", "channelHandle": "@whistlindiesel", "timestamp": "1 month ago", "duration": 1315, "views": 23502459, "badges": [ "4K" ], "channelApproval": "Verified", "channelThumbnails": [ { "url": "https:\/\/yt3.ggpht.com\/SsmCSeJP63Ni-BIDQSWrkFgn6BVOenI1gdkGRUywXuenaFi8SzRwoD4MY5MFuZRbJjhjU95k3EI=s68-c-k-c0x00ffffff-no-rj", "width": 68, "height": 68 } ], "detailedMetadataSnippet": [ { "text": "Welcome to the place that's going to tell you everything you ACTUALLY need to know about the Cybertruck This " }, { "text": "test", "bold": true }, { "text": " is at my\u00a0..." } ], "chapters": [] } }, { "kind": "youtube#searchResult", "etag": "NotImplemented", "id": { "kind": "youtube#video", "videoId": "2a4Uxdy9TQY" }, "snippet": { "channelId": "UCroqujvAIVKTBvJbE2E9cCA", "title": "Idiot Test - 90% fail", "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/2a4Uxdy9TQY\/hq720.jpg?sqp=-oaymwEjCOgCEMoBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLAYMZ_0CL0SqORWoFRa1OHj_-_nfA", "width": 360, "height": 202 }, { "url": "https:\/\/i.ytimg.com\/vi\/2a4Uxdy9TQY\/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLC6h7un-jSO3TGmLF28Hdo2NOIrSQ", "width": 720, "height": 404 } ], "channelTitle": "BrainLift", "channelHandle": "@BrainLiftQuiz", "timestamp": "9 years ago", "duration": 156, "views": 21220159, "badges": [], "channelApproval": "Verified", "channelThumbnails": [ { "url": "https:\/\/yt3.ggpht.com\/EeSPiltTxVCXx7u7VS0TAszVA1Ovhi90L2u61xzDT0bzDxvkYufWnfr0tg5StMT2JvQezVX1=s68-c-k-c0x00ffffff-no-rj", "width": 68, "height": 68 } ], "detailedMetadataSnippet": [ { "text": "This video will " }, { "text": "test", "bold": true }, { "text": " your idiot nature by asking you some questions - are you prone to being carried away by irrelevant information\u00a0..." } ], "chapters": [ { "title": null, "time": 0, "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/2a4Uxdy9TQY\/hqdefault_2000.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLAGlr1ph6H3XclGVKZkge-9iYikOQ", "width": 336, "height": 188 } ] }, { "title": null, "time": 0, "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/2a4Uxdy9TQY\/hqdefault_33866.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLD6wMiPmDERdoYvNHQeXFoyv6rErw", "width": 336, "height": 188 } ] }, { "title": null, "time": 0, "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/2a4Uxdy9TQY\/hqdefault_66933.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLDf3KC11eOKy9lpvV8esp84VVzESg", "width": 336, "height": 188 } ] }, { "title": null, "time": 0, "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/2a4Uxdy9TQY\/hqdefault_87866.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLAAEu3z9Ew_4-IUl7MnQOhbxuHaOg", "width": 336, "height": 188 } ] }, { "title": null, "time": 0, "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/2a4Uxdy9TQY\/hqdefault_99966.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLCezDXyTtRlzUUErY3j6oJ4eI0NFw", "width": 336, "height": 188 } ] }, { "title": null, "time": 0, "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/2a4Uxdy9TQY\/hqdefault_115000.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLDhtSfxFlzPVcyBlultYviTMQ9FfA", "width": 336, "height": 188 } ] }, { "title": null, "time": 0, "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/2a4Uxdy9TQY\/hqdefault_121000.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLD03XagFPgWaHIkemBTwesbdaCSWA", "width": 336, "height": 188 } ] }, { "title": null, "time": 0, "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/2a4Uxdy9TQY\/hqdefault_151900.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLD_l1D0hYVOXyFdA1ja1y_i4_kTHA", "width": 336, "height": 188 } ] } ] } }, { "kind": "youtube#searchResult", "etag": "NotImplemented", "id": { "kind": "youtube#video", "videoId": "qQFkur0FGWg" }, "snippet": { "channelId": "UC_wITz-Ze4JFc3WLQA1n3Hw", "title": "Good sister helps Ruby with her test", "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/qQFkur0FGWg\/hq720.jpg?sqp=-oaymwEjCOgCEMoBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLDMM2j6VMJfLa_1Vp7SzGgWxxA4EA", "width": 360, "height": 202 }, { "url": "https:\/\/i.ytimg.com\/vi\/qQFkur0FGWg\/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLA1VNaCxxzWxJOACU5kk3PhfYlSrA", "width": 720, "height": 404 } ], "channelTitle": "RubyandBonnie", "channelHandle": "@RubyandBonnie", "timestamp": "2 years ago", "duration": 323, "views": 21433651, "badges": [], "channelApproval": "Verified", "channelThumbnails": [ { "url": "https:\/\/yt3.ggpht.com\/ytc\/AIdro_kBOIz4qWK_tTtUiWyOHqnvdfY5cCHYOCZAHegzcqVjbTM=s68-c-k-c0x00ffffff-no-rj", "width": 68, "height": 68 } ], "detailedMetadataSnippet": [ { "text": "Ruby and Bonnie are in a " }, { "text": "test", "bold": true }, { "text": " for school but Ruby did not study or revise. Bonnie decides to help Ruby with Maths after Ruby fails\u00a0..." } ], "chapters": [] } }, { "kind": "youtube#searchResult", "etag": "NotImplemented", "id": { "kind": "youtube#video", "videoId": "o-Ux0UsyYkc" }, "snippet": { "channelId": "UCjnUIDJYhB5wtvRIZ4bKSLg", "title": "\ud83e\udde0 Test Your Genius Level IQ with These Mind Blowing General Knowledge Questions! \ud83c\udf1f", "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/o-Ux0UsyYkc\/hq720.jpg?sqp=-oaymwEjCOgCEMoBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLBJaryecjpO-2dFkbI8sl23dUke-Q", "width": 360, "height": 202 }, { "url": "https:\/\/i.ytimg.com\/vi\/o-Ux0UsyYkc\/hq720.jpg?sqp=-oaymwEXCNAFEJQDSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLCPZ7lXmXEc2wNu6Vm9PO8caNB75Q", "width": 720, "height": 404 } ], "channelTitle": "Puzzlonic", "channelHandle": "@Puzzlonic", "timestamp": "4 months ago", "duration": 752, "views": 1545078, "badges": [], "channelApproval": null, "channelThumbnails": [ { "url": "https:\/\/yt3.ggpht.com\/2Dmd5hCkfr7pTYgXqWROX02cgsEU7_kW7-lyJN4nEh1dyZnvOdE3J1-J76bIT4HOanl6T3pR=s68-c-k-c0x00ffffff-no-rj", "width": 68, "height": 68 } ], "detailedMetadataSnippet": [ { "text": "iqleval #generalknowledge #" }, { "text": "test", "bold": true }, { "text": " #braingames Assalam u Alaikum ! Welcome to the ultimate IQ challenge! Are you ready to put\u00a0..." } ], "chapters": [] } } ] } ```

works fine.

curl -I 'https://yt.lemnoslife.com/noKey/search?q=test'
HTTP/1.0 500 Internal Server Error
Date: Thu, 12 Sep 2024 11:20:21 GMT
Server: Apache/2.4.58 (Ubuntu)
Access-Control-Allow-Origin: *
Connection: close
Content-Type: application/json; charset=UTF-8

Also pay attention to private instances.

Benjamin-Loison commented 2 months ago
curl 'http://localhost/YouTube-operational-API/noKey/search?q=test'
Output: ```json { "kind": "youtube#searchListResponse", "etag": "LWl_ZvAU5TjBuLidpWOu_rSNeXo", "nextPageToken": "CAUQAA", "regionCode": "FR", "pageInfo": { "totalResults": 1000000, "resultsPerPage": 5 }, "items": [ { "kind": "youtube#searchResult", "etag": "YdkLmG6ReizQHsHj-_w8JZe4rMg", "id": { "kind": "youtube#video", "videoId": "dbjPnXaacAU" } }, { "kind": "youtube#searchResult", "etag": "T9baUyeILEBvFRhwSg290Z3Thyw", "id": { "kind": "youtube#video", "videoId": "iVbopWyBR5Y" } }, { "kind": "youtube#searchResult", "etag": "Y7nrEsXnuk0ZYM8fMa3OfQPAWwM", "id": { "kind": "youtube#video", "videoId": "YAxLueEKqmU" } }, { "kind": "youtube#searchResult", "etag": "wKv78aHFhH7hFRkdVIrX0V_DWFg", "id": { "kind": "youtube#video", "videoId": "4R41x-U-gq8" } }, { "kind": "youtube#searchResult", "etag": "ETw19z57-4Mv-1duFGqO7YEloY0", "id": { "kind": "youtube#video", "videoId": "5cysPPnZEhM" } } ] } ```

works fine, so the issue is on the official instance side.

Benjamin-Loison commented 2 months ago
tail /var/log/apache2/error.log
...
[Thu Sep 12 11:53:13.377291 2024] [php:error] [pid 348545] [client XXX.XXX.XXX.XXX:XXXXX] PHP Fatal error:  Uncaught TypeError: array_key_exists(): Argument #2 ($array) must be of type array, null given in /var/www/html/noKey/index.php:52\nStack trace:\n#0 {main}\n  thrown in /var/www/html/noKey/index.php on line 52
Benjamin-Loison commented 2 months ago
wc -l keys.txt
2461 keys.txt
Benjamin-Loison commented 2 months ago
head keys.txt
AIzaSyDXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
AIzaSyBXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
AIzaSyDXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
AIzaSyDXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
AIzaSyCXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
AIzaSyAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
AIzaSyAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
AIzaSyAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
AIzaSyBXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
AIzaSyCXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

seems correct.

First YouTube Data API v3 key:

https://www.googleapis.com/youtube/v3/videos?part=snippet&id=_ZPpU7774DQ&key=AIzaSyDXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Output: ```json { "kind": "youtube#videoListResponse", "etag": "_Tae_NLKejiN1NmhTgxwtdXK7xA", "items": [ { "kind": "youtube#video", "etag": "ZXxjo7VmevWeRV4F5CPIhn345iA", "id": "_ZPpU7774DQ", "snippet": { "publishedAt": "2017-04-07T15:31:14Z", "channelId": "UCWeg2Pkate69NFdBeuRFTAw", "title": "OVERWATCH RAP BATTLE", "description": "Vidéo sponsorisée par Blizzard et inspirée de l’univers Overwatch.\nMusique par NODEY & PV Nova\nLe jeu : http://blizz.ly/2oR28iG\nUn immense merci aux copains qui m'ont fait confiance :\nCyprien : https://www.youtube.com/user/MonsieurDream\nMister V : https://www.youtube.com/user/mistervofficial\nNatoo : https://www.youtube.com/user/ptitenatou\nJulfou : https://www.youtube.com/user/JulienJosselin\nAndy : https://www.youtube.com/user/AndyRaconte\nLola Dubini : https://www.youtube.com/user/Loladub63\nEleonore Costes : https://twitter.com/EleonoreCostes\nAlphacast : https://www.youtube.com/user/GuildeMeow\nMamytwink : https://www.youtube.com/user/mamytwink\n\nMerci aussi à toutes les personnes qui ont contribué à la réalisation de ce projet d'une quelconque manière et à Dorothée Pousséo pour nous avoir prêté sa voix.", "thumbnails": { "default": { "url": "https://i.ytimg.com/vi/_ZPpU7774DQ/default.jpg", "width": 120, "height": 90 }, "medium": { "url": "https://i.ytimg.com/vi/_ZPpU7774DQ/mqdefault.jpg", "width": 320, "height": 180 }, "high": { "url": "https://i.ytimg.com/vi/_ZPpU7774DQ/hqdefault.jpg", "width": 480, "height": 360 }, "standard": { "url": "https://i.ytimg.com/vi/_ZPpU7774DQ/sddefault.jpg", "width": 640, "height": 480 }, "maxres": { "url": "https://i.ytimg.com/vi/_ZPpU7774DQ/maxresdefault.jpg", "width": 1280, "height": 720 } }, "channelTitle": "SQUEEZIE", "tags": [ "overwatch song", "overwatch live action", "overwatch irl", "overwatch rap", "overwatch clash", "squeezie overwatch" ], "categoryId": "10", "liveBroadcastContent": "none", "defaultLanguage": "fr", "localized": { "title": "OVERWATCH RAP BATTLE", "description": "Vidéo sponsorisée par Blizzard et inspirée de l’univers Overwatch.\nMusique par NODEY & PV Nova\nLe jeu : http://blizz.ly/2oR28iG\nUn immense merci aux copains qui m'ont fait confiance :\nCyprien : https://www.youtube.com/user/MonsieurDream\nMister V : https://www.youtube.com/user/mistervofficial\nNatoo : https://www.youtube.com/user/ptitenatou\nJulfou : https://www.youtube.com/user/JulienJosselin\nAndy : https://www.youtube.com/user/AndyRaconte\nLola Dubini : https://www.youtube.com/user/Loladub63\nEleonore Costes : https://twitter.com/EleonoreCostes\nAlphacast : https://www.youtube.com/user/GuildeMeow\nMamytwink : https://www.youtube.com/user/mamytwink\n\nMerci aussi à toutes les personnes qui ont contribué à la réalisation de ce projet d'une quelconque manière et à Dorothée Pousséo pour nous avoir prêté sa voix." }, "defaultAudioLanguage": "fr" } } ], "pageInfo": { "totalResults": 1, "resultsPerPage": 1 } } ```

works fine.

Benjamin-Loison commented 2 months ago

https://github.com/Benjamin-Loison/YouTube-operational-API/blob/11566147f4d54b8d8d8481709fd5bf6b1329f4de/noKey/index.php#L45

so $json is null. Line number shift due to possibly required mutex.

Benjamin-Loison commented 2 months ago

Suffer of #165 even for debugging... Cannot I prioritize my HTTPS requests?

Benjamin-Loison commented 2 months ago
        if ($_SERVER['REMOTE_ADDR'] === 'XXX.XXX.XXX.XXX') {
            die('Testing debugging');
        }
Benjamin-Loison commented 2 months ago

$response:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Sorry...</title>
<style> body { font-family: verdana, arial, sans-serif; background-color: #fff; color: #000; }</style>
</head>
<body>
<div><table><tr>
<td><b><font face="sans-serif" size="10"><font color="#4285f4">G</font><font color="#ea4335">o</font><font color="#fbbc05">o</font><font color="#4285f4">g</font><font color="#34a853">l</font><font color="#ea4335">e</font></font></b></td>
<td style="text-align: left; vertical-align: bottom; padding-bottom: 15px; width: 50%"><div style="border-bottom: 1px solid #dfdfdf;">Sorry...</div></td>
</tr></table></div>
<div style="margin-left: 4em;">
<h1>We're sorry...</h1>
<p>... but your computer or network may be sending automated queries. To protect our users, we can't process your request right now.</p>
</div>
<div style="margin-left: 4em;">See <a href="https://support.google.com/websearch/answer/86640">Google Help</a> for more information.<br><br>
</div>
<div style="text-align: center; border-top: 1px solid #dfdfdf;"><a href="https://www.google.com">Google Home</a></div>
</body>
</html>

https://support.google.com/websearch/answer/86640 does not help much.

In theory weird to obtain this message for an API usage...

$realUrl: https://www.googleapis.com/youtube/v3/search?q=test&key=AIzaSyDXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

$options:

{"http":{"ignore_errors":true}}

so as defined.

Benjamin-Loison commented 2 months ago

On the official instance https://www.googleapis.com/youtube/v3/videos?part=snippet&id=_ZPpU7774DQ&key=AIzaSyDXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX results in above HTML error, while locally it works fine.

So this looks like a serious issue.

Benjamin-Loison commented 2 months ago
head -n 1230 keys.txt | tail -n 1
AIzaSyCXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

has the same issue, hence it is does not seem to be someone who parametered his YouTube Data API v3 key weirdly and added it to the pool.

Benjamin-Loison commented 2 months ago

As I do not plan to use proxies as it's a free service and Tor does not seem appropriate for such a strong usage all the time, I am going to invsestigate TEEs as mentioned in #165 and otherwise possibly provide the way to generate keys.txt, possibly providing it itself but maybe not for legal reasons.

TEEs need to be established for each type CPU brand I guess...

It allows manufacturers to grant access to TEEs only to software developers who have a (usually commercial) business agreement with the manufacturer

Wikipedia: Software Guard Extensions

Wikipedia: TrustZone

Wikipedia: Trusted execution environment#Hardware support (1237724671)

A pivot by Intel in 2021 resulted in the deprecation of SGX from the 11th and 12th generation Intel Core Processors, but development continues on Intel Xeon for cloud and enterprise use.

On my Linux Mint 22 Cinnamon Framework 13:

grep 'model name' /proc/cpuinfo | head -n 1
model name  : 12th Gen Intel(R) Core(TM) i5-1240P

I know someone who worked with TEE it was:

-----BEGIN PGP MESSAGE-----

hF4DTQa9Wom5MBgSAQdAOUs3yR9CyN6/7X/sc3JbKzQHoylbqcoNsxDWf5e33A4w
m7vI7rb6k++Xtgjeo6OtZrijg/W2lncCKRmwLYpPLGH24nsuGMzZ4Mua7JwavrSW
0kcB7SJpvXygQ4uxNdJ4v8emI8+ezM9hRPqlQQqBe56cKV4fuukLHKkAm2/Wslss
aC4f2WISoMunZ1XafLQDSfzH3otZq8X+Bg==
=7a18
-----END PGP MESSAGE-----

It seems clear that outside of the TEE things are analyzable, so the user can deduce the YouTube server being contacted etc, just want the URL parameter being the key is not accessible, so can this HTTPS encryption happens in the TEE? The question is how can the TEE make sure that the public key is the right one and not one manipulated by the user? Note that I look for an easy and secure way to proceed. TEE may have the HTTPS root of trust encoded, then a program can provide intermediary trust levels to prove the public key.

Support for SGX in the CPU is indicated in CPUID "Structured Extended feature Leaf", EBX bit 02,[8] but its availability to applications requires BIOS/UEFI support and opt-in enabling which is not reflected in CPUID bits. This complicates the feature detection logic for applications.

Both in the 11th and 12th generations of Intel Core processors, SGX is listed as "Deprecated" and thereby not supported on "client platform" processors.[6][14][15] This removed support of playing Ultra HD Blu-ray discs on officially licensed software, such as PowerDVD.

Searching DuckDuckGo and Google SGX HTTPS.

intel-sgx-ssl

As I like the idea of open stuff, like not constrain people to use a given CPU brand, I may prefer to just share publicly the YouTube Data API v3 keys source.

Google results for SGX HTTPS Python do not seem to make things work out of the box.

Benjamin-Loison commented 2 months ago

In fact maybe the web-scraping is the issue, however it works fine so it does not seem to come from that.

Benjamin-Loison commented 2 months ago

I confirm https://yt.lemnoslife.com/search?part=snippet&q=test to still be working, so it does not seem to be a temporary/an illogical issue.

Benjamin-Loison commented 2 months ago
 curl 'https://XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.yt.lemnoslife.com/noKey/search?q=test&instanceKey=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'

and

 curl 'https:/www.googleapis.com/youtube/v3/videos?part=snippet&id=_ZPpU7774DQ&key=AIzaSyCXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'

work fine on the private instance (I proceeded twice):

-----BEGIN PGP MESSAGE-----

hF4DTQa9Wom5MBgSAQdAC/k22T0gn4jwvi6j3rC3Yw6N8SllK2uTur/FcuNjOGkw
UPa2N4Jqkat+1Poy+xyqZqDgHpwddCzxSuxocq+TsKIWR58UWgP2428/sfcOTuXI
0lsBZE35sLYF4u32O6El/VTYq5RcMkLEqypwNLb5K8Dv5I3qPXkj7y+sJmjvMlAl
LIsl0wNdE/kQRUKYJI2leY0gyZEfyxrnZFO5D4eIk4JzVWAX6SjwfpXn00hW
=178T
-----END PGP MESSAGE-----
Benjamin-Loison commented 2 months ago
curl 'https://yt.lemnoslife.com/noKey/search?q=test'
{
    "error": {
        "code": 403,
        "message": "YouTube has detected unusual traffic from this YouTube operational API instance no-key service. This issue is currently being investigated at https:\/\/github.com\/Benjamin-Loison\/YouTube-operational-API\/issues\/301"
    }
}

As got on Element:

vps713872
www-data
-c cd ytPrivate/ && ./[checkInstance.py](http://checkinstance.py/)
Traceback (most recent call last):
  File "/var/www/ytPrivate/./[checkInstance.py](http://checkinstance.py/)", line 146, in <module>
    testInstance(instance['domain'], service, instance.get('key'), notifyOnError)
  File "/var/www/ytPrivate/./[checkInstance.py](http://checkinstance.py/)", line 79, in testInstance
    keysCount = contentJSON['monitoring'] if hasRetrievedAJson else None
                ~~~~~~~~~~~^^^^^^^^^^^^^^
KeyError: 'monitoring'

On yt0.lemnoslife.com:

diff /var/www/ytPrivate/instances.json{.old,}
3,5d2
<         "domain": "yt"
<     },
<     {
Benjamin-Loison commented 2 months ago

91 seems to require too much work too quickly.

Benjamin-Loison commented 2 months ago

https://discord.com/channels/933841502155706418/933841503103627316/1283770821332172860

Could disable ability for anyone to add keys to prevent spam of the YouTube servers but nobody has automatized this behavior as far as I know.

noKey/index.php:

dieWithJsonMessage('YouTube has detected unusual traffic from this YouTube operational API instance no-key service. This issue is currently being investigated at https://github.com/Benjamin-Loison/YouTube-operational-API/issues/301', 403);

crontab on the official instance

* * * * * curl -s 'https://www.googleapis.com/youtube/v3/videos?part=snippet&id=_ZPpU7774DQ&key=AIzaSyCXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' | sha512sum | grep -q -w '66516dc04d10e9a445547c2be6624cf1da065f8eb74e9537985f3c58296b3f71deed6d98932801d5da581901525ce53b04b91491233ec6c2ba9128e10be03b1c' || curl -G https://lemnoslife.com/BEN/notify.php --data-urlencode 'message=The official instance no-key service response changed!' -d key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

I verified that I correctly receive an Element notification if I change the hardcoded checksum.

https://discord.com/channels/933841502155706418/933841503103627316/1284553137314725973

The Stack Overflow question 3577641 seems overkill.

        if($json === null && str_contains($response, "... but your computer or network may be sending automated queries. To protect our users, we can't process your request right now.")) {
            dieWithJsonMessage('YouTube has detected unusual traffic from this YouTube operational API instance no-key service. This issue is currently being investigated at https://github.com/Benjamin-Loison/YouTube-operational-API/issues/301', 403);
        }
Benjamin-Loison commented 2 months ago

Hence, the official instance no-key service will behave differently in the future. It will redirect to the YouTube Data API v3 endpoint with a very probably working YouTube Data API v3 key.

So this YouTube Data API v3 key will be known to the user. It's better than providing complete keys.txt and it does not seem that people can force moving to another key of keys.txt to exhaustively list it. So contrarily to before, the no-key service would not proceed to the request but make the end-user proceed to it, there is no CORS issue in retrieving YouTube Data API v3 as far as I know so it should be fine. So contrarily to before, it leaks a current working YouTube Data API v3 being the same one for everyone using the no-key service at this time. Is this legally fine enough? Do not change the behavior of private instances, as the redirect may require some end-user change to support it.

Should test if technically such an approach works fine.

Could make a request using the YouTube Data API v3 key that plan to provide to make sure before to provide it that it works and afterwards to check if the end-user request(s) exhausted it. However, the purpose of the former check is to ensure that, so the following check looks useless. The guarantee of the no-key service is that just before providing the YouTube Data API v3 key it used to work before. So we do not guarantee anymore the end-user to receive no more quota error, however it can detects them as the no-key service does and request a new YouTube Data API v3 key.

Note that currently the official instance cannot verify that the provided YouTube Data API v3 key works fine, can temporarily rely on a proxy for this purpose however the proxy may be IP banned as it would make as many requests as YouTube Data API v3. However, if the ban is due to quota consumption, can make the proxy verify the key with a low quota usage endpoint like videos.

Benjamin-Loison commented 2 months ago

Answering https://discord.com/channels/933841502155706418/933841503103627316/1283802304004227207:

"https://www.googleapis.com/youtube/v3/" "AIzaSy" site:stackoverflow.com DuckDuckGo and Google do not return results with complete YouTube Data API v3 keys.

Benjamin-Loison commented 2 months ago

Maybe can just make no-key service relies on redirections if it works fine, instead of sharing the way to retrieve all YouTube Data API v3 keys.

This seems less a legal issue, but at some point backing up would make sense anyway. With such an approach except this repository and lemnoslife.com domain name OVH VPS yt0.lemnoslife.com and Oracle VPS yt.lemnoslife.com other stuff should not be hurted but instead of a repository ban it may be an account ban so after proceeding to the change backing up may make sense. Note that on Stack Overflow and Codeberg I may have mentioned the no-key service, should back up these plateforms as well.

Benjamin-Loison commented 2 months ago
curl https://yt.lemnoslife.com/noKey/redirect/index.php
{
    "error": {
        "code": 403,
        "message": "YouTube has detected unusual traffic from this YouTube operational API instance no-key service. This issue is currently being investigated at https:\/\/github.com\/Benjamin-Loison\/YouTube-operational-API\/issues\/301"
    }
}

This is due to yt/noKey/.htaccess:

Options +FollowSymLinks
RewriteEngine on

RewriteRule ^.*$ index.php
curl https://yt.lemnoslife.com/noKeyRedirect/index.php
WIP
Benjamin-Loison commented 2 months ago

We look for temporary and not permanent redirections, users should not use forever the redirected to https://www.googleapis.com/youtube/v3/search?q=test&key=AIzaSyCXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.

In the context of the Stack Overflow answer 768472.

Benjamin-Loison commented 2 months ago
<?php

    if($_SERVER['REMOTE_ADDR'] == 'XXX.XXX.XXX.XXX') {
        //die('Debugging');
        $url = 'https://www.googleapis.com/youtube/v3/' . 'search?q=test' . '&key=AIzaSyCXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
        header("Location: $url");
        die();
    }

    die('WIP');

?>
curl https://yt.lemnoslife.com/noKeyRedirect/search?q=test

does not redirect anything.

curl -L https://yt.lemnoslife.com/noKeyRedirect/search?q=test
Output: ```json { "kind": "youtube#searchListResponse", "etag": "BOw6mbCIa5x6hhF_Ihydbi1q9RM", "nextPageToken": "CAUQAA", "regionCode": "FR", "pageInfo": { "totalResults": 1000000, "resultsPerPage": 5 }, "items": [ { "kind": "youtube#searchResult", "etag": "YdkLmG6ReizQHsHj-_w8JZe4rMg", "id": { "kind": "youtube#video", "videoId": "dbjPnXaacAU" } }, { "kind": "youtube#searchResult", "etag": "sASSprqt2DoZoqt4xlbQYK2vRVc", "id": { "kind": "youtube#video", "videoId": "BNichfWXPoM" } }, { "kind": "youtube#searchResult", "etag": "T9baUyeILEBvFRhwSg290Z3Thyw", "id": { "kind": "youtube#video", "videoId": "iVbopWyBR5Y" } }, { "kind": "youtube#searchResult", "etag": "Y7nrEsXnuk0ZYM8fMa3OfQPAWwM", "id": { "kind": "youtube#video", "videoId": "YAxLueEKqmU" } }, { "kind": "youtube#searchResult", "etag": "WxJTFAVQHxqUDl20v3LnHtlaNm0", "id": { "kind": "youtube#video", "videoId": "3J0VZ6JX60w" } } ] } ```

Should log what YouTube Data API v3 keys have specified to figure out how many of the keys we leak how quickly. In fact we do not run out of quota per day but by looping except if there is a single huge quota provided key, they will all in a few days be leaked in theory so it does not make much sense, hence have to hurry to back up to not have bad surprises.

curl -I https://yt.lemnoslife.com/noKeyRedirect/search?q=test
HTTP/1.1 302 Found
Date: Thu, 12 Sep 2024 15:51:08 GMT
Server: Apache/2.4.58 (Ubuntu)
Location: https://www.googleapis.com/youtube/v3/search?q=test&key=AIzaSyCXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Access-Control-Allow-Origin: *
Content-Type: text/html; charset=UTF-8

So concerning curl it works as wanted, what about Python requests for instance?

import requests
import json

URL = 'https://yt.lemnoslife.com/noKeyRedirect/search'
params = {
    'q': 'test',
}
data = requests.get(URL, params).json()
print(json.dumps(data, indent = 4))
Output: ```json { "kind": "youtube#searchListResponse", "etag": "7TXOj21jVH75kxG4B07LHOh4r-4", "nextPageToken": "CAUQAA", "regionCode": "FR", "pageInfo": { "totalResults": 1000000, "resultsPerPage": 5 }, "items": [ { "kind": "youtube#searchResult", "etag": "YdkLmG6ReizQHsHj-_w8JZe4rMg", "id": { "kind": "youtube#video", "videoId": "dbjPnXaacAU" } }, { "kind": "youtube#searchResult", "etag": "sASSprqt2DoZoqt4xlbQYK2vRVc", "id": { "kind": "youtube#video", "videoId": "BNichfWXPoM" } }, { "kind": "youtube#searchResult", "etag": "T9baUyeILEBvFRhwSg290Z3Thyw", "id": { "kind": "youtube#video", "videoId": "iVbopWyBR5Y" } }, { "kind": "youtube#searchResult", "etag": "Y7nrEsXnuk0ZYM8fMa3OfQPAWwM", "id": { "kind": "youtube#video", "videoId": "YAxLueEKqmU" } }, { "kind": "youtube#searchResult", "etag": "ETw19z57-4Mv-1duFGqO7YEloY0", "id": { "kind": "youtube#video", "videoId": "5cysPPnZEhM" } } ] } ````

so no change necessary.

In Firefox opening https://yt.lemnoslife.com/noKeyRedirect/search?q=test gives:

image

I would have prefered the URL to stay https://yt.lemnoslife.com/noKeyRedirect/search?q=test but if it's the price to make the web-browser performs the request I am fine with that.

In theory depending on provided User-Agent may provide an iframe that may have this behavior but it is not on the top of the agenda.

Do not forget to enable back monitoring afterwards.

Benjamin-Loison commented 2 months ago

Request people to not share YouTube Data API v3 keys retrieved this way, can censor those doing so.

Benjamin-Loison commented 2 months ago

Can request feedback about publishing to Discord #announcements:

@everyone

In the context of issues/301, that is YouTube operational API official instance no-key service being IP banned, I modified the official instance no-key service behavior. It now redirects to the YouTube Data API v3 endpoint with a very probably working YouTube Data API v3 key.

For instance https://yt.lemnoslife.com/noKey/search?q=test temporarily redirects to https://www.googleapis.com/youtube/v3/search?q=test&key=AIzaSyCXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, thanks to HTTPS Location response header, see Wikipedia: HTTP 302. Depending on the way you fetch the no-key service, you may have to allow redirections. For instance for curl you need to add -L option, for Python requests redirections are allowed by default.

Please do not store or share YouTube Data API v3 keys involved in the redirections to keep the service working.

While this should not be a legal issue, I recommend you to back up this project on your side.

As done before can mention people involved until now for their feedback.

Replace noKey with noKeyRedirect during review process maybe. Well we can directly ship to production and then review with noKey and then notify everyone.

I plan to publish in #announcements the following messages. If you have useful feedback before I mention @everyone, please let me know. @xbob @jochemcoding @wakakuro @liquidzooonlyfins @teodor.atroshenko @bluscream @mitchelldiedrich @inayye @minozar

and escape with backticks @everyone.

Benjamin-Loison commented 2 months ago

So technically the no-key service retrieves a YouTube Data API v3 from a modified no-key service proxy, then redirect the user. Could just otherwise ask the proxy if the YouTube Data API v3 is fine. Could otherwise use another instance as the official one, such that it will work the same way when the official instance is unbanned if it is ever been. However, I do not have similar powerful instances and adding a proxy introduces some delay. Well if the instance just redirects then another one may be strong enough. However, note that the official instance have a few differences to this repository code, as some have not yet been merged. Concerning authentication it should not be necessary yet. There is also no-key service mutex but as less overload, may not be necessary yet.

In fact the instance still have to proceed to the verification request which even for trivial videos?id=XXXXXXXXXXX case is still a workload that seems to be too much for yt0.lemnoslife.com. As htop shows a CPU at 100% and the latency seems about tens of seconds. While now that stop redirect yt.lemnoslife.com to yt0.lemnoslife.com it uses 12 % of the CPU and put back an instance key to prevent incorrectly implemented client to still use it.

Letting people ability to request a new key would allow them to exhaustively request them all.

Maybe can leverage OVH free plan that still exists, see Robust_image_source_identification_on_modern_smartphones/issues/53. Have only month right? the voucher [...] is valid for a period of one (1) month source: https://www.ovhcloud.com/en/public-cloud/prices/

C2-15 15 GB RAM 4 vCores (3 GHz) 100 GB SSD 250 Mbit/s From €68.20 ex. VAT/month €0.19 ex. VAT/hour

looks correct for instance in terms of performances and price.

Now the question is how to get an account not having already used this offer. I already had an account and:

-----BEGIN PGP MESSAGE-----

hF4DTQa9Wom5MBgSAQdAH9SZ2kcPOh/Irbq5j2Kb4qb+F31ZG4oJSunjUY2U9xAw
42fTsLOrzMTkXEFSzRzKdDx8qd+Xjv3Hhu1h8prxZbfpiZJHiYUd/ViMP2T9crq/
0kABrdzbmuwNCQspXWpQbOPuSHPtVD//DG3hG2iBil3K+5ZQ3PSPoXM6rImikrwB
PvAPx+mbOuyZurYlWrmThZNr
=acd8
-----END PGP MESSAGE-----

too but not:

-----BEGIN PGP MESSAGE-----

hF4DTQa9Wom5MBgSAQdABl6cxZ4zf6A996HtICZDi6aJ6KPH/st5gzXFCswOSnUw
cR3xwgrCDTOLcUg3Fmm52xs1iSJfAtkXRUsR1CJO4e6VgOhyFY37HnfcO1GzDLkk
0kAB4q11X/LfuTQtOAcRMxpikZsezP54nLjzJ1wFZ20NjkaMTVxFFM9W2hNtgMKN
1c0kaSoI4yE/eJUTBBYMjV/M
=tmyf
-----END PGP MESSAGE-----

Can instead make another Oracle account as the latter person have multiple credit cards. The question is which one has been used until now? Also hope that another account with his identity will not trigger some kind of limitation.

https://cloud.oracle.com/invoices-and-orders/upgrade-and-payment?region=eu-marseille-1 does not mention a credit card while according to Linux Mint 22 Cinnamon Framework 13 /home/benjamin/Desktop/bens_folder/bazaar/memos/computer_science/services/oracle/Screenshot from 2023-10-25 14-51-44.png it maybe should. I suspect the credit card to be:

-----BEGIN PGP MESSAGE-----

hF4DTQa9Wom5MBgSAQdA6nU1I47swOIRy2UFxjMoxxX2mjBShZeLoiYPU4BwEg4w
xfsAbDi0qaKA0ADyddD09LWGzrAwdVRKBc63IZS4HJwEkcNBp1bYjOCybX1E0MLt
0nAB6EajOrHRQit9GjfDnfG8yUNEQ57zFYuXqoNO9ihngxk+8n8A6wLYHDrcdUiS
MSiRG8IAa/pgMjpaXm9tEF+CHGQQ+H03Ys26BkFlsUOwxHc5zsK6/RKtB8aMzVEN
XqK/YHvQcT4Vrm4mtfavJVV3
=HM8s
-----END PGP MESSAGE-----

Other Billing tabs do not help.

Note that OverClock3000 does not seem appropriate due to OverClock3000/issues/12, running in a virtual machine on my own computer, hence being billed directly in electricity and possibly Internet access degradation.

If would pay for temporary usage, then what is the cheapest OVH offer with an equivalent hardware as the official instance? Being 4 logical cores and 24 GB of memory. The logical cores seems to be the most important. The cheapest bare metal is about 64.98 €/month, source: https://www.ovhcloud.com/fr/bare-metal/prices/.

VLE-4 12 € TTC/mois 4 vCore 4 Go 80 Go SSD NVMe 1 Gbit/s illimité

Source: https://www.ovhcloud.com/fr/vps/

4 GB may be a bit limiting but I doubt so, especially if implement redirections approach. Can otherwise use swap or compress memory as discussed in OverClock3000/issues/12. Currently the official instance, hence providing only error message for no-key service uses 1.86 GB of RAM and it maybe counts some other unrelated stuff.

Comfort 28,20 € TTC/mois 4 vCore 8 Go 160 Go SSD NVMe 1 Gbit/s illimité*

Just for 8 GB the cost does not seem appropriate.

Is not there providers that allow arbitrary VPS scale and billed per hour or even minutes?

Maybe prefer an OVH account compared to an Oracle one, as if do not have IPv6 with OVH, its panel may be clearer that Oracle one.

OVH sure credit card contrarily to Oracle. I finally made another OVH account.

In fact the storage is limiting. So much that it is quite useless, even with 3 servers:

D2-2 2 GB RAM 1 vCores (2 GHz) 25 GB NVMe 100 Mbit/s From €5.49 ex. VAT/month €0.00991 ex. VAT/hour

Does a host provider provides minute billing to quickly iterate to the appropriate shape?

Benjamin-Loison commented 2 months ago

Note that concerning monitoring cannot alter JSON answer as previously to precise the number of keys.

Benjamin-Loison commented 2 months ago

Maybe can leverage one of many free IPv6s. Same for other abuse issues. Maybe they batch ban IPv6s? If I remember correctly I already investigated this approach and it was not satisying, let us verify. Searching ipv6 on GitHub returns only #162 and #11 and in the latter interesting one IPv6 does not show up case-insensitively.

On the official instance:

test_ipv6.php:

<?php

    echo file_get_contents('https://ifconfig.me');
php test_ipv6.php
129.151.245.17

So let us have a standalone PHP showing the issue:

<?php

    echo file_get_contents('https://www.googleapis.com/youtube/v3/videos?part=snippet&id=_ZPpU7774DQ&key=AIzaSyCXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
php test_ipv6.php
PHP Warning:  file_get_contents(https://www.googleapis.com/youtube/v3/videos?part=snippet&id=_ZPpU7774DQ&key=AIzaSyCXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX): Failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden
 in /home/ubuntu/test_ipv6.php on line 3
curl https://ifconfig.me
129.151.245.17
curl -6 https://ifconfig.me
curl: (7) Failed to connect to ifconfig.me port 443 after 0 ms: Couldn't connect to server

Maybe not IPv6 is assigned to the VPS...

ifconfig | grep '129.151.245.17'

does not return anything so I doubt it would show me my IPv6.

https://cloud.oracle.com/compute/instances/ocid1.instance.oc1.eu-marseille-1.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX?region=eu-marseille-1 only mentions IPv4s.

DuckDuckGo and Google searching Oracle VPS assign IPv6 to VPS.

All my free Oracle VPS have the same curl -6 https://ifconfig.me output:

-----BEGIN PGP MESSAGE-----

hF4DTQa9Wom5MBgSAQdAOnp4tbWbMWVTd44KPohHsaB0/VIp0XJHS7REVKTsMAcw
D/vnIHhlWgoTLoNKQKxQNUNiJTARbIs/s4cVe8hACNIavoXphHLweDKSNlOTrJmP
0rMBUj0eS0AVBGkjoxRmaDW1L2a5ajobQoAQwn02hHRqBoRLT7H2mhL7Rid8Utxg
jeomOyK+KKXV1DpidHScCObbY2eD48bpnhLD2iZDVCt5aiWYVnvqgmp4rnMGrq42
Y5gxx8Nm4rR0/vSmWVWHAUZZx4vMlNjmDFSewMJfNtxjtDEIPiDOKcdonvfKYbgy
6RIDVHCCoS5odpFDYnq9CCEgl4S3DI0NvH0RGT/6bfu8hJJi+Q==
=uoP+
-----END PGP MESSAGE-----

I asked on Discord a friend who also have a fre Oracle VPS:

-----BEGIN PGP MESSAGE-----

hF4DTQa9Wom5MBgSAQdAIBo0NbyEljOO8c6PKZsbbjZBSzllpe7X2FubBKXnXVQw
C0jPEKkncuBrf4ntoSQggDvZ9R0+aUFvZqHj/GFLkD4E6VwMNmAmGges9Wm/EuoS
0oIB6DuGRRKS9cig+g9/j8zZQf8B8S64ku2esrr5Z5FwDlkAmc7tOJkkDnd3b7GF
l/yVL8TPaiaBOBSOvfEaXsRqCHO+rDOGSBS1/FqXtHUpL6qS6G3YcBPjQ0TeYLj/
IDqODMSHNf+yR+COETTWfupc2GBYQVsveh77W3E3MG6+vX4J
=MYEM
-----END PGP MESSAGE-----

He answered me that he will investigate next week.

Maybe with crontab or at the beginning of history will find out something interesting, I remember doing some operations related to IPv6s like disabling it explicitly. On the official instance ubuntu and root crontab do not mention a similar operation. Beginning of history of both users do not mention things except the ServerFault answer 200635. If I remember correctly I modified a file.

history | grep -i ipv

does not return interesting as both users.

https://docs.oracle.com/en-us/iaas/Content/Network/Concepts/ipv6.htm#fastconnect__enable

image

Disabling uBlock does not help.

No DuckDuckGo and Google results for "ipv6CidrBlock must not be null".

Benjamin-Loison commented 2 months ago

https://discord.com/channels/933841502155706418/933841503103627316/1283873245145337948 reminds me that people having contributed with keys may not be fine in my redistributing them. Even if in my opinion it does not change much, I could restrain keys to those I found on my own.

How many YouTube Data API v3 keys contains YouTube_Data_API_v3_key_web_scraper?

Related to #18.

Benjamin-Loison commented 2 months ago

My redirection approach is between dividing by 100 and multiplying by 2 the quota usage. Concerning the actual key usage by instance it does not reduce it. Do YouTube servers could be informed by HTTPS headers for instance that end-users come from my official instance? Can however make an endpoint that people can retrieve to force verifying a key validity and switching to another one if necessary. However, it starts being not clean if anyone have to implement such behavior.

Benjamin-Loison commented 2 months ago

I just verified that YouTube_Data_API_v3_key_web_scraper/wiki/Home brings 3,437 YouTube Data API v3 working different keys. I stored a copy of them on my Linux Mint 22 Cinnamon Framework 13 at:

-----BEGIN PGP MESSAGE-----

hF4DTQa9Wom5MBgSAQdAR5D1sy98gVeFqHd7SRasFc2qCia7Lut7Eycun/kYHjYw
cCXTnb1ZgeHvUsNubcRKoNeNMw8ZDpW3KmmyEd06l8EMGJwDF4PcSZn9sxCyOPan
0pMBtHp1uI4rl3OkBd7x7+KpNUPnVU/1Buay21xS4br3vGXP27MM4jqq7mwED4Pf
zw3Gri4nl7ile4Egm13VmOvUhErWky4DO8MCb72akPgDL09bkRsyGv858Jsz3Afs
f44qh2ohqw3+NqCUj5BUfifrJVyXil8PGTEb9mdH8yUPM12Nhu7hJ1a22Jy+sbG1
YgkwI60=
=MqA/
-----END PGP MESSAGE-----

So contributed YouTube Data API v3 keys are clearly not needed.

Currently the YouTube operational API official instance is powered with 2,462 keys.

Benjamin-Loison commented 2 months ago

On yt0.lemnoslife.com:

curl -6 https://ifconfig.me
2001:41d0:302:2200::54b0

So to summarize:

Benjamin-Loison commented 2 months ago

Asking people to create Oracle free VPS does not seem useful as would need to trust them.

Benjamin-Loison commented 2 months ago

I wanted to try the proxy way but I bought by mistake a month of VLE-4.

Benjamin-Loison commented 2 months ago

Cannot verify VPS SSH fingerprint through KVM.

ssh debian@141.95.86.158
sudo apt update && sudo apt upgrade -y && sudo apt dist-upgrade -y && sudo apt autoremove -y
Output: ``` Get:1 file:/etc/apt/mirrors/debian.list Mirrorlist [30 B] Get:2 file:/etc/apt/mirrors/debian-security.list Mirrorlist [39 B] Hit:3 https://deb.debian.org/debian bookworm InRelease Get:4 https://deb.debian.org/debian bookworm-updates InRelease [55.4 kB] Get:5 https://deb.debian.org/debian bookworm-backports InRelease [59.0 kB] Get:6 https://deb.debian.org/debian-security bookworm-security InRelease [48.0 kB] Get:7 https://deb.debian.org/debian bookworm-updates/main Sources.diff/Index [11.7 kB] Get:8 https://deb.debian.org/debian bookworm-updates/main amd64 Packages.diff/Index [11.7 kB] Get:9 https://deb.debian.org/debian bookworm-updates/main Translation-en.diff/Index [11.7 kB] Get:10 https://deb.debian.org/debian bookworm-updates/main Sources T-2024-09-10-2011.55-F-2024-09-10-2011.55.pdiff [562 B] Get:11 https://deb.debian.org/debian bookworm-updates/main amd64 Packages T-2024-09-10-2011.55-F-2024-09-10-2011.55.pdiff [1116 B] Get:10 https://deb.debian.org/debian bookworm-updates/main Sources T-2024-09-10-2011.55-F-2024-09-10-2011.55.pdiff [562 B] Get:11 https://deb.debian.org/debian bookworm-updates/main amd64 Packages T-2024-09-10-2011.55-F-2024-09-10-2011.55.pdiff [1116 B] Get:12 https://deb.debian.org/debian bookworm-updates/main Translation-en T-2024-09-10-2011.55-F-2024-09-10-2011.55.pdiff [538 B] Get:12 https://deb.debian.org/debian bookworm-updates/main Translation-en T-2024-09-10-2011.55-F-2024-09-10-2011.55.pdiff [538 B] Get:13 https://deb.debian.org/debian bookworm-backports/main Sources.diff/Index [63.3 kB] Get:14 https://deb.debian.org/debian bookworm-backports/main amd64 Packages.diff/Index [63.3 kB] Get:15 https://deb.debian.org/debian bookworm-backports/main Translation-en.diff/Index [63.3 kB] Get:18 https://deb.debian.org/debian bookworm-backports/main Sources T-2024-09-12-2005.37-F-2024-09-01-1434.04.pdiff [23.1 kB] Get:18 https://deb.debian.org/debian bookworm-backports/main Sources T-2024-09-12-2005.37-F-2024-09-01-1434.04.pdiff [23.1 kB] Get:19 https://deb.debian.org/debian bookworm-backports/main amd64 Packages T-2024-09-12-2005.37-F-2024-09-01-2008.03.pdiff [20.0 kB] Get:20 https://deb.debian.org/debian bookworm-backports/main Translation-en T-2024-09-12-2005.37-F-2024-09-01-2008.03.pdiff [6577 B] Get:19 https://deb.debian.org/debian bookworm-backports/main amd64 Packages T-2024-09-12-2005.37-F-2024-09-01-2008.03.pdiff [20.0 kB] Get:20 https://deb.debian.org/debian bookworm-backports/main Translation-en T-2024-09-12-2005.37-F-2024-09-01-2008.03.pdiff [6577 B] Get:16 https://deb.debian.org/debian-security bookworm-security/main Sources [109 kB] Get:17 https://deb.debian.org/debian-security bookworm-security/main amd64 Packages [179 kB] Fetched 728 kB in 1s (1394 kB/s) Reading package lists... Done Building dependency tree... Done Reading state information... Done 3 packages can be upgraded. Run 'apt list --upgradable' to see them. Reading package lists... Done Building dependency tree... Done Reading state information... Done Calculating upgrade... Done The following NEW packages will be installed: firmware-linux-free linux-image-6.1.0-25-cloud-amd64 The following packages will be upgraded: libssl3 linux-image-cloud-amd64 openssl 3 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. Need to get 29.3 MB of archives. After this operation, 107 MB of additional disk space will be used. Get:1 file:/etc/apt/mirrors/debian.list Mirrorlist [30 B] Get:2 file:/etc/apt/mirrors/debian-security.list Mirrorlist [39 B] Get:3 https://deb.debian.org/debian bookworm/main amd64 firmware-linux-free all 20200122-1 [24.2 kB] Get:4 https://deb.debian.org/debian bookworm/main amd64 linux-image-6.1.0-25-cloud-amd64 amd64 6.1.106-3 [25.8 MB] Get:5 https://deb.debian.org/debian bookworm/main amd64 linux-image-cloud-amd64 amd64 6.1.106-3 [1500 B] Get:6 https://deb.debian.org/debian-security bookworm-security/main amd64 libssl3 amd64 3.0.14-1~deb12u2 [2024 kB] Get:7 https://deb.debian.org/debian-security bookworm-security/main amd64 openssl amd64 3.0.14-1~deb12u2 [1423 kB] Fetched 29.3 MB in 0s (96.6 MB/s) apt-listchanges: Can't set locale; make sure $LC_* and $LANG are correct! apt-listchanges: Reading changelogs... perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LANGUAGE = (unset), LC_ALL = "en_US.UTF-8", LC_TIME = "en_US.UTF-8", LC_MONETARY = "fr_FR.UTF-8", LC_ADDRESS = "fr_FR.UTF-8", LC_TELEPHONE = "fr_FR.UTF-8", LC_NAME = "fr_FR.UTF-8", LC_MEASUREMENT = "fr_FR.UTF-8", LC_IDENTIFICATION = "fr_FR.UTF-8", LC_NUMERIC = "fr_FR.UTF-8", LC_PAPER = "fr_FR.UTF-8", LANG = "C.UTF-8" are supported and installed on your system. perl: warning: Falling back to a fallback locale ("C.UTF-8"). Selecting previously unselected package firmware-linux-free. (Reading database ... 20797 files and directories currently installed.) Preparing to unpack .../firmware-linux-free_20200122-1_all.deb ... Unpacking firmware-linux-free (20200122-1) ... Preparing to unpack .../libssl3_3.0.14-1~deb12u2_amd64.deb ... Unpacking libssl3:amd64 (3.0.14-1~deb12u2) over (3.0.14-1~deb12u1) ... Selecting previously unselected package linux-image-6.1.0-25-cloud-amd64. Preparing to unpack .../linux-image-6.1.0-25-cloud-amd64_6.1.106-3_amd64.deb ... Unpacking linux-image-6.1.0-25-cloud-amd64 (6.1.106-3) ... Preparing to unpack .../linux-image-cloud-amd64_6.1.106-3_amd64.deb ... Unpacking linux-image-cloud-amd64 (6.1.106-3) over (6.1.99-1) ... Preparing to unpack .../openssl_3.0.14-1~deb12u2_amd64.deb ... Unpacking openssl (3.0.14-1~deb12u2) over (3.0.14-1~deb12u1) ... Setting up linux-image-6.1.0-25-cloud-amd64 (6.1.106-3) ... /etc/kernel/postinst.d/initramfs-tools: update-initramfs: Generating /boot/initrd.img-6.1.0-25-cloud-amd64 /etc/kernel/postinst.d/zz-update-grub: Generating grub configuration file ... Found linux image: /boot/vmlinuz-6.1.0-25-cloud-amd64 Found initrd image: /boot/initrd.img-6.1.0-25-cloud-amd64 Found linux image: /boot/vmlinuz-6.1.0-23-cloud-amd64 Found initrd image: /boot/initrd.img-6.1.0-23-cloud-amd64 done Setting up firmware-linux-free (20200122-1) ... Setting up libssl3:amd64 (3.0.14-1~deb12u2) ... Setting up linux-image-cloud-amd64 (6.1.106-3) ... Setting up openssl (3.0.14-1~deb12u2) ... Processing triggers for man-db (2.11.2-2) ... Processing triggers for libc-bin (2.36-9+deb12u8) ... Processing triggers for initramfs-tools (0.142+deb12u1) ... update-initramfs: Generating /boot/initrd.img-6.1.0-25-cloud-amd64 Reading package lists... Done Building dependency tree... Done Reading state information... Done Calculating upgrade... Done 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. Reading package lists... Done Building dependency tree... Done Reading state information... Done 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. ```

As everyone: blob/11566147f4d54b8d8d8481709fd5bf6b1329f4de/README.md#install-your-own-instance-of-the-api

sudo apt install -y apache2 php
Output: ``` Reading package lists... Done Building dependency tree... Done Reading state information... Done The following additional packages will be installed: apache2-bin apache2-data apache2-utils libapache2-mod-php8.2 libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap libgdbm-compat4 libjansson4 liblua5.3-0 libperl5.36 perl perl-modules-5.36 php-common php8.2 php8.2-cli php8.2-common php8.2-opcache php8.2-readline ssl-cert Suggested packages: apache2-doc apache2-suexec-pristine | apache2-suexec-custom www-browser php-pear perl-doc libterm-readline-gnu-perl | libterm-readline-perl-perl make libtap-harness-archive-perl The following NEW packages will be installed: apache2 apache2-bin apache2-data apache2-utils libapache2-mod-php8.2 libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap libgdbm-compat4 libjansson4 liblua5.3-0 libperl5.36 perl perl-modules-5.36 php php-common php8.2 php8.2-cli php8.2-common php8.2-opcache php8.2-readline ssl-cert 0 upgraded, 23 newly installed, 0 to remove and 0 not upgraded. Need to get 14.2 MB of archives. After this operation, 78.2 MB of additional disk space will be used. Get:1 file:/etc/apt/mirrors/debian.list Mirrorlist [30 B] Get:2 https://deb.debian.org/debian bookworm/main amd64 perl-modules-5.36 all 5.36.0-7+deb12u1 [2815 kB] Get:3 https://deb.debian.org/debian bookworm/main amd64 libgdbm-compat4 amd64 1.23-3 [48.2 kB] Get:4 https://deb.debian.org/debian bookworm/main amd64 libperl5.36 amd64 5.36.0-7+deb12u1 [4218 kB] Get:5 https://deb.debian.org/debian bookworm/main amd64 perl amd64 5.36.0-7+deb12u1 [239 kB] Get:6 https://deb.debian.org/debian bookworm/main amd64 libapr1 amd64 1.7.2-3 [102 kB] Get:7 https://deb.debian.org/debian bookworm/main amd64 libaprutil1 amd64 1.6.3-1 [87.8 kB] Get:8 https://deb.debian.org/debian bookworm/main amd64 libaprutil1-dbd-sqlite3 amd64 1.6.3-1 [13.6 kB] Get:9 https://deb.debian.org/debian bookworm/main amd64 libaprutil1-ldap amd64 1.6.3-1 [11.8 kB] Get:10 https://deb.debian.org/debian bookworm/main amd64 libjansson4 amd64 2.14-2 [40.8 kB] Get:11 https://deb.debian.org/debian bookworm/main amd64 liblua5.3-0 amd64 5.3.6-2 [123 kB] Get:12 https://deb.debian.org/debian bookworm/main amd64 apache2-bin amd64 2.4.62-1~deb12u1 [1385 kB] Get:13 https://deb.debian.org/debian bookworm/main amd64 apache2-data all 2.4.62-1~deb12u1 [160 kB] Get:14 https://deb.debian.org/debian bookworm/main amd64 apache2-utils amd64 2.4.62-1~deb12u1 [210 kB] Get:15 https://deb.debian.org/debian bookworm/main amd64 apache2 amd64 2.4.62-1~deb12u1 [223 kB] Get:16 https://deb.debian.org/debian bookworm/main amd64 php-common all 2:93 [13.1 kB] Get:17 https://deb.debian.org/debian bookworm/main amd64 php8.2-common amd64 8.2.20-1~deb12u1 [680 kB] Get:18 https://deb.debian.org/debian bookworm/main amd64 php8.2-opcache amd64 8.2.20-1~deb12u1 [345 kB] Get:19 https://deb.debian.org/debian bookworm/main amd64 php8.2-readline amd64 8.2.20-1~deb12u1 [12.4 kB] Get:20 https://deb.debian.org/debian bookworm/main amd64 php8.2-cli amd64 8.2.20-1~deb12u1 [1735 kB] Get:21 https://deb.debian.org/debian bookworm/main amd64 libapache2-mod-php8.2 amd64 8.2.20-1~deb12u1 [1674 kB] Get:22 https://deb.debian.org/debian bookworm/main amd64 php8.2 all 8.2.20-1~deb12u1 [39.2 kB] Get:23 https://deb.debian.org/debian bookworm/main amd64 php all 2:8.2+93 [3628 B] Get:24 https://deb.debian.org/debian bookworm/main amd64 ssl-cert all 1.1.2 [21.1 kB] Fetched 14.2 MB in 0s (57.0 MB/s) apt-listchanges: Can't set locale; make sure $LC_* and $LANG are correct! perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LANGUAGE = (unset), LC_ALL = "en_US.UTF-8", LC_TIME = "en_US.UTF-8", LC_MONETARY = "fr_FR.UTF-8", LC_ADDRESS = "fr_FR.UTF-8", LC_TELEPHONE = "fr_FR.UTF-8", LC_NAME = "fr_FR.UTF-8", LC_MEASUREMENT = "fr_FR.UTF-8", LC_IDENTIFICATION = "fr_FR.UTF-8", LC_NUMERIC = "fr_FR.UTF-8", LC_PAPER = "fr_FR.UTF-8", LANG = "C.UTF-8" are supported and installed on your system. perl: warning: Falling back to a fallback locale ("C.UTF-8"). Preconfiguring packages ... Selecting previously unselected package perl-modules-5.36. (Reading database ... 22204 files and directories currently installed.) Preparing to unpack .../00-perl-modules-5.36_5.36.0-7+deb12u1_all.deb ... Unpacking perl-modules-5.36 (5.36.0-7+deb12u1) ... Selecting previously unselected package libgdbm-compat4:amd64. Preparing to unpack .../01-libgdbm-compat4_1.23-3_amd64.deb ... Unpacking libgdbm-compat4:amd64 (1.23-3) ... Selecting previously unselected package libperl5.36:amd64. Preparing to unpack .../02-libperl5.36_5.36.0-7+deb12u1_amd64.deb ... Unpacking libperl5.36:amd64 (5.36.0-7+deb12u1) ... Selecting previously unselected package perl. Preparing to unpack .../03-perl_5.36.0-7+deb12u1_amd64.deb ... Unpacking perl (5.36.0-7+deb12u1) ... Selecting previously unselected package libapr1:amd64. Preparing to unpack .../04-libapr1_1.7.2-3_amd64.deb ... Unpacking libapr1:amd64 (1.7.2-3) ... Selecting previously unselected package libaprutil1:amd64. Preparing to unpack .../05-libaprutil1_1.6.3-1_amd64.deb ... Unpacking libaprutil1:amd64 (1.6.3-1) ... Selecting previously unselected package libaprutil1-dbd-sqlite3:amd64. Preparing to unpack .../06-libaprutil1-dbd-sqlite3_1.6.3-1_amd64.deb ... Unpacking libaprutil1-dbd-sqlite3:amd64 (1.6.3-1) ... Selecting previously unselected package libaprutil1-ldap:amd64. Preparing to unpack .../07-libaprutil1-ldap_1.6.3-1_amd64.deb ... Unpacking libaprutil1-ldap:amd64 (1.6.3-1) ... Selecting previously unselected package libjansson4:amd64. Preparing to unpack .../08-libjansson4_2.14-2_amd64.deb ... Unpacking libjansson4:amd64 (2.14-2) ... Selecting previously unselected package liblua5.3-0:amd64. Preparing to unpack .../09-liblua5.3-0_5.3.6-2_amd64.deb ... Unpacking liblua5.3-0:amd64 (5.3.6-2) ... Selecting previously unselected package apache2-bin. Preparing to unpack .../10-apache2-bin_2.4.62-1~deb12u1_amd64.deb ... Unpacking apache2-bin (2.4.62-1~deb12u1) ... Selecting previously unselected package apache2-data. Preparing to unpack .../11-apache2-data_2.4.62-1~deb12u1_all.deb ... Unpacking apache2-data (2.4.62-1~deb12u1) ... Selecting previously unselected package apache2-utils. Preparing to unpack .../12-apache2-utils_2.4.62-1~deb12u1_amd64.deb ... Unpacking apache2-utils (2.4.62-1~deb12u1) ... Selecting previously unselected package apache2. Preparing to unpack .../13-apache2_2.4.62-1~deb12u1_amd64.deb ... /bin/bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8) Unpacking apache2 (2.4.62-1~deb12u1) ... Selecting previously unselected package php-common. Preparing to unpack .../14-php-common_2%3a93_all.deb ... Unpacking php-common (2:93) ... Selecting previously unselected package php8.2-common. Preparing to unpack .../15-php8.2-common_8.2.20-1~deb12u1_amd64.deb ... Unpacking php8.2-common (8.2.20-1~deb12u1) ... Selecting previously unselected package php8.2-opcache. Preparing to unpack .../16-php8.2-opcache_8.2.20-1~deb12u1_amd64.deb ... Unpacking php8.2-opcache (8.2.20-1~deb12u1) ... Selecting previously unselected package php8.2-readline. Preparing to unpack .../17-php8.2-readline_8.2.20-1~deb12u1_amd64.deb ... Unpacking php8.2-readline (8.2.20-1~deb12u1) ... Selecting previously unselected package php8.2-cli. Preparing to unpack .../18-php8.2-cli_8.2.20-1~deb12u1_amd64.deb ... Unpacking php8.2-cli (8.2.20-1~deb12u1) ... Selecting previously unselected package libapache2-mod-php8.2. Preparing to unpack .../19-libapache2-mod-php8.2_8.2.20-1~deb12u1_amd64.deb ... Unpacking libapache2-mod-php8.2 (8.2.20-1~deb12u1) ... Selecting previously unselected package php8.2. Preparing to unpack .../20-php8.2_8.2.20-1~deb12u1_all.deb ... Unpacking php8.2 (8.2.20-1~deb12u1) ... Selecting previously unselected package php. Preparing to unpack .../21-php_2%3a8.2+93_all.deb ... Unpacking php (2:8.2+93) ... Selecting previously unselected package ssl-cert. Preparing to unpack .../22-ssl-cert_1.1.2_all.deb ... Unpacking ssl-cert (1.1.2) ... Setting up php-common (2:93) ... Created symlink /etc/systemd/system/timers.target.wants/phpsessionclean.timer → /lib/systemd/system/phpsessionclean.timer. Setting up php8.2-common (8.2.20-1~deb12u1) ... Creating config file /etc/php/8.2/mods-available/calendar.ini with new version Creating config file /etc/php/8.2/mods-available/ctype.ini with new version Creating config file /etc/php/8.2/mods-available/exif.ini with new version Creating config file /etc/php/8.2/mods-available/fileinfo.ini with new version Creating config file /etc/php/8.2/mods-available/ffi.ini with new version Creating config file /etc/php/8.2/mods-available/ftp.ini with new version Creating config file /etc/php/8.2/mods-available/gettext.ini with new version Creating config file /etc/php/8.2/mods-available/iconv.ini with new version Creating config file /etc/php/8.2/mods-available/pdo.ini with new version Creating config file /etc/php/8.2/mods-available/phar.ini with new version Creating config file /etc/php/8.2/mods-available/posix.ini with new version Creating config file /etc/php/8.2/mods-available/shmop.ini with new version Creating config file /etc/php/8.2/mods-available/sockets.ini with new version Creating config file /etc/php/8.2/mods-available/sysvmsg.ini with new version Creating config file /etc/php/8.2/mods-available/sysvsem.ini with new version Creating config file /etc/php/8.2/mods-available/sysvshm.ini with new version Creating config file /etc/php/8.2/mods-available/tokenizer.ini with new version Setting up php8.2-opcache (8.2.20-1~deb12u1) ... Creating config file /etc/php/8.2/mods-available/opcache.ini with new version Setting up php8.2-readline (8.2.20-1~deb12u1) ... Creating config file /etc/php/8.2/mods-available/readline.ini with new version Setting up libapr1:amd64 (1.7.2-3) ... Setting up libjansson4:amd64 (2.14-2) ... Setting up perl-modules-5.36 (5.36.0-7+deb12u1) ... Setting up ssl-cert (1.1.2) ... /bin/bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8) Setting up libgdbm-compat4:amd64 (1.23-3) ... Setting up liblua5.3-0:amd64 (5.3.6-2) ... Setting up apache2-data (2.4.62-1~deb12u1) ... Setting up php8.2-cli (8.2.20-1~deb12u1) ... update-alternatives: using /usr/bin/php8.2 to provide /usr/bin/php (php) in auto mode update-alternatives: using /usr/bin/phar8.2 to provide /usr/bin/phar (phar) in auto mode update-alternatives: using /usr/bin/phar.phar8.2 to provide /usr/bin/phar.phar (phar.phar) in auto mode Creating config file /etc/php/8.2/cli/php.ini with new version Setting up libperl5.36:amd64 (5.36.0-7+deb12u1) ... Setting up libaprutil1:amd64 (1.6.3-1) ... Setting up libaprutil1-ldap:amd64 (1.6.3-1) ... Setting up libaprutil1-dbd-sqlite3:amd64 (1.6.3-1) ... Setting up perl (5.36.0-7+deb12u1) ... Setting up apache2-utils (2.4.62-1~deb12u1) ... Setting up apache2-bin (2.4.62-1~deb12u1) ... Setting up libapache2-mod-php8.2 (8.2.20-1~deb12u1) ... Package apache2 is not configured yet. Will defer actions by package libapache2-mod-php8.2. Creating config file /etc/php/8.2/apache2/php.ini with new version No module matches Setting up apache2 (2.4.62-1~deb12u1) ... /bin/bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8) Enabling module mpm_event. Enabling module authz_core. Enabling module authz_host. Enabling module authn_core. Enabling module auth_basic. Enabling module access_compat. Enabling module authn_file. Enabling module authz_user. Enabling module alias. Enabling module dir. Enabling module autoindex. Enabling module env. Enabling module mime. Enabling module negotiation. Enabling module setenvif. Enabling module filter. Enabling module deflate. Enabling module status. Enabling module reqtimeout. Enabling conf charset. Enabling conf localized-error-pages. Enabling conf other-vhosts-access-log. Enabling conf security. Enabling conf serve-cgi-bin. Enabling site 000-default. info: Switch to mpm prefork for package libapache2-mod-php8.2 Module mpm_event disabled. Enabling module mpm_prefork. info: Executing deferred 'a2enmod php8.2' for package libapache2-mod-php8.2 Enabling module php8.2. Created symlink /etc/systemd/system/multi-user.target.wants/apache2.service → /lib/systemd/system/apache2.service. Created symlink /etc/systemd/system/multi-user.target.wants/apache-htcacheclean.service → /lib/systemd/system/apache-htcacheclean.service. Setting up php8.2 (8.2.20-1~deb12u1) ... Setting up php (2:8.2+93) ... Processing triggers for man-db (2.11.2-2) ... Processing triggers for libc-bin (2.36-9+deb12u8) ... Processing triggers for php8.2-cli (8.2.20-1~deb12u1) ... Processing triggers for libapache2-mod-php8.2 (8.2.20-1~deb12u1) ... ```
sudo a2enmod rewrite headers
Output: ``` perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LANGUAGE = (unset), LC_ALL = "en_US.UTF-8", LC_ADDRESS = "fr_FR.UTF-8", LC_NAME = "fr_FR.UTF-8", LC_MONETARY = "fr_FR.UTF-8", LC_PAPER = "fr_FR.UTF-8", LC_IDENTIFICATION = "fr_FR.UTF-8", LC_TELEPHONE = "fr_FR.UTF-8", LC_MEASUREMENT = "fr_FR.UTF-8", LC_TIME = "en_US.UTF-8", LC_NUMERIC = "fr_FR.UTF-8", LANG = "C.UTF-8" are supported and installed on your system. perl: warning: Falling back to a fallback locale ("C.UTF-8"). Enabling module rewrite. Enabling module headers. To activate the new configuration, you need to run: systemctl restart apache2 ```

Replace AllowOverride None with AllowOverride All in <Directory /var/www/> in /etc/apache2/apache2.conf.

sudo service apache2 restart
sudo apt install -y git
Output: ``` Reading package lists... Done Building dependency tree... Done Reading state information... Done The following additional packages will be installed: git-man liberror-perl patch Suggested packages: git-daemon-run | git-daemon-sysvinit git-doc git-email git-gui gitk gitweb git-cvs git-mediawiki git-svn ed diffutils-doc The following NEW packages will be installed: git git-man liberror-perl patch 0 upgraded, 4 newly installed, 0 to remove and 0 not upgraded. Need to get 9377 kB of archives. After this operation, 48.0 MB of additional disk space will be used. Get:1 file:/etc/apt/mirrors/debian.list Mirrorlist [30 B] Get:2 https://deb.debian.org/debian bookworm/main amd64 liberror-perl all 0.17029-2 [29.0 kB] Get:3 https://deb.debian.org/debian bookworm/main amd64 git-man all 1:2.39.2-1.1 [2049 kB] Get:4 https://deb.debian.org/debian bookworm/main amd64 git amd64 1:2.39.2-1.1 [7171 kB] Get:5 https://deb.debian.org/debian bookworm/main amd64 patch amd64 2.7.6-7 [128 kB] Fetched 9377 kB in 0s (65.6 MB/s) apt-listchanges: Can't set locale; make sure $LC_* and $LANG are correct! perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LANGUAGE = (unset), LC_ALL = "en_US.UTF-8", LC_TIME = "en_US.UTF-8", LC_MONETARY = "fr_FR.UTF-8", LC_ADDRESS = "fr_FR.UTF-8", LC_TELEPHONE = "fr_FR.UTF-8", LC_NAME = "fr_FR.UTF-8", LC_MEASUREMENT = "fr_FR.UTF-8", LC_IDENTIFICATION = "fr_FR.UTF-8", LC_NUMERIC = "fr_FR.UTF-8", LC_PAPER = "fr_FR.UTF-8", LANG = "C.UTF-8" are supported and installed on your system. perl: warning: Falling back to a fallback locale ("C.UTF-8"). Selecting previously unselected package liberror-perl. (Reading database ... 25068 files and directories currently installed.) Preparing to unpack .../liberror-perl_0.17029-2_all.deb ... Unpacking liberror-perl (0.17029-2) ... Selecting previously unselected package git-man. Preparing to unpack .../git-man_1%3a2.39.2-1.1_all.deb ... Unpacking git-man (1:2.39.2-1.1) ... Selecting previously unselected package git. Preparing to unpack .../git_1%3a2.39.2-1.1_amd64.deb ... Unpacking git (1:2.39.2-1.1) ... Selecting previously unselected package patch. Preparing to unpack .../patch_2.7.6-7_amd64.deb ... Unpacking patch (2.7.6-7) ... Setting up liberror-perl (0.17029-2) ... Setting up patch (2.7.6-7) ... Setting up git-man (1:2.39.2-1.1) ... Setting up git (1:2.39.2-1.1) ... Processing triggers for man-db (2.11.2-2) ... ```
sudo chown www-data: /var/www/ -R
sudo su -l www-data -s /bin/bash
cd htm/
rm index.html
git clone https://github.com/Benjamin-Loison/YouTube-operational-API .
Output: ``` Cloning into '.'... remote: Enumerating objects: 1567, done. remote: Counting objects: 100% (482/482), done. remote: Compressing objects: 100% (177/177), done. remote: Total 1567 (delta 325), reused 334 (delta 303), pack-reused 1085 (from 1) Receiving objects: 100% (1567/1567), 356.07 KiB | 22.25 MiB/s, done. Resolving deltas: 100% (1209/1209), done. ```
sed -i 's/my instance/yt.lemnoslife.com/' configuration.php

I set myself reminders before 13 October 2024 that is the VPS expiration.

sudo apt install -y certbot
Output: ``` Reading package lists... Done Building dependency tree... Done Reading state information... Done The following additional packages will be installed: python3-acme python3-certbot python3-configargparse python3-icu python3-josepy python3-openssl python3-parsedatetime python3-rfc3339 python3-tz Suggested packages: python-certbot-doc python3-certbot-apache python3-certbot-nginx python-acme-doc python-openssl-doc python3-openssl-dbg The following NEW packages will be installed: certbot python3-acme python3-certbot python3-configargparse python3-icu python3-josepy python3-openssl python3-parsedatetime python3-rfc3339 python3-tz 0 upgraded, 10 newly installed, 0 to remove and 0 not upgraded. Need to get 1023 kB of archives. After this operation, 4760 kB of additional disk space will be used. Get:1 file:/etc/apt/mirrors/debian.list Mirrorlist [30 B] Get:2 https://deb.debian.org/debian bookworm/main amd64 python3-openssl all 23.0.0-1 [50.8 kB] Get:3 https://deb.debian.org/debian bookworm/main amd64 python3-josepy all 1.13.0-1 [23.1 kB] Get:4 https://deb.debian.org/debian bookworm/main amd64 python3-tz all 2022.7.1-4 [30.1 kB] Get:5 https://deb.debian.org/debian bookworm/main amd64 python3-rfc3339 all 1.1-4 [7088 B] Get:6 https://deb.debian.org/debian bookworm/main amd64 python3-acme all 2.1.0-1 [32.0 kB] Get:7 https://deb.debian.org/debian bookworm/main amd64 python3-configargparse all 1.5.3-1 [26.1 kB] Get:8 https://deb.debian.org/debian bookworm/main amd64 python3-parsedatetime all 2.6-3 [41.2 kB] Get:9 https://deb.debian.org/debian bookworm/main amd64 python3-certbot all 2.1.0-4 [209 kB] Get:10 https://deb.debian.org/debian bookworm/main amd64 certbot all 2.1.0-4 [122 kB] Get:11 https://deb.debian.org/debian bookworm/main amd64 python3-icu amd64 2.10.2-1+b3 [482 kB] Fetched 1023 kB in 0s (10.7 MB/s) apt-listchanges: Can't set locale; make sure $LC_* and $LANG are correct! perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LANGUAGE = (unset), LC_ALL = "en_US.UTF-8", LC_TIME = "en_US.UTF-8", LC_MONETARY = "fr_FR.UTF-8", LC_ADDRESS = "fr_FR.UTF-8", LC_TELEPHONE = "fr_FR.UTF-8", LC_NAME = "fr_FR.UTF-8", LC_MEASUREMENT = "fr_FR.UTF-8", LC_IDENTIFICATION = "fr_FR.UTF-8", LC_NUMERIC = "fr_FR.UTF-8", LC_PAPER = "fr_FR.UTF-8", LANG = "C.UTF-8" are supported and installed on your system. perl: warning: Falling back to a fallback locale ("C.UTF-8"). Preconfiguring packages ... Selecting previously unselected package python3-openssl. (Reading database ... 26175 files and directories currently installed.) Preparing to unpack .../0-python3-openssl_23.0.0-1_all.deb ... Unpacking python3-openssl (23.0.0-1) ... Selecting previously unselected package python3-josepy. Preparing to unpack .../1-python3-josepy_1.13.0-1_all.deb ... Unpacking python3-josepy (1.13.0-1) ... Selecting previously unselected package python3-tz. Preparing to unpack .../2-python3-tz_2022.7.1-4_all.deb ... Unpacking python3-tz (2022.7.1-4) ... Selecting previously unselected package python3-rfc3339. Preparing to unpack .../3-python3-rfc3339_1.1-4_all.deb ... Unpacking python3-rfc3339 (1.1-4) ... Selecting previously unselected package python3-acme. Preparing to unpack .../4-python3-acme_2.1.0-1_all.deb ... Unpacking python3-acme (2.1.0-1) ... Selecting previously unselected package python3-configargparse. Preparing to unpack .../5-python3-configargparse_1.5.3-1_all.deb ... Unpacking python3-configargparse (1.5.3-1) ... Selecting previously unselected package python3-parsedatetime. Preparing to unpack .../6-python3-parsedatetime_2.6-3_all.deb ... Unpacking python3-parsedatetime (2.6-3) ... Selecting previously unselected package python3-certbot. Preparing to unpack .../7-python3-certbot_2.1.0-4_all.deb ... Unpacking python3-certbot (2.1.0-4) ... Selecting previously unselected package certbot. Preparing to unpack .../8-certbot_2.1.0-4_all.deb ... Unpacking certbot (2.1.0-4) ... Selecting previously unselected package python3-icu. Preparing to unpack .../9-python3-icu_2.10.2-1+b3_amd64.deb ... Unpacking python3-icu (2.10.2-1+b3) ... Setting up python3-configargparse (1.5.3-1) ... Setting up python3-parsedatetime (2.6-3) ... Setting up python3-icu (2.10.2-1+b3) ... Setting up python3-openssl (23.0.0-1) ... Setting up python3-tz (2022.7.1-4) ... Setting up python3-josepy (1.13.0-1) ... Setting up python3-rfc3339 (1.1-4) ... Setting up python3-acme (2.1.0-1) ... Setting up python3-certbot (2.1.0-4) ... Setting up certbot (2.1.0-4) ... Created symlink /etc/systemd/system/timers.target.wants/certbot.timer → /lib/systemd/system/certbot.timer. Processing triggers for man-db (2.11.2-2) ... ```
sudo apt -y install python3-certbot-apache
Output: ``` Reading package lists... Done Building dependency tree... Done Reading state information... Done The following additional packages will be installed: augeas-lenses libaugeas0 python3-augeas Suggested packages: augeas-doc augeas-tools python-certbot-apache-doc The following NEW packages will be installed: augeas-lenses libaugeas0 python3-augeas python3-certbot-apache 0 upgraded, 4 newly installed, 0 to remove and 0 not upgraded. Need to get 847 kB of archives. After this operation, 3045 kB of additional disk space will be used. Get:1 file:/etc/apt/mirrors/debian.list Mirrorlist [30 B] Get:2 https://deb.debian.org/debian bookworm/main amd64 augeas-lenses all 1.14.0-1 [462 kB] Get:3 https://deb.debian.org/debian bookworm/main amd64 libaugeas0 amd64 1.14.0-1 [312 kB] Get:4 https://deb.debian.org/debian bookworm/main amd64 python3-augeas all 0.5.0-1.1 [9320 B] Get:5 https://deb.debian.org/debian bookworm/main amd64 python3-certbot-apache all 2.1.0-2 [64.3 kB] Fetched 847 kB in 0s (8774 kB/s) apt-listchanges: Can't set locale; make sure $LC_* and $LANG are correct! perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LANGUAGE = (unset), LC_ALL = "en_US.UTF-8", LC_TIME = "en_US.UTF-8", LC_MONETARY = "fr_FR.UTF-8", LC_ADDRESS = "fr_FR.UTF-8", LC_TELEPHONE = "fr_FR.UTF-8", LC_NAME = "fr_FR.UTF-8", LC_MEASUREMENT = "fr_FR.UTF-8", LC_IDENTIFICATION = "fr_FR.UTF-8", LC_NUMERIC = "fr_FR.UTF-8", LC_PAPER = "fr_FR.UTF-8", LANG = "C.UTF-8" are supported and installed on your system. perl: warning: Falling back to a fallback locale ("C.UTF-8"). Selecting previously unselected package augeas-lenses. (Reading database ... 26469 files and directories currently installed.) Preparing to unpack .../augeas-lenses_1.14.0-1_all.deb ... Unpacking augeas-lenses (1.14.0-1) ... Selecting previously unselected package libaugeas0:amd64. Preparing to unpack .../libaugeas0_1.14.0-1_amd64.deb ... Unpacking libaugeas0:amd64 (1.14.0-1) ... Selecting previously unselected package python3-augeas. Preparing to unpack .../python3-augeas_0.5.0-1.1_all.deb ... Unpacking python3-augeas (0.5.0-1.1) ... Selecting previously unselected package python3-certbot-apache. Preparing to unpack .../python3-certbot-apache_2.1.0-2_all.deb ... Unpacking python3-certbot-apache (2.1.0-2) ... Setting up augeas-lenses (1.14.0-1) ... Setting up libaugeas0:amd64 (1.14.0-1) ... Setting up python3-augeas (0.5.0-1.1) ... Setting up python3-certbot-apache (2.1.0-2) ... Processing triggers for libc-bin (2.36-9+deb12u8) ... ```
sudo apt install -y htop
Output: ``` Reading package lists... Done Building dependency tree... Done Reading state information... Done The following additional packages will be installed: libnl-3-200 libnl-genl-3-200 Suggested packages: lm-sensors lsof strace The following NEW packages will be installed: htop libnl-3-200 libnl-genl-3-200 0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded. Need to get 237 kB of archives. After this operation, 633 kB of additional disk space will be used. Get:1 file:/etc/apt/mirrors/debian.list Mirrorlist [30 B] Get:2 https://deb.debian.org/debian bookworm/main amd64 libnl-3-200 amd64 3.7.0-0.2+b1 [63.1 kB] Get:3 https://deb.debian.org/debian bookworm/main amd64 libnl-genl-3-200 amd64 3.7.0-0.2+b1 [21.6 kB] Get:4 https://deb.debian.org/debian bookworm/main amd64 htop amd64 3.2.2-2 [152 kB] Fetched 237 kB in 0s (3046 kB/s) apt-listchanges: Can't set locale; make sure $LC_* and $LANG are correct! perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LANGUAGE = (unset), LC_ALL = "en_US.UTF-8", LC_TIME = "en_US.UTF-8", LC_MONETARY = "fr_FR.UTF-8", LC_ADDRESS = "fr_FR.UTF-8", LC_TELEPHONE = "fr_FR.UTF-8", LC_NAME = "fr_FR.UTF-8", LC_MEASUREMENT = "fr_FR.UTF-8", LC_IDENTIFICATION = "fr_FR.UTF-8", LC_NUMERIC = "fr_FR.UTF-8", LC_PAPER = "fr_FR.UTF-8", LANG = "C.UTF-8" are supported and installed on your system. perl: warning: Falling back to a fallback locale ("C.UTF-8"). Selecting previously unselected package libnl-3-200:amd64. (Reading database ... 26994 files and directories currently installed.) Preparing to unpack .../libnl-3-200_3.7.0-0.2+b1_amd64.deb ... Unpacking libnl-3-200:amd64 (3.7.0-0.2+b1) ... Selecting previously unselected package libnl-genl-3-200:amd64. Preparing to unpack .../libnl-genl-3-200_3.7.0-0.2+b1_amd64.deb ... Unpacking libnl-genl-3-200:amd64 (3.7.0-0.2+b1) ... Selecting previously unselected package htop. Preparing to unpack .../htop_3.2.2-2_amd64.deb ... Unpacking htop (3.2.2-2) ... Setting up libnl-3-200:amd64 (3.7.0-0.2+b1) ... Setting up libnl-genl-3-200:amd64 (3.7.0-0.2+b1) ... Setting up htop (3.2.2-2) ... Processing triggers for man-db (2.11.2-2) ... Processing triggers for libc-bin (2.36-9+deb12u8) ... ```

Subscription

Creation date 13 September 2024

Next payment date 13 October 2024

Commitment None Manual renewal

Source: https://www.ovh.com/manager/#/dedicated/billing/autorenew/update?serviceId=vps-3913cb36.vps.ovh.net&serviceType=VPS

I Configure renewal to manual.

Cancel subscription:

Cancel my vps-3913cb36.vps.ovh.net service

Once you confirm the cancellation, please note that any data linked to this service and any backups will be permanently deleted. You will need to take the necessary measures to conserve your data before you confirm your cancellation. Once the process has been launched, it cannot be cancelled. OVHcloud does not accept any responsibility for data loss in this scenario.

Source: https://www.ovh.com/manager/#/dedicated/billing/autorenew/delete?serviceId=vps-3913cb36.vps.ovh.net&serviceType=VPS

So it seems that do not want to cancel subscription and won't be renewed in a month automatically.

 echo -n 'AIzaSyCXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' > ytPrivate/keys.txt
curl https://yt.lemnoslife.com/ytPrivate/keys.txt
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access this resource.</p>
<hr>
<address>Apache/2.4.62 (Debian) Server at yt.lemnoslife.com Port 443</address>
</body></html>

So now let us proceed to merging previous keys.txt and new one.

wc -l youtube_data_api_v3_{official_instance_keys,working_keys_based_on_web_archive}.txt
  2462 youtube_data_api_v3_official_instance_keys.txt
  5484 youtube_data_api_v3_working_keys_based_on_web_archive.txt
  7946 total
cat youtube_data_api_v3_{official_instance_keys,working_keys_based_on_web_archive}.txt | sort | uniq | wc -l
7091
Benjamin-Loison commented 2 months ago

OVH public cloud with my main account with higher quota:

b3-16 16 Go 4 100 Go NVMe 1 Gbit/s 4 Gbit/s max. 0,093 €

So 83 € per month it seems so I took the right decision with the VPS.

Benjamin-Loison commented 2 months ago

I restored monitoring to potentially directly be notified if get IP banned again:

mv instances.json{.old,}
Bluscream commented 2 months ago

I have a VPS SX from https://www.1blu.de/server/vserver/ and a Raspberry Pi 5 8GB locally where i host most of my bots and web services (which has the advantage of getting a new residential ipv4 every 24hrs or when i tell my router to get a new one :)

Benjamin-Loison commented 2 months ago

@Bluscream Thank you for proposing but currently I do not need additional servers.

Benjamin-Loison commented 2 months ago

Following #issuecomment-2347106376, continuing investigating assigning IPv6 to Oracle free VPS:

image

https://docs.oracle.com/en-us/iaas/Content/Network/Concepts/ipv6.htm

image

image

image

image

After sudo reboot, curl -6 https://ifconfig.me returns after a while curl: (28) Failed to connect to ifconfig.me port 443 after 134663 ms: Couldn't connect to server while curl https://ifconfig.me returning IPv4 does not.

Searching DuckDuckGo and Google Oracle Ubuntu VPS enable IPv6.

https://www.aih.app/2023/04/15/setup-ipv6-on-ubuntu-22-04-on-oracle-cloud/ seems to contain images but all of them do not load.

head -n 1 /etc/os-release
PRETTY_NAME="Ubuntu 24.04.1 LTS"
sudo service networking restart
Failed to restart networking.service: Unit networking.service not found.

Alternatively can use:

sudo reboot

Benjamin_Loison/openssh/issues/21 would help.

https://cloudzy.com/blog/configure-ipv6-on-ubuntu/#How_to_Set_Up_IPV6_on_Ubuntu#Step_1_Editing_sysctlconf_file is not enough even after reboot.

ls /etc/network/interfaces
ls: cannot access '/etc/network/interfaces': No such file or directory

https://forums.oracle.com/ords/apexds/post/enable-ipv6-on-arm-instance-with-ubuntu-20-04-9897

/etc/netplan/50-cloud-init.yaml:

# This file is generated from information provided by the datasource.  Changes
# to it will not persist across an instance reboot.  To disable cloud-init's
# network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
    version: 2
    ethernets:
        ens3:
            dhcp4: true
            match:
                macaddress: 02:00:17:00:10:a7
            set-name: ens3
dhclient -6 ens3
Command 'dhclient' not found, but can be installed with:
sudo apt install isc-dhcp-client       # version 4.4.3-P1-4ubuntu1, or
sudo apt install isc-dhcp-client-ddns  # version 4.4.3-P1-4ubuntu1
sudo apt install isc-dhcp-client -y
Output: ``` Reading package lists... Done Building dependency tree... Done Reading state information... Done The following additional packages will be installed: isc-dhcp-common Suggested packages: avahi-autoipd isc-dhcp-client-ddns The following NEW packages will be installed: isc-dhcp-client isc-dhcp-common 0 upgraded, 2 newly installed, 0 to remove and 2 not upgraded. Need to get 375 kB of archives. After this operation, 1011 kB of additional disk space will be used. Get:1 http://eu-paris-1-ad-1.clouds.archive.ubuntu.com/ubuntu noble/universe amd64 isc-dhcp-client amd64 4.4.3-P1-4ubuntu2 [329 kB] Get:2 http://eu-paris-1-ad-1.clouds.archive.ubuntu.com/ubuntu noble/universe amd64 isc-dhcp-common amd64 4.4.3-P1-4ubuntu2 [45.8 kB] Fetched 375 kB in 0s (3265 kB/s) Selecting previously unselected package isc-dhcp-client. (Reading database ... 115113 files and directories currently installed.) Preparing to unpack .../isc-dhcp-client_4.4.3-P1-4ubuntu2_amd64.deb ... Unpacking isc-dhcp-client (4.4.3-P1-4ubuntu2) ... Selecting previously unselected package isc-dhcp-common. Preparing to unpack .../isc-dhcp-common_4.4.3-P1-4ubuntu2_amd64.deb ... Unpacking isc-dhcp-common (4.4.3-P1-4ubuntu2) ... Setting up isc-dhcp-client (4.4.3-P1-4ubuntu2) ... Setting up isc-dhcp-common (4.4.3-P1-4ubuntu2) ... Processing triggers for man-db (2.12.0-4build2) ... Scanning processes... Scanning linux images... Running kernel seems to be up-to-date. No services need to be restarted. No containers need to be restarted. No user sessions are running outdated binaries. No VM guests are running outdated hypervisor (qemu) binaries on this host. ```

https://docs.oracle.com/en-us/iaas/Content/Network/Concepts/ipv6.htm#os_config__linux_config also mentions the following command:

dhclient -6 ens3
RTNETLINK answers: Operation not permitted
mkdir: cannot create directory '/run/network': Permission denied
mkdir: cannot create directory '/run/systemd/resolve/netif': Permission denied
chown: cannot access '/run/systemd/resolve/netif': No such file or directory

Note that I am fine being given an arbitrary IPv6 that I have not, even partially, chosen.

time sudo dhclient -6 ens3
^C

real    0m55.286s
user    0m0.001s
sys 0m0.007s

What is the Netplan they mention?

Along dhcp4: true I added dhcp6: true.

After sudo reboot, does not help.

Maybe factory reset the instance or creating a new one would be interesting.

For better testing should delete instance-20230828-0505 and create a new instance.

Terminate instance Do you want to permanently delete instance instance-20230828-0505? Permanently delete the attached boot volume

So just test to make IPv6 work (and IPv4 too) without hosting a YouTube operational API instance first.

-----BEGIN PGP MESSAGE-----

hF4DTQa9Wom5MBgSAQdAtc49d74Krq9SVzHu2lKkwQeT/9JHd1Lfye24lDpUOEIw
8KdcSawItaFYZhNpLRD4lzzFzhAx+I+3RtNRxzkSerXALkxCazzsEAVg8rXQDZzu
0sByAZ/D8v0XJ7wmHvKVZ/L7IBVztSXtp6jKEzk6pfKyqT/gekXnJsSnVddiWH93
+aGQY1CTtxIHWMV0TZeF0v6Z7nmFBNqOflTD849ZG4RITJuPPLjY/RracGZnCX6n
tW4nAjbP7Qi81PCsdq7OdYXxS2MkBI/BNuI5J+ag+ToqveC1VHpDTAbj+l6XhUOi
GN3jaQb/P8Z5O9Z42unYaHsGQBkZvpYOU0Z/EcEwK6hBvNm/d8jL1h+vUD+dJCn/
tubeANVrJ89r8NiHsH2AjTKyLvzVQXI5e9SvOJAg86LjhDYTQCfIeAfLQpaijDAU
3mssxYq71IVskuZbqHumNDEsPAkg55ZV7t+GA4rugJlpjKfpSsig1Y3mgO696FXp
I/8O3eV6o4DfDwTqZAC8iJnVw78l
=RQKI
-----END PGP MESSAGE-----

So if experiment anyway use instance-20230722-1310 (based on my Oracle account benjaminthekoala).

Benjamin-Loison commented 2 months ago

https://www.aih.app/2023/04/15/setup-ipv6-on-ubuntu-22-04-on-oracle-cloud/ images finally load correctly today on my Linux Mint 22 Cinnamon Framework 13 Firefox, see https://discord.com/channels/933841502155706418/933841503103627316/1284173916545220671.

Benjamin-Loison commented 2 months ago

After Adding Routing Tables and sudo reboot still have:

curl -6 https://ifconfig.me
curl: (7) Failed to connect to ifconfig.me port 443 after 0 ms: Couldn't connect to server

Should test after Creating IPv6 security lists and sudo reboot and Adding the Address to the Subnet.

After Adding an IPv6 address to the Instance and sudo reboot:

curl -6 https://ifconfig.me
2603:c027:c002:b800:dfc1:efbf:49e:f15a

From old official instance:

curl -6 https://ifconfig.me
2603:c026:c103:e000:6220:f0f7:d4ad:8b13

Without furher modification I received on Element:

From LemnosLife VPS /var/www/html/BEN/notify.php: The official instance no-key service response changed!

See #issuecomment-2346285027.

Benjamin-Loison commented 2 months ago
curl -4 -s 'https://www.googleapis.com/youtube/v3/channels?part=id&forHandle=@MrBeast&fields=items/id&key=AIzaSyDXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Sorry...</title>
<style> body { font-family: verdana, arial, sans-serif; background-color: #fff; color: #000; }</style>
</head>
<body>
<div><table><tr>
<td><b><font face="sans-serif" size="10"><font color="#4285f4">G</font><font color="#ea4335">o</font><font color="#fbbc05">o</font><font color="#4285f4">g</font><font color="#34a853">l</font><font color="#ea4335">e</font></font></b></td>
<td style="text-align: left; vertical-align: bottom; padding-bottom: 15px; width: 50%"><div style="border-bottom: 1px solid #dfdfdf;">Sorry...</div></td>
</tr></table></div>
<div style="margin-left: 4em;">
<h1>We're sorry...</h1>
<p>... but your computer or network may be sending automated queries. To protect our users, we can't process your request right now.</p>
</div>
<div style="margin-left: 4em;">See <a href="https://support.google.com/websearch/answer/86640">Google Help</a> for more information.<br><br>
</div>
<div style="text-align: center; border-top: 1px solid #dfdfdf;"><a href="https://www.google.com">Google Home</a></div>
</body>
</html>
curl -6 -s 'https://www.googleapis.com/youtube/v3/channels?part=id&forHandle=@MrBeast&fields=items/id&key=AIzaSyDXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
{
  "items": [
    {
      "id": "UCX6OQ3DkcsbYNE6H8uQQuVA"
    }
  ]
}

Without precising -4 or -6 it gives the -6 output, so it seems to use by default -6.

How to force one or the other with PHP?

Benjamin-Loison commented 2 months ago

test_ipv6.php on my Linux Mint 22 Cinnamon Framework 13 returns an IPv6, so the interesting question is how to force IPv4.

https://x.com/McSodbrenner/status/773540936764821504:

file_get_contents('https://ifconfig.me', false, stream_context_create(['socket' => ['bindto' => '0:0']]))

returns the IPv4 both on my laptop and the old official instance.

Benjamin-Loison commented 2 months ago

If detected as abusing again, then can try automating changing the IPv6, as seems to be able to use 256 different IPv6s as can choose 2 hexadecimal characters.

Benjamin-Loison commented 2 months ago

I have the same error as #issuecomment-2346106204 on OverClock3000 within Virtual Machine Manager, I suspect some people to have abused it through yt4.lemnoslife.com, hence I added an instance key to it.

Note that in this case the default is IPv6, hence the IPv6 has been banned.

Note that there is no issue with the web-scraping endpoints. Using IPv4 thanks to #issuecomment-2351157249 solves the issue.

Benjamin-Loison commented 2 months ago

In case it is not above, as I remove it from yt0.lemnoslife.com:

Redirection diff: ```diff diff --git a/noKey/index.php b/noKey/index.php index 22e9cae..fc09c49 100755 --- a/noKey/index.php +++ b/noKey/index.php @@ -1,7 +1,5 @@ ['ignore_errors' => true]]; $context = stream_context_create($options); - function myDie($content) - { - global $keysCount; - if(isset($_GET['monitoring'])) - { - $data = json_decode($content, true); - $data['monitoring'] = $keysCount; - $content = json_encode($data, JSON_PRETTY_PRINT); - } - die($content); + function redirect($key) { + global $requestUri; + $parts = explode('/noKey/', $requestUri); + $url = 'https://www.googleapis.com/youtube/v3/' . end($parts) . "&key=$key"; + header("Location: $url"); + // To avoid continuing running code, as unclearly mentioned in [the Stack Overflow answer 768472](https://stackoverflow.com/a/768472). + die(); } /// is there any way someone may get the keys out ? could restrict syntax with the one of the official API but that's not that much clean @@ -38,8 +33,7 @@ $key = $keys[$keysIndex]; $realUrl = $url . $key; $response = file_get_contents($realUrl, false, $context); - $response = str_replace($key, '!Please contact Benjamin Loison to tell him how you did that!', $response); // quite good but not perfect - // no need to check for ip leak + // no need to check for ip leak and key leak, as the latter is already in the redirection $json = json_decode($response, true); if (array_key_exists('error', $json)) { @@ -61,7 +55,7 @@ } // If such an error occur, returns it to the end-user, as made exceptions for out of quota and expired keys, should also consider transient, backend and suspension errors. // As managed in YouTube-comments-graph: https://github.com/Benjamin-Loison/YouTube-comments-graph/blob/993429770417bdfa4fdf176c473ff1bfe7ed21ae/CPP/main.cpp#L55-L60 - myDie($response); + redirect($key); } } else { if ($keysIndex !== 0) { @@ -71,7 +65,7 @@ file_put_contents(KEYS_FILE, $toWrite); } // Returns the proceeded response to the end-user. - myDie($response); + redirect($key); } } $message = 'The request cannot be completed because the YouTube operational API run out of quota. Please try again later.'; @@ -86,4 +80,5 @@ 'errors' => [$errors] ]; $json = ['error' => $error]; - myDie(json_encode($json, JSON_PRETTY_PRINT)); + header('Content-Type: application/json; charset=UTF-8'); + die(json_encode($json, JSON_PRETTY_PRINT)); ```