yumata / lampa

GNU General Public License v2.0
334 stars 87 forks source link

Ошибка при использовании прокси на TMDB #146

Open RealCoolmax opened 1 year ago

RealCoolmax commented 1 year ago

Настроил свой прокси для запросов к TMDB. Но запрос на прокси отправляется некорректный. Пример из логов сквида 1660486075.570 0 333.222.111.000 TAG_NONE/400 3987 GET /http://image.tmdb.org/t/p/w200//o9xtEAlNb0wWql0EnT2SmaLZ1qa.jpg - HIER_NONE/- text/html

Как я понимаю тут линий "/" перед http.

yumata commented 1 year ago

Есть такое, я рассчитывал что прокси будет в виде домена, например: http://domain.com + /http://image.tmdb.org/t/p/w200//o9xtEAlNb0wWql0EnT2SmaLZ1qa.jpg

Если у вас свой адрес, по типа http://domain.com/image.php?url= то вам придется обрезать лишний слеш впереди.

RealCoolmax commented 1 year ago

Нет у меня стандартный Squid. Обрезать там что либо не получится.

yumata commented 1 year ago

Окей, тогда пример адреса, может можно будет проверить.

RealCoolmax commented 1 year ago

Не совсем понял: пример какого адреса? У меня Squid поднят на http://proxy.domain.ru:3128 В настройках вбиваю этот адрес, запрос приходит, но впереди адреса стоит "/", на него мой Squid и ругается.

yumata commented 1 year ago

Ну по правилам веба, после домена ставится слеш, а иначе адрес будет неверный. Но вот адрес с портом я не думал что так можно)) Разве оно так будет работать? http://proxy.domain.ru:3128http://image.tmdb.org/t/p/w200//o9xtEAlNb0wWql0EnT2SmaLZ1qa.jpg

RealCoolmax commented 1 year ago

Тут речь-то не совсем про веб :) Тут ведь отправляется запрос к прокси серверу. Кроме того, у кого в качестве прокси стоит какой-нибудь http-сервер может в настройках добавить завершающий слеш.

yumata commented 1 year ago

Полноценный socket5 или другой протокол в лампе не работает. Только веб протокол, поэтому слеш обязательно.

RealCoolmax commented 1 year ago

Нет, никаких соксов, обычный прокси-сервер. Обычный GET запрос. Примерно так я себе представляю: const http = require("http");

const options = { host: "proxy", port: 8080, path: "http://www.google.com", headers: { Host: "www.google.com" } };

http.get(options, (res) => { console.log(res); res.pipe(process.stdout); });

yumata commented 1 year ago

Ну и как по вашему я заведу node,js в браузере? Повторюсь, доступен только javascript метод и только по типу http://proxy.domain.ru:3128/http://image.tmdb.org/t/p/w200//o9xtEAlNb0wWql0EnT2SmaLZ1qa.jpg

RealCoolmax commented 1 year ago

А что с вариантом описанным мною выше? Ведущий "/" добавляется уже в скрипте. Что если сделать для обычных прокси в настройках "http://proxy.domain.ru:3128", а для тех кому нужен этот "/" дописать его в настройках "http://proxy.somian.ru/". От Лампы я получаю корректный GET запрос, мешает его отработать только "/" перед http... Можно увидеть кусок кода, где формируется запрос к прокси?

totavok8 commented 1 year ago

Ну и как по вашему я заведу node,js в браузере? Повторюсь, доступен только javascript метод и только по типу http://proxy.domain.ru:3128/http://image.tmdb.org/t/p/w200//o9xtEAlNb0wWql0EnT2SmaLZ1qa.jpg

А если убрать слешь вот тут ) + '/' + base : base; Думаю это и есть решение, а тем кому надо будут прописывать его вручную

yumata commented 1 year ago

Думаю это и есть решение, а тем кому надо будут прописывать его вручную

Тупость никто не отменял)) Так и будут писать, прописал домен, а не чего не работает.

Ведущий "/" добавляется уже в скрипте.

Так устроены сервера, впереди всегда есть слеш.

yumata commented 1 year ago

Что если сделать для обычных прокси в настройках "http://proxy.domain.ru:3128"

Вы на своем сервере хоть пробовали запустить без слеша?

RealCoolmax commented 1 year ago

Вы на своем сервере хоть пробовали запустить без слеша?

Не понял вопрос. Что запустить на своём сервере?

yumata commented 1 year ago

Не понял вопрос. Что запустить на своём сервере?

Где стоит прокси сервер? Как к нему обратится? По какому адресу?

RealCoolmax commented 1 year ago

По какому адресу?

Как-то не хотелось бы светить свой прокси в отрытых источниках. А кусочек лога приводил в первом сообщении.

yumata commented 1 year ago

Вот пример как должен работать прокси сервер: http://imagetmdb.cub.watch/http://image.tmdb.org/t/p/w200//1dCTKq9FkwO58EbcOdpZy1sYw71.jpg

А теперь представим, что мы не будем подставлять слеш, пробуем: http://imagetmdb.cub.watchhttp://image.tmdb.org/t/p/w200//1dCTKq9FkwO58EbcOdpZy1sYw71.jpg

Других вариантов нету и не будет.

RealCoolmax commented 1 year ago

Хорошо, я понял. Придётся поднимать nginx и настраивать его на работу в качестве прокси, вместо того чтобы использовать стандартный Squid.

Спасибо!

yumata commented 1 year ago

Не я тут диктую условия)) Диктует их javascript, а в javascript нету технических способов использовать прокси с логином и паролем, кроме как запрашивать тупо адрес и подставлять ему параметры другого адреса.

RealCoolmax commented 1 year ago

Я крайне слабо ориентируюсь в JS, но почему-то был уверен, что есть какой-то класс alaProxy, которому можно передать адрес прокси и строку адреса. Очевидно я ошибался. Придётся огород городить :)

totavok8 commented 1 year ago

Не я тут диктую условия)) Диктует их javascript, а в javascript нету технических способов использовать прокси с логином и паролем, кроме как запрашивать тупо адрес и подставлять ему параметры другого адреса.

вроде что то подобие нашёл: на гитхабе пример из stackoverflow

yumata commented 1 year ago

вроде что то подобие нашёл: на гитхабе

Это для node.js, а он серверный.

RealCoolmax commented 1 year ago

Других вариантов нету и не будет.

Я правильно понимаю, что вы свою версию прокси сделали с использованием PHP?

yumata commented 1 year ago

Да. Если надо, могу скинуть.

RealCoolmax commented 1 year ago

Да. Если надо, могу скинуть.

Да, было бы интересно посмотреть. Если напрямую с nginx не получится...

yumata commented 1 year ago

index.php

<?php
header('Access-Control-Allow-Origin: *');

@error_reporting ( E_ALL ^ E_WARNING ^ E_NOTICE );
@ini_set ( 'display_errors', true );
@ini_set ( 'html_errors', false );
@ini_set ( 'error_reporting', E_ALL ^ E_WARNING ^ E_NOTICE );
@ini_set ( "short_open_tag", 1 );

$uri = substr($_SERVER['REQUEST_URI'], 1);
$exp = explode('/', $uri);
$med = array_shift($exp);
$url = implode('/', $exp);

if($med == 'api'){
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_TIMEOUT,60);

    $html = curl_exec($ch);
    $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    curl_close($ch);

    if($code == 200){
        header("HTTP/1.1 200 OK");

        echo $html;
    }
    else{
        header("HTTP/1.0 404 Not Found");
    }
}
elseif($med == 'img'){
    echo file_get_contents($url);
}
else{
    header("HTTP/1.0 404 Not Found");
}
?>

.htaccess

DirectoryIndex index.php

RewriteEngine On
RewriteBase /

ErrorDocument 404 /index.php
ErrorDocument 403 /index.php

RewriteCond %{REQUEST_FILENAME} !(index\.php)
RewriteRule ^(.*)$ /index.php/$1

Пример изображений: http://domain.com/img/http://imagetmdb.cub.watch/http://image.tmdb.org/t/p/w200//1dCTKq9FkwO58EbcOdpZy1sYw71.jpg

Пример api http://domain.com/api/http://api.themoviedb.org/3/movie/top_rated?api_key=4ef0d7355d9ffb5151e987764708ce96&language=ru

worms-qwe commented 1 year ago

Вариант, конечно, интересный, с таким доступом к прокси, но сомнительный. Я поднял свой локальный прокси и VPN в network namespaces и жутко обломался. То, что нигде не написано, что данный прокси далек от всем привычного вводит людей в заблуждение. Этот нюанс же нигде не описан.

Я правильно понимаю, что ваш вариант на PHP требует запуска Apache или Nginx? Хотелось бы поподробнее узнать о том, как это все запустить.

P.S. Пытался отредактировать URL при помощи url_rewrite_program в squid и могу сказать, что не стоит на это тратить время. Судя по всему проверка URL происходит раньше, чем перенаправление.

yumata commented 1 year ago

worms-qwe

Тут я уже описывал в чем проблема. Это единственный вариант.

RealCoolmax commented 1 year ago

Я правильно понимаю, что ваш вариант на PHP требует запуска Apache или Nginx?

Да, для использования приведённого выше прокси-скрипта надо поднимать http-сервер. Я на своём VDS поднял Апач. Чутка доработал скрипт и использую его.

dshkoda32 commented 1 year ago

Подскажите если стоит nginx на впс но в директории html уже есть сайт, куда можно скинуть для прокси ваши файлы .htaccess index.php. Я так понимаю можно в корне создать папку и сбросить туда эти файлы. Тогда путь будет http://домен/папка/

yumata commented 1 year ago

Подскажите если стоит nginx на впс но в директории html уже есть сайт, куда можно скинуть для прокси ваши файлы .htaccess index.php. Я так понимаю можно в корне создать папку и сбросить туда эти файлы. Тогда путь будет http://домен/папка/

Можно создать субдомен, и туда закинуть.

worms-qwe commented 1 year ago

Нужно создать в nginx еще один конфиг сайта и там в блоке server указать другую корневую директорию сайта. И данный файл .htaccess придется переписать под nginx, ибо он сделан под apache. Можно вообще указать все, что в нем есть прямо в конфиге сайта.

worms-qwe commented 1 year ago

index.php

<?php
header('Access-Control-Allow-Origin: *');

@error_reporting ( E_ALL ^ E_WARNING ^ E_NOTICE );
@ini_set ( 'display_errors', true );
@ini_set ( 'html_errors', false );
@ini_set ( 'error_reporting', E_ALL ^ E_WARNING ^ E_NOTICE );
@ini_set ( "short_open_tag", 1 );

$uri = substr($_SERVER['REQUEST_URI'], 1);
$exp = explode('/', $uri);
$med = array_shift($exp);
$url = implode('/', $exp);

if($med == 'api'){
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  curl_setopt($ch, CURLOPT_HEADER, false);
  curl_setopt($ch, CURLOPT_TIMEOUT,60);

  $html = curl_exec($ch);
  $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

  curl_close($ch);

  if($code == 200){
      header("HTTP/1.1 200 OK");

      echo $html;
  }
  else{
      header("HTTP/1.0 404 Not Found");
  }
}
elseif($med == 'img'){
  echo file_get_contents($url);
}
else{
  header("HTTP/1.0 404 Not Found");
}
?>

.htaccess

DirectoryIndex index.php

RewriteEngine On
RewriteBase /

ErrorDocument 404 /index.php
ErrorDocument 403 /index.php

RewriteCond %{REQUEST_FILENAME} !(index\.php)
RewriteRule ^(.*)$ /index.php/$1

Пример изображений: http://domain.com/img/http://imagetmdb.cub.watch/http://image.tmdb.org/t/p/w200//1dCTKq9FkwO58EbcOdpZy1sYw71.jpg

Пример api http://domain.com/api/http://api.themoviedb.org/3/movie/top_rated?api_key=4ef0d7355d9ffb5151e987764708ce96&language=ru

А в чем смысл в index.php отдельно делать api и img? Попробовал удалить лишнее и оставил все в таком виде:

<?php
header('Access-Control-Allow-Origin: *');

@error_reporting ( E_ALL ^ E_WARNING ^ E_NOTICE );
@ini_set ( 'display_errors', true );
@ini_set ( 'html_errors', false );
@ini_set ( 'error_reporting', E_ALL ^ E_WARNING ^ E_NOTICE );
@ini_set ( "short_open_tag", 1 );

$url = substr($_SERVER['REQUEST_URI'], 1);
$proxy = '192.168.0.100:3131';

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_PROXY, $proxy);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_TIMEOUT,60);

    $html = curl_exec($ch);
    $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    curl_close($ch);

    if($code == 200){
        header("HTTP/1.1 200 OK");

        echo $html;
    }
    else{
        header("HTTP/1.0 404 Not Found");
    }
?>

Теперь не надо отдельно прописывать .../api и .../img Вроде все работает. Или я что-то проглядел?

P.S. Строки 12 и 15 нужны для того, чтобы запросы с лампы шли через классические прокси. В данном случае прокси локальный.

dshkoda32 commented 1 year ago

А сервер обязательно должен быть за пределами РФ?

totavok8 commented 1 year ago

А сервер обязательно должен быть за пределами РФ?

Да, так как ТМДБ блокирует доступ для тех кто из РФ и РБ

dshkoda32 commented 1 year ago

Скиньте если не трудно под nginx скрипт

dshkoda32 commented 1 year ago

index.php

<?php
header('Access-Control-Allow-Origin: *');

@error_reporting ( E_ALL ^ E_WARNING ^ E_NOTICE );
@ini_set ( 'display_errors', true );
@ini_set ( 'html_errors', false );
@ini_set ( 'error_reporting', E_ALL ^ E_WARNING ^ E_NOTICE );
@ini_set ( "short_open_tag", 1 );

$uri = substr($_SERVER['REQUEST_URI'], 1);
$exp = explode('/', $uri);
$med = array_shift($exp);
$url = implode('/', $exp);

if($med == 'api'){
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_TIMEOUT,60);

    $html = curl_exec($ch);
    $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    curl_close($ch);

    if($code == 200){
        header("HTTP/1.1 200 OK");

        echo $html;
    }
    else{
        header("HTTP/1.0 404 Not Found");
    }
}
elseif($med == 'img'){
    echo file_get_contents($url);
}
else{
    header("HTTP/1.0 404 Not Found");
}
?>

.htaccess

DirectoryIndex index.php

RewriteEngine On
RewriteBase /

ErrorDocument 404 /index.php
ErrorDocument 403 /index.php

RewriteCond %{REQUEST_FILENAME} !(index\.php)
RewriteRule ^(.*)$ /index.php/$1

Пример изображений: http://domain.com/img/http://imagetmdb.cub.watch/http://image.tmdb.org/t/p/w200//1dCTKq9FkwO58EbcOdpZy1sYw71.jpg Пример api http://domain.com/api/http://api.themoviedb.org/3/movie/top_rated?api_key=4ef0d7355d9ffb5151e987764708ce96&language=ru

А в чем смысл в index.php отдельно делать api и img? Попробовал удалить лишнее и оставил все в таком виде:

<?php
header('Access-Control-Allow-Origin: *');

@error_reporting ( E_ALL ^ E_WARNING ^ E_NOTICE );
@ini_set ( 'display_errors', true );
@ini_set ( 'html_errors', false );
@ini_set ( 'error_reporting', E_ALL ^ E_WARNING ^ E_NOTICE );
@ini_set ( "short_open_tag", 1 );

$url = substr($_SERVER['REQUEST_URI'], 1);
$proxy = '192.168.0.100:3131';

  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_PROXY, $proxy);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  curl_setopt($ch, CURLOPT_HEADER, false);
  curl_setopt($ch, CURLOPT_TIMEOUT,60);

  $html = curl_exec($ch);
  $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

  curl_close($ch);

  if($code == 200){
      header("HTTP/1.1 200 OK");

      echo $html;
  }
  else{
      header("HTTP/1.0 404 Not Found");
  }
?>

Теперь не надо отдельно прописывать .../api и .../img Вроде все работает. Или я что-то проглядел?

P.S. Строки 12 и 15 нужны для того, чтобы запросы с лампы шли через классические прокси. В данном случае прокси локальный.

Сможете помочь по настройке прокси

immisterio commented 1 year ago

Прокси через nginx

server
{
   listen 80;
   #server_name domain.com;

   location ~ ^/proxy/([^:]+):/?/([^/]+)/(.*)$
   {
      resolver 1.1.1.1 8.8.8.8 ipv6=off;
      proxy_pass $1://$2/$3$is_args$args;
      proxy_http_version 1.1;
   }
}

http://vpsip/proxy/https://image.tmdb.org/t/p/w200//1dCTKq9FkwO58EbcOdpZy1sYw71.jpg

dshkoda32 commented 1 year ago

Прокси через nginx

server
{
   listen 80;
   #server_name domain.com;

   location ~ ^/proxy/([^:]+):/?/([^/]+)/(.*)$
   {
      resolver 1.1.1.1 8.8.8.8 ipv6=off;
      proxy_pass $1://$2/$3$is_args$args;
      proxy_http_version 1.1;
   }
}

http://vpsip/proxy/https://image.tmdb.org/t/p/w200//1dCTKq9FkwO58EbcOdpZy1sYw71.jpg

Спасибо большое, все работает. Правда бывает иногда не работает прокси, если проверять отдельно на картинке выкидывает 403 ошибку, но после нескольких попыток все восстанавливается

IGNATOV93 commented 1 year ago

А есть кто живой с этой ветки? Тоже хочу намутить для постеров папки мои торенты,, ток не совсем понял как. Есть у кого время есть подсказать? 😁

IGNATOV93 commented 1 year ago

Ребят а в чем может быть проблема. Установил nginx, закинул файл my plugin. js с кодом выше. В браузере открывается, как только тест скрипта самого. Или нужно файл что бы был index.php? И в нем уже сам скрипт написать? Подскажите пожалуйста что не так делаю 🙄. Server на vps, или ещё нужно что установить для работы скрипта

dshkoda32 commented 1 year ago

Ребят а в чем может быть проблема. Установил nginx, закинул файл my plugin. js с кодом выше. В браузере открывается, как только тест скрипта самого. Или нужно файл что бы был index.php? И в нем уже сам скрипт написать? Подскажите пожалуйста что не так делаю 🙄. Server на vps, или ещё нужно что установить для работы скрипт Скинь контакт от телеги, напишу

IGNATOV93 commented 1 year ago

Ребят а в чем может быть проблема. Установил nginx, закинул файл my plugin. js с кодом выше. В браузере открывается, как только тест скрипта самого. Или нужно файл что бы был index.php? И в нем уже сам скрипт написать? Подскажите пожалуйста что не так делаю 🙄. Server на vps, или ещё нужно что установить для работы скрипт Скинь контакт от телеги, напишу

@IGNATOV_68

IGNATOV93 commented 1 year ago

За ночь пока понял, что я пытался hph скрипт запустить как js. И что нужно указать папку, и по ней переходить. А в этой папке должен быть index.php с самим скриптом. И в сервере прописать это, хотя может и не так, 😁🙄