Форум по Delphi программированию



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.06.2021, 21:21
Katerina1993 Katerina1993 вне форума
Прохожий
 
Регистрация: 22.09.2018
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Не получается запустить исходник работающий с библиотекой idHttp?

Я пытаюсь использовать idHttp, чтобы выполнить какое-либо действия с другими сайтами например скачать файл, узнать курсы валют или получить информацию по ТИЦ и PR. За все тесты не один исходник не сработал, все исходники взяты с сайта https://delphisources.ru/. Вот пример кода получение ТИЦ и PR.
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdHTTP, StdCtrls,shellapi, IdAntiFreezeBase, IdAntiFreeze,RegExpr, IdAuthentication, IdHeaderList,
  Menus, ExtCtrls, Jpeg, IniFiles;

type
  TForm1 = class(TForm)
    Button1: TButton;
    IdHTTP1: TIdHTTP;
    IdAntiFreeze1: TIdAntiFreeze;
    Memo1: TMemo;
    Edit1: TEdit;
    Label1: TLabel;
    Label3: TLabel;
    MainMenu1: TMainMenu;
    N2: TMenuItem;
    N3: TMenuItem;
    Image1: TImage;
    Button2: TButton;
    N4: TMenuItem;
    N5: TMenuItem;
    Label5: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure N3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure N5Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Ini:TIniFile;

implementation

uses IdHTTPHeaderInfo, Unit2;

{$R *.dfm}

function Pars(T_, ForS, _T: string): string;
var
 a, b: integer;
begin
if (T_ <> '') and (ForS <> '') and (_T <> '') then begin
a := Pos(T_, ForS);
Result := Copy(ForS, a+Length(T_), Length(ForS));
b := Pos(_T, Result);
Result := Copy(Result, 1, b-1);
end
 else
Result := 'NOT STR';
end;

procedure TForm1.Button1Click(Sender: TObject);
var
str:TStringList;
s,st:string;
st1:string[20];
i,j:integer;
Stream, Stream2:TStream;
jpg:TJPEGImage;
begin
try
  st1:='';
  str:=TStringList.Create;
  str.Clear;
  str.Add('url='+Edit1.Text);
  IdHTTP1.Post('https://pr-cy.ru/analysis/?',str);
  s:=IdHTTP1.Get('https://pr-cy.ru/analysis/?url='+Edit1.Text);
  Memo1.Text:=s;
  if pos('<td width="25%" align="right" bgcolor="#eef2f5">',Memo1.Text)<>0 then
   begin
    Memo1.HideSelection:=false;
    Memo1.SelStart:=pos('<td width="25%" align="right" bgcolor="#eef2f5">',Memo1.Text)-1;
    Memo1.SelLength:=length('<td width="25%" align="right" bgcolor="#eef2f5">');
   end;
  Memo1.CutToClipboard;
  st:=pars('<td width="25%" align="right" bgcolor="#eef2f5">',Memo1.Text,'<script type="text/javascript">');
  for i:=1 to length(st) do
   begin
    if st[i]='/' then
     j:=i;
   end;
   for i:=1 to j-1 do
    begin
     st1:=st1+st[i];
    end;
    jpg:=TJPEGImage.create;
    Stream:=TStringStream.Create(IdHTTP1.Get('https://pr-cy.ru/imagesite.php?domen='+Edit1.Text));
    jpg.LoadFromStream(Stream);
    Image1.Picture.Assign(jpg);
    Label1.Caption:='тИЦ: '+Pars('<td width="25%" align="right" bgcolor="#eef2f5">',s,'</td>');
    if Label1.Caption='' then
     Label1.Caption:='тИЦ: 0';
    Label3.Caption:='PR: '+st1;
except
 on e:Exception do
  Application.MessageBox('Нет соединение с Интернетом или прокси-сервером','Внимание',MB_OK);
end;
end;


procedure TForm1.FormCreate(Sender: TObject);
var
checked:string;
begin
   Ini:=TIniFile.Create(ExtractFilePath(ParamStr(0))+'Setting.ini');
   checked:=ini.ReadString('Param','Checked','');
   if (checked='true') then
    begin
     IdHTTP1.ProxyParams.ProxyPassword:=Ini.ReadString('Param','Password','');
     IdHTTP1.ProxyParams.ProxyPort:=Ini.ReadInteger('Param','Port',0);
     IdHTTP1.ProxyParams.ProxyServer:=Ini.ReadString('Param','Server','');
     IdHTTP1.ProxyParams.ProxyUsername:=Ini.ReadString('Param','UserName','');;
     IdHTTP1.ProxyParams.BasicAuthentication:=true;
    end;
end;

procedure TForm1.N3Click(Sender: TObject);
begin
 form2.ShowModal;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
str:TStringList;
s,s1,s2:string;
begin
str:=TStringList.Create;
str.Clear;
str.Add('url='+Edit1.Text);
IdHTTP1.Post('http://tooby.ru/include/cr.php?',str);
s:=IdHTTP1.Get('http://tooby.ru/include/cr.php?url='+Edit1.Text);
s1:=Pars('<cy>',s,'</cy>');
Label1.Caption:='тИЦ: '+s1;
s2:=Pars('<pr>',s,'</pr>');
Label3.Caption:='PR: '+s2;
end;

procedure TForm1.N5Click(Sender: TObject);
begin
ShowMessage('andrey53@uvaga.by');
end;

end.

При попытке запустить выдает сообщение об ошибке.
Цитата:
Project Project2.exe raised exception class EIDIOhandlerPropInvalid with message 'IOHandler value is not valid'. Process sropped. Use Step or Run to continue.
В чем может быть проблема, как исправить?
Ответить с цитированием
  #2  
Старый 21.06.2021, 07:22
Katerina1993 Katerina1993 вне форума
Прохожий
 
Регистрация: 22.09.2018
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Нашла другой способ с помощью Synapse, но в итоге все равно ничего не происходит. Вот пример кода:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,httpsend,synacode,SSL_OpenSSL;

type
  TForm1 = class(TForm)
    Button1: TButton;
    sMemo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  function Pars(T_, ForS, _T: string): string;
var
  Form1: TForm1;
  info : string;

implementation

{$R *.dfm}

function Pars(T_, ForS, _T: string): string;
var
a, b: integer;
begin
Result := '';
if (T_ = '') or (ForS = '') or (_T = '') then Exit;
a := Pos(T_, ForS);
if a = 0 then Exit
else a := a + Length(T_);

ForS := Copy(ForS, a, Length(ForS) - a + 1);
b := Pos(_T, ForS);
if b > 0 then Result := Copy(ForS, 1, b - 1);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
HTTP: THTTPSend;
HTML : TStringList;
begin
HTTP:= THTTPSend.Create;
HTML := TStringList.Create;
HTTP.MimeType:='application/x-www-form-urlencoded';
//Например WarFrame :)

if HTTP.HTTPMethod('GET','https://warframe.com/ru') then
begin

HTML.LoadFromStream(HTTP.Document);

info :=Pars('"theme_token":"',Utf8ToAnsi(html.Text),'","'); 
sMemo1.Lines.Add(info);
end;
end;
end.
В чем может быть проблема, не проходит условие if HTTP.HTTPMethod('GET','https://warframe.com/ru') then?

Последний раз редактировалось Katerina1993, 21.06.2021 в 07:27.
Ответить с цитированием
  #3  
Старый 02.07.2021, 21:11
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,689
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Не знаю что там с Синапсом, а с Инди все просто.
По умолчанию библиотека шифрования не подключена (ssl), а идет обращение к https, где она нужна.
Я постил на форуме пример кода для https:
Код:
function TMonitorItem.ReadInternetPage(AUrl : String) : String;
var
  IdHTTP : TIdHTTP;
  Id_HandlerSocket : TIdSSLIOHandlerSocketOpenSSL;
begin
  IdHTTP := TIdHTTP.Create(Nil);
  Id_HandlerSocket := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP);
  Try
    IdHTTP.Request.BasicAuthentication := False;
    IdHTTP.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0';

    Id_HandlerSocket.SSLOptions.Mode := sslmClient;
    Id_HandlerSocket.SSLOptions.Method := sslvSSLv23;
    IdHTTP.IOHandler := Id_HandlerSocket;

    Result := IdHTTP.Get(AUrl);
  Finally
    Id_HandlerSocket.Free;
    IdHTTP.Free;
  End;
end;
Код работает на Delphi 10.
Не звбыть положить соотв. библиотеки для SSL рядом с бинарником.
Ответить с цитированием
  #4  
Старый 03.07.2021, 17:50
Аватар для Admin
Admin Admin вне форума
Администратор
 
Регистрация: 03.10.2005
Адрес: Россия, Москва
Сообщения: 1,513
Версия Delphi: Delphi 7
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Katerina1993
Я пытаюсь использовать idHttp, чтобы выполнить какое-либо действия с другими сайтами например скачать файл, узнать курсы валют или получить информацию по ТИЦ и PR. За все тесты не один исходник не сработал, все исходники взяты с сайта https://delphisources.ru/. Вот пример кода получение ТИЦ и PR.
Некторым исходникам на сайте более 15 лет, поэтому на части из них потребуется обновить код, а некоторые вовсе уже неактуальны - вместо тИЦ у яндекса теперь ИКС, а Google PageRank и вовсе упразднен лет 5 назад.

Ну и используйте пример кода lmikle для актуализации данных исходников.
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:52.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2021

ВКонтакте   Facebook   Twitter