web-dev-qa-db-ja.com

電報ボットの奇妙なエラー:不正なリクエスト:間違ったファイル識別子/ HTTP URLが指定されました

ボットを使用して電報チャネルにメッセージを送信しています。

Webhookメソッドを使用します。

リンクからfile_idを送信しています。チャンネル投稿からfile_idを取得しました。

GIFやビデオ形式(MP4)などの一部のファイルについては、

このコードを使用すると:

$url = 'https://api.telegram.org/bot'.token.'/sendVideo?chat_id='.uid."&video=".$file."&caption="
.urlencode($caption);

file_get_contents($url);

私はそのようなこのエラーを受け取ります:

{"ok":false,"error_code":400,"description":"Bad Request: wrong file identifier/HTTP URL specified"}

なぜ私はこれを得るのか本当にわかりません、これはエラーに対してランダムです、コードは私が推測するものに依存しているためです。

チャンネルの投稿から取得したfile_idを使用します。

そのエラーの理由は何ですか? Bad Request:不適切なファイル識別子/ HTTP URLが指定されました

  • すべての関連トピックを検索しましたが、良い情報は見つかりませんでした。
15
Farzad

ドキュメント で説明されているように、これには多くの考えられる理由があります。

  • File_idで再送信する場合、ファイルタイプを変更することはできません。つまり、ビデオを写真として送信したり、写真をドキュメントとして送信したりすることはできません。
  • サムネイルを再送信することはできません。
  • File_idで写真を再送信すると、すべてのサイズが送信されます。
  • file_idはボットごとに一意であり、ボット間で転送することはできません。
12
ManzoorWani

あなたの所有者は here @farzad

file_idによる送信
file_idはボットごとに一意であり、ボット間で転送することはできません。

10

ファイル(写真、オーディオなど)をボットに転送すると、このファイル(ボット用)に有効なfile_idを取得できます。このIDを使用してファイルを送信しても安全ですが、一部のファイル(オーディオ、ビデオなど)では機能しないようです。 (Telegram APIのバグである可能性があります)。

ファイルをダウンロードしてボットに再アップロードし、新しいfile_idを取得すると、このIDが機能します。

1
Taha Jahangir

@ webpagebot に移動し、ファイルのURLを送信します。電報のキャッシュは無効になり、これは機能するはずです。サーバーのバグのようです。

私の場合、(ステッカーとして)画像をアップロードできませんでした、http://.../blabla.webpテレグラムアプリ経由ではなく、テレグラムボットAPI経由ではありません。

1
xamgore

mimeタイプの動画は正しくありません。変更してください

0
mamal

電報サーバーからURLが表示されないか、URLが正しくない場合、このエラーが発生しています。

また、マルチパートhtml postメソッドでこのURLにデータを送信することもできます({YourBotToken}と{your_channel_name_with_Atsign}の値を入力してください):

<form action="https://api.telegram.org/bot{YourBotToken}/sendVideo" method="POST" enctype="application/x-www-form-urlencoded">
<input type="file" name="video" />
<input type="hidden" name="chat_id" value="{your_channel_name_with_Atsign}" />
<button type="submit" >send</button>
</form>

c#のサンプルコードは次のとおりです:

 public bool sendVideo(string filename,string sendTo)
        {
            try
            {
                var botToken="{YourBotToken}";
                var sendTo="{your_channel_name_with_Atsign}";
                var filePath = "C:\\sample\\" + filename;

                var sendTo, ="@YourChannelNameWithAtSign";
                var bytesOfFile = System.IO.File.ReadAllBytes(filePath);
                var url = $"https://api.telegram.org/bot{botToken}/sendVideo";
                var res =Upload(url, sendTo, "video", bytesOfFile, filename).Result;

            }
            catch (Exception ex)
            {
                return false;
            }
            return true;
        }



        private static async Task<string> Upload(string actionUrl,string chat_id,string fileParamName, byte[] paramFileStream, string filename)
        {
            var formContent = new MultipartFormDataContent
            {
                {new StringContent(chat_id),"chat_id"},
                {new StreamContent(new MemoryStream(paramFileStream)),fileParamName,filename}
            };
            var myHttpClient = new HttpClient();
            var response = await myHttpClient.PostAsync(actionUrl.ToString(), formContent);
            string stringContent = await response.Content.ReadAsStringAsync();

            return stringContent;
        }

この方法では、ウェブサイトを用意する必要がなく、スタンドアロンシステムから使用できます。

0
Ali Rasouli