Что нового

Отправка photo через telegram api

CooleRnax

Новичок
Сообщения
2
Репутация
0
Здравствуйте, я пытаюсь реализовать отправку фото через telegram, там используется multipart/form-data, я очень долго мучаюсь с этим и все никак не могу заставить это работать, на данный момент остановился на этом решении. Оно выдает ошибку: The plain HTTP request was sent to HTTPS port. Я перепробовал уже около десятка подобных способов, ни один не смог заставить работать. Как изменить запрос для HTTPS? Или у кого-то есть другие реализации отправки данного POST запроса?

Документация Telegram для sendphoto
core.telegram.org/bots/api#sendphoto

Код:
$sLocalFile = "Game Icon.png" ;Local file
    $sHost = 'https://api.telegram.org' ;Upload page addresss
    $sFormAction = '/bot<chage to your api key>/sendPhoto?chat_id=<chage to your chat id>'
    $sFormName = 'photo'
    $sHostPort = 443
    
    $sResponse = _TCPFileUpload($sLocalFile, $sHost, $sHostPort, $sFormAction, $sFormName)


Func _TCPFileUpload($sLocalFile, $sHost, $sHostPort, $sFormAction, $sFormName)
    Local $sFileRead, $sFileType, $sBoundary, $sData, $iDataSize, $sHeader, $sCommand, $iSocket, $sRecv
    
    $sHost = StringRegExpReplace($sHost, '(?i)^https?://', '')
    
    $sFileRead = FileRead($sLocalFile)
    $sFileType = StringRegExpReplace($sLocalFile, '^.*\.', '')
    If $sFileType = 'jpg' Then $sFileType = 'jpeg'
    
    $sBoundary = StringFormat('----------------%s%s%smzF', @MIN, @HOUR, @SEC)
    
    $sData = '--' & $sBoundary & @CRLF & _
        'Content-Disposition: form-data; name="' & $sFormName & '"; filename="' & StringRegExpReplace($sLocalFile, '^.*\\', '') & '"' & @CRLF & _
        'Content-Type: image/' & $sFileType & @CRLF & @CRLF & _
        $sFileRead & @CRLF & '--' & $sBoundary & '--' & @CRLF
    
    $iDataSize = StringLen($sData)
    
    $sHeader = 'POST ' & $sFormAction & ' HTTP/1.1' & @CRLF & _
                'Host: ' & $sHost & @CRLF & _
                'Connection: close' & @CRLF & _
                'Content-Type: multipart/form-data; boundary=' & $sBoundary & @CRLF & _
                'Content-Length: ' & $iDataSize & @CRLF & @CRLF
    
    $sCommand = $sHeader & $sData
    
    TCPStartup()
    $iSocket = TCPConnect(TCPNameToIP($sHost), $sHostPort)
    TCPSend($iSocket, $sCommand)
    
    While 1
        $sRecv &= TCPRecv($iSocket, 20000)
        If StringLen($sRecv) <> 0 Then ExitLoop
        Sleep(50)
    WEnd
    
    TCPShutdown()
    Return $sRecv
EndFunc
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
используйте WinHTTP.WinHTTPRequest.5.1


Добавлено:
Сообщение автоматически объединено:

или WinHttp UDF
 
Автор
C

CooleRnax

Новичок
Сообщения
2
Репутация
0
Сделал новую функцию на основе WinHttp.au3
Спасибо за совет

Код:
Func Telegram_SendImage($FileToUploadPath, $TelegramToken, $TelegramChatID, $Caption = "")
	$sAddress = "https://api.telegram.org/bot"&$TelegramToken&"/sendPhoto" ; the address of the target  (https or http, makes no difference - handled automatically)

	If $Caption = "" Then
		$sForm = _
			'<form action="' & $sAddress & '" method="post" enctype="multipart/form-data">' & _
			'    <input type="text" name="chat_id" />' & _
			'    <input type="file" name="photo"/>' & _
			'</form>'
	Else
		$sForm = _
			'<form action="' & $sAddress & '" method="post" enctype="multipart/form-data">' & _
			'    <input type="text" name="chat_id" />' & _
			'    <input type="file" name="photo"/>' & _ ;
			'    <input type="text" name="caption"/>' & _ ;
			'</form>'
	EndIf

	; Initialize and get session handle
	$hOpen = _WinHttpOpen()

	$hConnect = $sForm ; will pass form as string so this is for coding correctness because $hConnect goes in byref

	If $Caption = "" Then
		; Fill form
		$sHTML = _WinHttpSimpleFormFill($hConnect, $hOpen, _
				Default, _
				"name:chat_id", $TelegramChatID, _
				"name:photo", $FileToUploadPath)
	Else
		; Fill form
		$sHTML = _WinHttpSimpleFormFill($hConnect, $hOpen, _
				Default, _
				"name:chat_id", $TelegramChatID, _
				"name:photo", $FileToUploadPath, _
				"name:caption", $Caption)
	EndIf

	If @error Then
		MsgBox(4096, "Error", "Error number = " & @error)
	Else
		ConsoleWrite($sHTML & @CRLF)
	EndIf

	; Close handles
	_WinHttpCloseHandle($hConnect)
	_WinHttpCloseHandle($hOpen)
EndFunc
 
Верх