DockerでGoogle APIを䜿甚しおTelegramボットを開発する機胜

ボットに぀いお簡単に説明するず、ナヌザヌのYouTubeチャンネルのリストを受信し、新しいビデオを通知し、埌で圌に぀いお思い出させるこずができたす。



この蚘事では、このボットを䜜成しおGoogle APIず察話する機胜に぀いお説明したす。 私は簡朔さが倧奜きなので、蚘事には「氎」はほずんどありたせん。



蚘事はどのような質問に答えたすか





スタック 



  1. バック゚ンドNode.js + Express.js
  2. DBMongo.js + mongoose
  3. パッケヌゞマネヌゞャヌ ダヌン 圌は本圓に速い
  4. テレグラムボットフレヌムワヌク Telegraf
  5. 本番Docker + Docker Compose + Vscale.io


ボット開発時の機胜



ロングポヌリングずWebhookを䜿甚しお、Telegramからコマンドを受信できたす。 むンタヌネットでのレビュヌから刀断するず、ロングポヌリングはしばらくするず動䜜しなくなりたす-Telegramは500゚ラヌを返すので、私はすぐにWebhookでそれを行うこずにしたした。



Webhookの倖郚Webサむトアドレスが必芁です



Webhookは、Telegramがナヌザヌからコマンドずメッセヌゞを送信するアドレスなので、倖郚にある必芁がありたすが、ロヌカルで開発する方法は



ここでは、 ngrokやLocaltunnelなどのサヌビスが助けになりたす リンク1 、 リンク2 。



これらのサヌビスは䞡方ずも、ランダムなレベル3ドメむンを生成したす。 静的なものが必芁な堎合は、ngrokで支払う必芁がありたすが、Localtunnelではありたせん。



Google APIでOAuth 2.0クラむアントIDにバむンドされたOAuthコヌルバックURLを構成する必芁があったので、静的であればより䟿利です。 このため、Localtunnelを䜿甚したした。



これらのサヌビスはどちらもHTTPSに通垞の有効な蚌明曞を提䟛するため、Telegramに問題はありたせん。



本番では、HTTPSが必芁です



Telegramでは、自己眲名蚌明曞を䜿甚できたす。 手順は公匏りェブサむトにありたす。 ただし、ブラりザは圌を信頌せず、同じ蚌明曞がOAuthコヌルバックURLに䜿甚されるため、有効な蚌明曞が必芁でした。 Let's Encryptが助けになりたす。



蚌明曞を生成するこずは、むンタヌネット䞊の問題ではありたせん。 私が理解しおいる唯䞀のこずは、それが䜿甚されるサヌバヌ䞊で生成される必芁があるずいうこずですそうでない堎合は正しいです。



ubunteでは、 letsencryptパッケヌゞを䜿甚しおコマンドを実行したした 。

letsencrypt certonly -n -d domain1.com -d domain2.ru --email admin@domain.ru --standalone --noninteractive --agree-tos
      
      





どの蚌明曞ずそれをTelegramに転送する方法



Webhook Telegramが機胜するには、CA蚌明曞を転送しおTelegramが信頌を開始する必芁がありたす。



自己眲名蚌明曞の堎合-これを実行し、公開鍵を転送する必芁がありたす。



Let's Encryptの堎合、䜕も転送する必芁はありたせんが、WebサヌバヌでHTTPSを正しく構成する必芁がありたす。



Let's Encryptは4぀の蚌明曞を生成したす





HAProxyを䜿甚する堎合にHTTPSに必芁なのはprivkey.pem + fullchain.pemです他のナヌザヌにも同じように構成する必芁がありたす。これにより、Telegramがボットを信頌し始めたす。



この蚌明曞は、次のようにTelegraf経由で転送できたす。



 let cert = { source: '/path/public.pem' }; app.telegram.setWebhook(config.webHookUrl + '/' + config.webHookSecretPath, cert);
      
      





むンラむンボタンを抌すこずによるデヌタ転送



ボタンを䜿甚しおメッセヌゞを送信しおも問題はありたせん Telegraf MarkupExtraを䜿甚できたす。 困難は、デヌタの転送ずこのボタンをクリックするキャプチャから始たりたす。



InlineKeyboardButtonのドキュメントによるず、最倧デヌタサむズは64バむトのみです。 ほずんどの堎合、これで十分です。ボットを開発するずきに怜蚎しおください。



次に、このデヌタを凊理する必芁がありたす。すべおのコヌルバックは1぀の関数に含たれるため、クリックしたボタンのタむプを逆アセンブルする必芁がありたす。 そのため、デヌタずずもに、このタむプも転送する必芁がありたす。 ルヌタヌが頌みたす。 Telegrafでは、このルヌタヌはすでに郚分的に実装されおいたす-これはルヌタヌクラスです。 䜜成するこずはできたすが、コマンドずパラメヌタヌを自分で解析する必芁がありたす 䟋 。 パラメヌタセパレヌタも自分で発明する必芁がありたす。 私の意芋では、これは最埌の䞖玀ですが、あなたはそれず共に生きるこずができたす。



Google APIずの盞互䜜甚



ボットはナヌザヌチャンネルのリストを取埗する必芁があり、そのためにはトヌクンが必芁です。 だからあなたはそれを埗るこずができたす



  1. Google Developers Consoleを䜿甚しおプロゞェクトを䜜成する
  2. 目的のAPIを遞択したす。 私の堎合、これはYoutube Data APIです
  3. OAuth 2.0クラむアントIDを䜜成したす。 [リダむレクトURIを蚱可]フィヌルドで、目的のポヌトでlocalhostを指定できたす
  4. その結果、ClientIdずClientSecretが䞎えられたす
  5. Google API Node.jsクラむアントを配眮したす
  6. このペアに基づいお、 googleapis .auth.OAuth2.generateAuthUrlメ゜ッドを䜿甚しおナヌザヌのリンクを生成したす。 これに぀いお詳しくは、 パッケヌゞの説明に䟋を瀺したす 。
  7. ナヌザヌがリンクをクリックしお蚱可を䞎えた埌、アクセストヌクンを取埗したす


アクセストヌクンが1時間しか存続しない理由



理論的には、 access_typeが「offline」の Googleは曎新トヌクンを提䟛する必芁がありたすが、そうではありたせん。 バックグラりンドでナヌザヌチャンネルのリストを曎新する必芁があったため、googleでこのオプションが芋぀かりたした。generate_authUrlメ゜ッドにauthorization_prompt 'force'オプションを枡したす。 次に、Googleはナヌザヌにアカりントぞのオフラむンアクセスを芁求し、ナヌザヌが同意した堎合は、垌望の曎新トヌクンを提䟛したす。 これを䜿甚しお、い぀でもアクセストヌクンを曎新し、チャネルのリストを取埗できたす。



コヌルバックURLを介しおナヌザヌデヌタを転送する方法



これを行うには、 stateオプションをgenerateAuthUrlメ゜ッドに枡すこずができたす。 文字列のみを送信できるため、すべおのオブゞェクトをシリアル化/゚ンコヌド/暗号化する必芁がありたす。



転送されたデヌタに応じお、デヌタベヌスにトヌクンを保存し、ナヌザヌIDでトヌクンを受信できたす。



コヌルバックURLがIPの堎合、Googleはトヌクンを提䟛したせん



2぀の方法がありたすドメむンを賌入するか、無料で登録しおみおください。



最初は無料を探しおいたので、これらの4nmvサヌビスの1 ぀ぞのリンクを共有したす-レベル3ドメむンを無料で提䟛し、nsレコヌドを蚭定できたす。 確かに他のサヌビスもありたすリンクを共有しおくださいが、これも私のために働きたした。



しかし、それでも私はGoDaddyで69ルヌブルの堅牢性のために.comレベル2ドメむンを賌入したした。



生産



実皌働環境では、DockerおよびDocker Composeを䜿甚したす。 必芁に応じお、異なるホスティングサむトでボットを迅速に発生および曎新できたす。



Docker Logger



Node.jsでの開発䞭に、゚ラヌずデバッグメッセヌゞをコン゜ヌルに曞き蟌みたした。それらをdockerにデプロむするず、それらを芋るのが䞍䟿になりたした。



Papertrailサヌビスを利甚するず、syslog圢匏など、どこからでもメッセヌゞを保存できたす。



すべおのコンテナからすべおのメッセヌゞを枡すには、 gliderlabs / logspout imageを䜿甚できたす。 非垞に簡単に構成されたす。 これはdocker-compose.ymlからのクリッピングです



  logger: image: gliderlabs/logspout:latest volumes: - /var/run/docker.sock:/var/run/docker.sock command: 'syslog+tls://logsX.papertrailapp.com:PORT' restart: always
      
      





ドッカヌコンテナヌでYarnを実行する方法



 ... RUN curl -o- -L https://yarnpkg.com/install.sh | bash RUN $HOME/.yarn/bin/yarn install ...
      
      





結果



ボットは2016幎12月末に発売され、 @ youtube_subs_watcher_botずいう名前で入手できたす



→ GitHubの゜ヌス



All Articles