Перейти к содержанию
Fire Monkey от А до Я
  • 0

NetHttpClient vs idHttp


Mars M

Вопрос

Есть такой вот код для работы с гугл переводчиком:

procedure TfrmMain.GTranslate;
var
  Data: TStringList;
  S: String;
begin
  IdHTTP1.Request.UserAgent :=
    'Mozilla/5.0 (Windows; U; Windows NT 6.1; ru-RU) Gecko/20100625 Firefox/3.6.6';

  Data := TStringList.Create;
  try
    Data.Text := ('client=x'#13#10
                + 'text='
                + Edit1.Text + #13#10
                + 'hl=en'#13#10
                + 'sl=en'#13#10
                + 'tl=ru');
    try
      S := (IdHTTP1.Post('http://translate.google.ru/translate_a/t', Data));
    except
      on E: exception do
        ShowMessage(E.ClassName + ' error raised, with message : ' + E.Message);
    end;
  finally
    Data.Free;
  end;
end;

Работает без проблем.

Переделал его для NetHttpClient, практически один в один и вместо перевода получаю html страницу с гугл капчей.

Типа такой как получаю если заходить через браузер http://translate.google.ru/translate_a/t?client=x&text=Hello&hl=en&sl=en&tl=ru

Так в чем между ними разница что получаю разный результат?

PS: Просто я в проекте и так использую NetHttpClient, хотелось бы на нем и сделать а не плодить кучу однотипных компонентов.

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Вот сделал аналог на THTTPClient:

function TForm1.GoogleTranslate(const AValue : String) : String;
const ConstGoogleUrl = 'http://translate.google.ru/translate_a/t';
var ASource: TStringList;
    AResponce : IHTTPResponse;
    FHTTPClient : THTTPClient;
begin
  FHTTPClient:=THTTPClient.Create;
  FHTTPClient.UserAgent:='Mozilla/5.0 (Windows; U; Windows NT 6.1; ru-RU) Gecko/20100625 Firefox/3.6.6';
  Result:='Translate Error : ';
  ASource:=TStringList.Create;
  ASource.Add('client=x');
  ASource.Add('text=' + AValue);
  ASource.Add('hl=en');
  ASource.Add('sl=en');
  ASource.Add('tl=ru');
  AResponce:=FHTTPClient.Post(ConstGoogleUrl, ASource);
  if Not Assigned(AResponce) then
  begin
    Result:=Result + 'unknow.';
    Exit;
  end;
  if AResponce.StatusCode <> 200 then
  begin
    Result:=Result + AResponce.StatusText;
  end;
    Result:=AResponce.ContentAsString;
end;

Получаю вполне очевидный ответ:

Цитата

Наши системы обнаружили необычный трафик из вашей компьютерной сети. Эта страница проверяет, действительно ли вы отправляете запросы, а не робот.
Эта страница появляется, когда Google автоматически обнаруживает запросы, поступающие из вашей компьютерной сети, которые, как представляется, нарушают <a href="//www.google.com/policies/terms/"> Условия обслуживания </a>. После истечения этих запросов блок истечет. В то же время решение вышеуказанного CAPTCHA позволит вам продолжать использовать наши сервисы. <br> <br> Этот трафик может быть отправлен вредоносным программным обеспечением, подключаемым модулем браузера или скриптом, который отправляет автоматические запросы. Если вы сообщаете свое сетевое подключение, обратитесь к вашему администратору за помощью & mdash; другой компьютер, использующий один и тот же IP-адрес, может быть ответственным. <a href="//support.google.com/websearch/answer/86640"> Подробнее ... <br> <br> Иногда вас могут попросить решить CAPTCHA, если вы используете расширенные термины, которые роботы которые часто используются или отправляют запросы очень быстро.

Конечно подбор HTTP Headers и других параметров может и обманет не надолго сервис, но на это надеяться не стоит. В Гугле работают отнюдь не дураки, и вряд ли они создавали свой сервис перевода (с отличным API кстати) просто так. Сервис платный (20 долларов США за 1 000 000 символов , но с пробным бесплатным периодом. Если вы хотите 100% работающее решение, то лучше воспользоваться им https://translate.google.com/intl/ru/about/forbusiness.html

Ссылка на комментарий
  • 0

Я уперся рогом и все таки смог найти решение для вас. Гугль любит разработчиков, и обычно оставляет им возможность пользоваться сервисами бесплатно. И в этот раз чутьё не подвело. Вот решение:

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo,
  System.JSON,
  System.Net.HTTPClient,
  System.NetEncoding;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }

  public
    { Public declarations }
    function GoogleTranslate(const AValue : String) : String;
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.FormShow(Sender: TObject);
Var S : String;
begin
  S:=GoogleTranslate('Hello world!');
  Memo1.Lines.Add(S);
end;

function TForm1.GoogleTranslate(const AValue : String) : String;
const ConstSourceLang  = 'en';
      ConstTargetLang  = 'ru';
var AResponce : IHTTPResponse;
    FHTTPClient : THTTPClient;
    AAPIUrl : String;
begin
  AAPIUrl:='https://translate.googleapis.com/translate_a/single?client=gtx&sl=' + ConstSourceLang +
            '&tl=' + ConstTargetLang + '&dt=t&q=' + TNetEncoding.URL.Encode(AValue);
  FHTTPClient:=THTTPClient.Create;
  FHTTPClient.UserAgent:='Mozilla/5.0 (Windows; U; Windows NT 6.1; ru-RU) Gecko/20100625 Firefox/3.6.6';
  Result:='Translate Error : ';
  AResponce:=FHTTPClient.Get(AAPIUrl);
  if Not Assigned(AResponce) then
  begin
    Result:=Result + 'unknow.';
    Exit;
  end;
  if AResponce.StatusCode <> 200 then
  begin
    Result:=Result + AResponce.StatusText;
  end;
  try
    Result:=TJSONArray(TJSONArray(TJSONArray(TJSONObject.ParseJSONValue(AResponce.ContentAsString)).Items[0]).Items[0]).Items[0].Value;
  except
    Result:=Result + 'error parse JSON.';
    Exit;
  end;
end;

end.

Подправил код, сделал покрасивее и убрал deprecated encode.

Изменено пользователем Евгений Корепов
Ссылка на комментарий
  • 0

Евгений Корепов, проверил, вроде работает. Спасибо :)

На счет 20 долларов США за 1 000 000 символов  это конечно хорошо, но во фришном софте использовать платные решения не хочется :)

1 час назад, Евгений Корепов сказал:

 Гугль любит разработчиков, и обычно оставляет им возможность пользоваться сервисами бесплатно. И в этот раз чутьё не подвело.

А где почитать про эту бесплатную возможность от гугла, желательно от самого гугла? Ну что бы хоть быть в курсе к чему быть готовым?

 

Тут кстати нашел ещё решения с парсингом страницы, тоже вроде работает, но разумеется помедленней, хотя во фришном софте это не так важно.

https://sourceforge.net/projects/agoogletranslat/

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...