نقل قول: کار با API ربات تلگرام در دلفی 7
با درود و احترام خدمت دوستان گل
دریافت فایل توسط ربات تلگرام رو به درخواست دوستان براتون آماده کردم . این کد برای دریافت تصویر و فایل در قالب های 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 هم کار کنه البته . تست نکردم .
یا علی
ایام بکام
نقل قول: کار با API ربات تلگرام در دلفی 7
نقل قول:
نوشته شده توسط
mjdeveloper
من روی ارسال تصویر در تلگرام کار میکنم
کد زیر رو برای post کردن عکس زدم ولی جواب نمیده . خطای read timeout یا unsupported media type میده . اساتید لطفا کمک کنید
varIDUser : String;
Stream: TStringStream;
Params: TIdMultipartFormDataStream;
msg : WideString;
LHandler: TIdSSLIOHandlerSocket;
Src , boundry : string;
begin
API := edtAPI.Text;
IDUser := Edit1.Text;
Stream := TStringStream.Create('');
try
Params := TIdMultipartFormDataStream.Create;
try
//Params.AddFile('File1', 'C:\test.txt','image/png');
Params.AddFormField('chat_id',IDUser);
Params.AddFile('File1', 'E:\image.png','image/png');
//Data.CopyFrom(Params,0);
//Params.AddFormField(' test',',');
try
msg := '/sendPhoto';
LHandler := TIdSSLIOHandlerSocket.Create(nil);
//IdHTTP1.Request.ContentType := 'multipart/form-data';
IdHTTP1.ReadTimeout := 30000;
IdHTTP1.IOHandler:=LHandler;
LHandler.SSLOptions.Method := sslvTLSv1;
LHandler.SSLOptions.Mode := sslmUnassigned;
IdHTTP1.HandleRedirects := true;
IdHTTP1.Request.ContentType := 'multipart/form-data';
idhttp1.Request.SetHeaders;
memoResponse.Text :=idhttp1.Request.RawHeaders.Text;
memoRequest.Text := BaseUrl + API + msg;
IdHTTP1.Post(BaseUrl + API + msg, Params,Stream);
except
on E: Exception do
showmessage('Error encountered during POST: ' + E.Message+ ': '
+ intToStr(IdHTTP1.Response.ResponseCode))
end;
ShowMessage(Stream.DataString);
finally
Params.Free;
end;
finally
Stream.Free;
end;
کدتون غیر قابل فهمه
نقل قول: کار با API ربات تلگرام در دلفی 7
خیلی خیلی ممنونم دست شما دردنکنه
نقل قول: کار با API ربات تلگرام در دلفی 7
نقل قول:
نوشته شده توسط
SayeyeZohor
کدتون غیر قابل فهمه
این مشکل برای اوایل کار روی بات بود و حلش کردم.
نقل قول: کار با API ربات تلگرام در دلفی 7
با سلام و تشکر از آموزش بسیار کاربردی شما
فقط در حال حاضر که تلگرام فیل تر شده دسترسی به API ربات فقط از طریق چیز پی ان امکان پذیره، آیا راهی وجود داره که بشه توسط خود IdHTTP محدودیت رو رفع کرد؟؟ :متفکر:
نقل قول: کار با API ربات تلگرام در دلفی 7
نقل قول:
نوشته شده توسط
Amir Lajevardi
با سلام و تشکر از آموزش بسیار کاربردی شما
فقط در حال حاضر که تلگرام فیل تر شده دسترسی به API ربات فقط از طریق چیز پی ان امکان پذیره، آیا راهی وجود داره که بشه توسط خود IdHTTP محدودیت رو رفع کرد؟؟ :متفکر:
میتونین از پروکسی استفاده کنین.
نقل قول: کار با API ربات تلگرام در دلفی 7
نقل قول:
نوشته شده توسط
Mask
میتونین از پروکسی استفاده کنین.
ممنون میشم راهنمایی کنید از چه پروتکل پروکسی میشه در IdHTTP استفاده کرد؟
MTProto رو پشتیبانی میکنه؟
حالا مهم نیست سرویس رایگان هم باشه هر سرویسی که بشه استفاده کرد اگر معرفی کنید سپاسگزارم...
نقل قول: کار با API ربات تلگرام در دلفی 7
پروکسی خودش یک پروتکله. از همون استفاده کنین.
https
نقل قول: کار با API ربات تلگرام در دلفی 7
جهت گنجاندن Proxy داخلی برای سرویس می تواند مانند زیر عمل کنید
ProxyEnable: Boolean;
ProxyAuth: Boolean;
ProxyServer: String;
ProxyPort: String;
ProxyUsername: String;
ProxyPassword: String;
procedure TfmMain.FormCreate(Sender: TObject);begin
lblVersion.Caption := 'Version ' + Version;
LoadSetting;
if ProxyEnable Then
Begin
if ProxyPort = '' then ProxyPort := '0';
IdHTTP1.ProxyParams.BasicAuthentication := ProxyAuth;
IdHTTP1.ProxyParams.ProxyServer := ProxyServer;
IdHTTP1.ProxyParams.ProxyPort := StrToInt(ProxyPort);
IdHTTP1.ProxyParams.ProxyUsername := ProxyUsername;
IdHTTP1.ProxyParams.ProxyPassword := ProxyPassword;
IdHTTP2.ProxyParams.BasicAuthentication := ProxyAuth;
IdHTTP2.ProxyParams.ProxyServer := ProxyServer;
IdHTTP2.ProxyParams.ProxyPort := StrToInt(ProxyPort);
IdHTTP2.ProxyParams.ProxyUsername := ProxyUsername;
IdHTTP2.ProxyParams.ProxyPassword := ProxyPassword;
IdHTTP3.ProxyParams.BasicAuthentication := ProxyAuth;
IdHTTP3.ProxyParams.ProxyServer := ProxyServer;
IdHTTP3.ProxyParams.ProxyPort := StrToInt(ProxyPort);
IdHTTP3.ProxyParams.ProxyUsername := ProxyUsername;
IdHTTP3.ProxyParams.ProxyPassword := ProxyPassword;
End;