こんばんは・・・
毎度おなじみガナリヤです!
今回は、NodeJsのクロスドメイン超えの話です。
初めての技術系ブログになるんですかね・・・
宣伝
現在、昔TNPにあったらしいICPC対策室なるものが、再び復活しようとしています。
活動内容としては、競技プログラミングを行い、実装力・アルゴリズム力をつけるというものです。
・・・正直、大学生からプログラミングを初めている身としては、アルゴリズムが世知辛いのじゃぁ〜
そんなこんなで、ICPU対策室復活に向けて、Discordの秋田大学ICPU対策室サーバーを立て、現在競技プログラミングを便利にするBotを製作中です。
問題
DiscordのBotはいろいろなプログラミング言語で作れますが、ガナリヤは現在Javascriptで記述しています。
Javascriptの特徴は何と言っても、クライアント側のブラウザで動くというところです。
最近では、NodeJsというサーバー側で実行するエンジンを使用することで、クライアント側だけでなく、サーバー側までJavascriptで制作出来るようになりました。
もしかしたら、世の中世知辛くないのかもしれないのじゃ・・・
そんなNodeJsとJavascriptで、HackerRankから、一ヶ月後までのコンテスト情報を取得するコマンドを作成しようとしていました。
HackerRankの情報はxml形式で取得できるため
- jQueryでxml形式で取得
- 取得したxml形式をxml2jsでJSON形式へ
- JSONからmomentを使って適切なコンテストのみ取得
という工程で行おうと思っていました・・・
事件発生
jQueryがガバガバでした。
おじさんが、jQueryで外部サイトの情報を取得しようとすると「それ以上はいけない」と、xmlが取得できませんでした。
取得できない理由はクロスドメイン問題にあります。
理想としては上のような状態です。
自分のクライアントとサーバーと、欲しい情報があるサーバーがそれぞれ通信できています。
しかし、最近のjQueryはクソみたいな発展を果たし(最近はほぼ使われなくなってきている)、他のサーバーとの通信が行えず、同じドメインしか通信できなくなりました。
これがクロスドメイン問題です。
改善策
改善策を色々と探した結果最初の改善策は以下のものでした。
1. phpファイルを利用してデータ取得のみをphpで行う。
2. 人力でxml形式を取得しておき、サーバーにためておく。
1の方法はうまく行きませんでした。理由としては、使用しているデプロイ先が基本的にjsのみであり上手に動作しなかったのが原因です。
2の方法は取りたくありませんでした。人力はクソ。さてはウンチだなおめー
結局・・・
npmモジュールでいいのないかなと探していたら、やっぱありました(最初からやr)
こちらのcheerioです。
クロスドメインも、モジュール内でいい感じにうまくやってくれているらしく、非常にありがたいですね・・・
コードは、きれいにしてからあげます・・・////
これもうわかんねえな
改行がうまくwordpress内でされないので改善したい。