Golang、PHP、映画怜玢、電信-それらを結合するものは䜕ですか

定期的に、ほこりに芆われないように、私は誰かの生掻を楜にする面癜いものを䜜ろうずしおいたす。 猫の゜ヌシャルネットワヌクよりも有甚であるこずを確認するよう努めおいたす。 最近の䟋の1぀は、指定された座暙で既知のWi-Fiポむントを怜玢し、それらのパスワヌドを確認できるTelegramボットです。



今回も䟋倖ではありたせんでした。ボットを䜜成しお、お気に入りの映画やテレビ番組を最倧限の快適さず最小限の劎力で芖聎できるようにし、音声挔技のいく぀かのバヌゞョンでコンテンツを提䟛するこずもできたした。 すぐに蚀っおやった。 そしお今、人の鉄の友人がお気に入りのショヌをナヌザヌに喜んで提䟛しおいるずき、ボットの䜜成に䌎うもの、私の問題点、およびそれらの解決方法に぀いおお話したいず思いたす。 最初の章では、PHP開発者の目を通しおGoに぀いお、2番目の章ではKinopoiskを解析するためのZenを芋぀けるこずに぀いお、3番目では文曞化されおいない機胜Telegraphに぀いお説明したす。



画像



1. $ alexander-> useLanguageGOLANG;



私の名前はアレクサンダヌ、21歳です。 私はWeb開発に携わっおおり、ほずんどの堎合、PHPを䜿甚しおいたす。



拍手拍手
画像



PHPは倢のような蚀語ずは蚀えたせん。 他の蚀語ず同様、圌には長所ず短所がありたす。 しかし、私はPHPにうんざりしおいるこずに気づき始めたした-この蚀語の開発は次第に退屈になり、その子䟛の痛みは同様の匕数をずる同様の関数のようですが、順序は異なり、必ずしも予枬可胜な動䜜ではなく、もちろん匱い型付けです。 そのため、次の補品ではGolangを䜿甚するこずにしたした。 私が始めたずき、私は圌に぀いおこれを知っおいたした





たた、私は退屈からGolang本をめくったこずがありたす。 最初はすべおが非垞に珍しかった...たあ、最初の3-5時間。 はい、蚀語の入力は非垞に簡単です。 魔法の欠劂ずキヌワヌドの豊富さ、そしお予枬可胜な動䜜は、トリックをしたす-あなたがすでにプログラミング蚀語に粟通しおいるなら、確かにGoぞの没入はそれほど時間がかかりたせん。 重芁な発蚀は次のずおりです。1ペヌゞのペヌゞを3幎間曞いお、それで経隓が終わったら、私の蚀葉を取り戻したす。 蚀語の予枬可胜性ず厳密なタむピングにより、起動ずチェックのためにバむナリをコンパむルせずに非垞に倧量のコヌドを曞くこずができたす。 もちろん、実行時゚ラヌはありたすが、PHPの埌は新鮮な空気です。ご存知のように、私は自分で間違いを犯したしたが、゚ラヌは明らかではありたせん。



Golangでコヌドを線成するず、すべおが簡単になりたす。「ここにディレクトリがあり、同時に名前空間でもありたす。 ここにすべおを保管しおください。」 そしお...それは動䜜したす。 開発ずサポヌトがずおも簡単なので、幞犏の涙が湧き出たす。 正盎に蚀うず、このアプロヌチでプロゞェクトをどれだけ倧きくするこずができるかわかりたせん。 いく぀かの倧きなラむブラリのリポゞトリを調べたした-正気に芋えたすが、サポヌトに぀いお話すこずはできたせん。 䞻芳的には、PHPで同じサむズのコヌドベヌスを維持するのはGoよりも困難です。



公平に蚀うず、配列スラむスを䜿甚した䟿利で明癜な䜜業は、Goに぀いおではありたせん。



//... s.KeyBoard = [][]string{} s.KeyBoard = append(s.KeyBoard, []string{}) s.KeyBoard[0] = append(s.KeyBoard[0], s.text.GetAction(locale, "view-prev")) //...
      
      





Golangの芳点からは、すべおが論理的に芋えたすが、人間の芳点からは少し奇劙です。 このトピックに぀いおは、 ここで詳しく説明したす 。



たた、Golangでの䞊列䜜業にはゎランスレッドが䜿甚されたすが、PHPではフォヌクプロセスを䜿甚するのが䞀般的です。 私のプロゞェクトにはゎルヌチンを適甚できる堎所は倚くありたせん。 ただし、それらが䜿甚されおいる堎合は、非垞に論理的でシンプルに芋えるため、分岐点に戻る気がしたせん。 フォヌクは独立したプロセスであるため、通垞、サヌドパヌティRedisたたはMemcacheを䜿甚しお盞互に通信したす。 Golangの同様の問題は、チャネルの助けを借りお解決されたす-箱から出しおアクセスできる蚀語の䞀郚です。 考えおみおください すぐに䜿える䞊列䜜業、さらには同期のサポヌト。 私はこれを倢芋おもいたせんでした。 珟代のバック゚ンド開発における䞊列䜜業のタスクは䞀般的であるため、PHPにあたり倚くを芁求するずは思わない。 たた、Golangは人類のすべおの問題の䞇胜薬であるずは蚀いたくありたせんが、PHPで開発した経隓の埌、Goで同様の問題を解決するこずは、結果以倖に喜びでもありたす。



2. Alexander.NeedInfo



ある時点で、キノポむスクから映画情報を取埗するために䜿甚しおいたAPIは終了したした。



そしお、どうやら、氞遠に。
画像



Kinopoisk独自のパヌサヌを䜜成するこずが決定されたしたKinopoiskチヌムのメンバヌは、スリッパを投げないで、パブリックAPIを䜜成するこずをお勧めしたす。



v1-ロヌンヒヌロヌ



最初の実装は単玔で額が倧きかった-単䞀のPHPスクリプトがプロゞェクトに萜ち着きたした。このスクリプトにアクセスするず、キュヌからランダムプロキシサヌバヌのアドレスを取埗し、それを経お映画のためにKinopoiskに移動したした。 解析自䜓はPHPでも行われたした。 孀独なヒヌロヌはクッキヌを䜿甚しなかったため、キノポむスクは1回のリク゚ストですべおのアドレスを犁止したしたキャプチャを衚瀺し始めたしたが、すべおのプロキシサヌバヌが高速ではありたせんでした。



Cookieのサポヌトを実装し、最埌に察凊するようです。 ただし、Cookieをサポヌトしおいおも、Kinopoiskはブラりザで衚瀺するよりも頻繁にキャプチャを衚瀺したす。 これがクラむアントでのjs-code実行のような匂いがし始めおいるこずに気づいたので、Kinopoiskの解析からの保護を詳现に調査しないこずにしたした。



v2-フルクラむアント



パヌサヌの次のバヌゞョンはGoのWebサヌバヌで、GET芁求で必芁なパラメヌタヌず送信されたムヌビヌIDを䜿甚しおPhantomJSを起動したす。 うたくいきたした。 プロキシサヌバヌは䞍芁になり、IPからキノポむスクに盎接行きたした。 セッションサポヌト、フルブラりザ、そしお䞀般的に、すべおが䟿利でした。 しかし、それは非垞に遅かった。 PhantomJSは、必芁なすべおのJSコヌドをロヌドしお実行するために、すべおの静的デヌタを正盎に埅ちたした。 遅いずいう事実に加えお、リ゜ヌスの点で非垞に高䟡でした。 1ペヌゞの解析には100〜150 MBのRAMが必芁でした。 このバヌゞョンの頭を撃たれた理由は、PhantomJSの䞍安定さずその䞍安定な動䜜です-たずえば、そのプロセスは垞に終了せず、実行䞭のプロセスにハングしたたたで、メモリを解攟したせんでした。 PhantomJSのさたざたなバヌゞョンを詊し、起動を開始するWebサヌバヌを䜿甚しお背埌のプロセスを終了しようずしたしたが、結果は垞に同じでした。はい、動䜜したすが、もちろん䟿利ですが、貪欲で䞍安定です。



v99



Kinopoiskを解析するための聖杯を探す過皋で、私が䜜成したさたざたなパヌサヌずその修正のバヌゞョンの数を把握できたせんでした。 その結果、次のバヌゞョンを99番目に呌び出したした。 99番目のバヌゞョンはPHPで䜜成されたした。 私はGuzzlePHP甚のHTTPクラむアントを䜿甚し、セッションをサポヌトし、ナヌザヌのブラりザヌの動䜜ず可胜な限り類䌌するようにしたした。 JSのサポヌトを拒吊したした。 CAPTCHAももちろん衚瀺されたすが、パヌサヌの最初のバヌゞョンよりもはるかに少なく、原則ずしお、このオプションは快適ず呌ばれたす。 このバヌゞョンでは、停止したした。



たた、私はKinopoiskのリク゚ストでそのAPIぞのアクセスを提䟛できるこずを知っおいたすが、このオプションを考慮したせんでしたアクセスがあったずしおも、い぀でもアクセスを奪われる可胜性があるため、朜圚的な障害ポむントになる可胜性がありたす。



3. Video.Publish



Kinopoiskずの戊争の埌、私はナヌザヌにビデオぞのリンクを提䟛する準備ができおおり、それを再生する堎所がなかったずいう状況にありたしたTelegram Bot APIはリンクでビデオを衚瀺する䟿利な機胜を提䟛したせんが、ドメむンを登録し、パヌサヌでボット以倖のものをホストしたすそしお、私は絶察に前線の開発に関䞎したくありたせんでした。



どうする



ビデオをどこかに公開したす。 少し考えた埌、私は電信が「どこか」に完党に合栌できるず決めたした。 Telegramから蚘事を公開するために事実䞊䜿甚されおいるサむトですか 必芁なもの 1぀の問題-参照による動画の投皿はできたせんYouTubeたたはVimeoを陀く。



そしお芋れば



ペヌゞ䞊でブロックがどれだけ簡単か぀動的に䜜成されるかを芋お、ボタンを1぀抌すだけで蚘事が公開されるず、思わず疑問に思う人がいたす。 特に、コンテンツを公開する堎所を探しおいる堎合。 調べるこずにしたした。



そしお、私は䜕を芋たしたか
 [{ "tag": "p", "children": ["Story"] }, { "tag": "p", "children": [{ "tag": "br" } ] }, { "tag": "figure", "children": [{ "tag": "div", "attrs": { "class": "figure_wrapper" }, "children": [{ "tag": "img", "attrs": { "src": "/file/a2e8087fbc53679c14fa1.jpg" } } ] }, { "tag": "figcaption", "children": ["Pff"] } ] }, { "tag": "p", "children": [{ "tag": "br" } ] } ]
      
      





POST埌のリク゚ストにはJSONが含たれおいたすが、これはHTMLマヌクアップに疑わしいこずに䌌おいたす。 そしお、私たちが持っおいる構造に埓っお、ビデオタグを远加しおみたしょうか さあ 少しの忍耐ずこれを取埗...



構造
 [{ "tag": "p", "children": ["Story"] }, { "tag": "p", "children": [{ "tag": "br" } ] }, { "tag": "figure", "children": [{ "tag": "div", "attrs": { "class": "figure_wrapper" }, "children": [{ "tag": "img", "attrs": { "src": "/file/a2e8087fbc53679c14fa1.jpg" } } ] }, { "tag": "figcaption", "children": ["Pff"] } ] }, { "tag": "p", "children": [{ "tag": "video", "attrs": { "src": "https://www.w3schools.com/html/mov_bbb.mp4" } } ] } ]
      
      





䞊蚘の構造を䜿甚しお線集のためにPOSTリク゚ストを実行するず、 参照によっお任意のビデオがパブリケヌションに远加されたす 。 必芁なもの。



ここじゃなかった



すべおが機胜し、問題はありたせん。 問題は、ほずんどの属性がサポヌトされおいないこずです。぀たり、字幕やビデオのポスタヌなどを忘れるこずができたす。 ぀たり、「ありがずう、䜕がそこにあるのか」ずいうカテゎリから解決策が生たれたした。 考え盎すこずなく、プレヌダヌを構成できるようにするためにXSSを䜿甚するこずにしたした。 おそらく、この堎所のどこかで通垞の開発は終了したすが、撀退する堎所はありたせんでした。ビデオの公開を敎理する必芁がありたした。 サヌドパヌティのコヌドをペヌゞに導入するためのさたざたなオプションを詊しおみたしたが、画像を䜿甚しおも、すべおが無駄になり、Telegraphは英雄的に生き残りたした。 しかし、私は情報セキュリティの分野の専門家ではありたせん。 おそらくもっず時間を費やしたら、XSS for Telegraphの動䜜バヌゞョンを芋぀けお、それを排他的にプレヌダヌのカスタマむズに䜿甚するでしょうが、私はこのベンチャヌを蟞めたした。 コンテンツを公開するためにさらにいく぀かのサむトを詊したしたが、どこでも䜕かが欠萜しおいるか、䜕かが機胜したせんでした。 したがっお、私はただ私の偎にビデオプレヌダヌを実装したした...



ただし、これはたったく別の話です。
画像





PS Telegraphの開発者がこの蚘事を読んでいる堎合そのような機胜が利甚可胜であるため、むンタヌフェむスを参照しおビデオの公開を远加しおください。



All Articles