電報ボット。 50 MBを超えるファイルをアップロードする



テレグラムボットを使用すると、多くのプロセスを自動化できます。 実際、 ボットは 1つのチャットに限定されるものではありません。 ボットは、 テキストに加えて、画像、ビデオ、オーディオ、ドキュメントなどのファイルを送受信することもできる単なる入出力インターフェースです。





この制限を回避する方法-カットの下で。



Telegram API



ユーザーは最大1.5GBのファイルをアップロードできるので(つまり、可能です)、このためにTelegramボットと連動するエージェント (ボットと混同しないように名前が付けられています)を作成します。 これには、個別のアカウントとTelegram APIが必要です。



まず、 https: //core.telegram.orgアクセスし、指示に従ってアプリケーションを登録します。最後に、 api_idapi_hashを取得する必要があります







エージェントは何をしますか?



ボットは50 MBを超えるファイルをアップロードできませんが、Telegramサーバーに既にアップロードされているファイルfile_idがあれば、送信できます。 アルゴリズムは次のとおりです



  1. Bot APIを介してサーバーで実行されるアプリケーションは、送信用のファイルを生成します
  2. エージェントを呼び出して、ファイルをTelegramサーバーにアップロードします
  3. エージェントからfile_idを取得します
  4. ダウンロードしたファイルを使用する


コード例



@AudioTubeBotの作成時に大きなファイルをダウンロードする必要が生じました。最初はオーディオファイルが複数の部分に分割されて送信されました。 大きなファイルをダウンロードする機能は、 subprocess.check_callを介して呼び出される別のアプリケーションに配置することが決定されました。



#!/usr/bin/env python3 # -*- coding: utf-8 -*- from telethon import TelegramClient from telethon.tl.types import DocumentAttributeAudio import mimetypes entity = 'AudioTube_bot' #  -    api_id = 1959 api_hash = '88b68d6da53fe68c1c3541bbefc' phone = '+79620181488' client = TelegramClient(entity, api_id, api_hash, update_workers=None, spawn_read_thread=False) client.connect() if not client.is_user_authorized(): # client.send_code_request(phone) #   - ,     FloodWait   client.sign_in(phone, input('Enter code: ')) client.start() def main(argv): file_path = argv[1] file_name = argv[2] chat_id = argv[3] object_id = argv[4] bot_name = argv[5] duration = argv[6] mimetypes.add_type('audio/aac','.aac') mimetypes.add_type('audio/ogg','.ogg') msg = client.send_file( str(bot_name), file_path, caption=str(chat_id + ':' + object_id + ':' + duration), file_name=str(file_name), use_cache=False, part_size_kb=512, attributes=[DocumentAttributeAudio( int(duration), voice=None, title=file_name[:-4], performer='')] ) client.disconnect() return 0 if __name__ == '__main__': import sys main(sys.argv[0:])
      
      





コメント:



これがコード全体です-Telethonライブラリはここで使用されます-起動時に、プログラムは送信するファイルへのパス、ファイル名、chat_id-ファイルの対象者)、エージェントを呼び出したボットの名前を受け取ります(たとえば、ボットとリリースボットがあります)。



client.send_file



アップロード経由でファイルをサーバーにアップロードし 、file_idを取得してボットに渡すだけでは機能しません。file_idは、作成されたチャット内でのみ機能します。したがって、ボットはfile_idでユーザーにファイルを送信できます- エージェントはこのファイルを送信する必要があります

-その後、ボットはこのファイルのfile_idを受け取り、破棄できるようになります。



caption = str(...)-ワット?!



エージェントはボットにのみファイルを送信し、キャプションにコメントを追加します-私はこれを持っています:









ボットコードでの呼び出し例



ファイルはロードのためにpath_file_mp3に既に保存されています 。サブルーチンを呼び出して、完了するのを待ちます。



コード
 status = subprocess.check_call( "python3.6 audiotubeagent36/main.py " + path_file_mp3 + ' ' + audio_title + '.'+ us_audio_codec + ' ' + str(chat_id) + ' ' + str(pool_object['_id']) + ' ' + config.BOT_NAME + ' ' + str(duration),shell=True)
      
      







受信トレイで、このようなことをします



コード
  if message.content_type in ['document','audio']: user_id = message.from_user.id bot_settings = SafeConfigParser() bot_settings.read(config.PATH_SETTINGS_FILE) c_type = message.content_type if functions.check_is_admin(bot_settings, user_id): if c_type == 'audio': file_id = message.audio.file_id audio_title = message.audio.title else: file_id = message.document.file_id audio_title = message.document.file_name[:-4] client_chat_id = message.caption if client_chat_id.find(u':') != -1: client_chat_id, q_pool_obj_id, duration_s = re.split(r':',client_chat_id) # file_id   q_pool.update_request_file_id(str(q_pool_obj_id), str(file_id)) #   bot.send_audio(int(client_chat_id), file_id,caption='', duration=int(duration_s), title=audio_title, performer='') return
      
      







質問/提案は、コメントまたはチャットに書き込みます



All Articles