با درود و احترام خدمت دوستان گل
دریافت فایل توسط ربات تلگرام رو به درخواست دوستان براتون آماده کردم . این کد برای دریافت تصویر و فایل در قالب های photo و document هست فرصت نکردم فرمت های دیگه رو بررسی کنم ببینم نام قالبش چیه . دیگه این و بعهده خودتون میذارم
Recieve And Download File From bot with delphi
const
BotFileUrl = 'https://api.telegram.org/file/bot';
مرحله بعد افزودن دو متد به botThread هست:
TBotThread = class(TThread)
private
Function GetFile_Path(file_id: string) : String;
procedure DownloadFile(FilePath , OrginalFileName: String );
بدنه این دو متد بشرح زیر هست:
function TBotThread.GetFile_Path(file_id: string): String;Var
Stream: TStringStream;
Params: TIdMultipartFormDataStream;
msg : WideString;
Src : string;
LHandler: TIdSSLIOHandlerSocketOpenSSL;
json , ResultNode , OKNode:TlkJSONbase;
begin
Result := '';
try
try
msg := '/getfile';
LHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
FidHttpSend.ReadTimeout := 30000;
FidHttpSend.IOHandler:=LHandler;
LHandler.SSLOptions.Method := sslvTLSv1;
LHandler.SSLOptions.Mode := sslmClient;
FidHttpSend.HandleRedirects := true;
Src := FidHttpGet.Get(BotUrl + API + msg + '?file_id=' + file_id);
json:= TlkJSON.ParseText(Src);
OKNode := TlkJSONboolean(json).Field['ok'];
ResultNode := TlkJSONlist(json).Field['result'];
if ResultNode <> nil then
Begin
Result := VarToStr(ResultNode.Field['file_path'].Value);
End;
finally
LHandler.Free;
ENd;
except
on E: EIdHTTPProtocolException do
begin
if E.ErrorCode = 403 then
begin
WriteToLog('Bot was blocked by the user');
end;
end;
end;
end;
procedure TBotThread.DownloadFile(FilePath , OrginalFileName: String );
var
Stream: TMemoryStream;
Url, Filename: String;
LHandler: TIdSSLIOHandlerSocketOpenSSL;
tmpFilePath : String;
Begin
if OrginalFileName = '' then
Begin
tmpFilePath := AnsiReplaceStr(FilePath,'/','\');
OrginalFileName := ExtractFileName(tmpFilePath);
End;
LHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
FidHttpSend.ReadTimeout := 0;
FidHttpSend.IOHandler := LHandler;
LHandler.SSLOptions.Method := sslvTLSv1;
LHandler.SSLOptions.Mode := sslmClient;
FidHttpSend.HandleRedirects := true;
URL := BotFileUrl+ API + '/' + FilePath;
Stream := TMemoryStream.Create;
try
FidHttpSend.Get(URL, Stream);
Stream.SaveToFile(OrginalFileName);
finally
Stream.Free;
end;
end;
حالا باید متد اصلی ترد یعنی Execute رو یه تغییری بدیم:
procedure TBotThread.Execute;
var
....
file_id , file_path , FileName: string;
فسمت دریافت پیام رو هم بخش های زیر رو بهش اضافه کنید
if TlkJSONObject(item).Field['message'] <> nil then
Begin
msgNode := TlkJSONObject(item).Field['message'];
.
.
.
.
//Download file
if (msgNode.Field['document'] <> nil) then
Begin
file_id := VarToStr(msgNode.Field['document'].Field['file_id'].Value);
FileName := VarToStr(msgNode.Field['document'].Field['file_name'].Value);
file_path := GetFile_Path(file_id);
if file_path <> '' then
DownloadFile(file_path,FileName);
End;
//Download file
if (msgNode.Field['photo'] <> nil) then
Begin
file_id := VarToStr(msgNode.Field['photo'].Child[msgNode.Field['photo'].Count-1].Field['file_id'].Value);
FileName := '';
file_path := GetFile_Path(file_id);
if file_path <> '' then
DownloadFile(file_path,FileName);
End;
End
تصاویر و فایل ها کنار فایل برنامه شما دانلود میشه
توجه داشته باشید کد با indy 10 نوشته شده شاید روی 9 هم کار کنه البته . تست نکردم .
یا علی
ایام بکام