C#およびYandex.APIのダイナミックDNS

今日、私のお気に入りの活動(子供の創造性の輪でArduinoをいじる)に加えて、サーバー(Windows 2012 r2)をインストールし、それをさまざまな操作に使用することにしました。 大量の情報を勉強したので、すべてが順調に進みました。



ローカルネットワークでの実験を終えたとき、「動的IPがある場合、どのようにして外部ネットワークからサーバーを確認できますか」という質問がありました。 繰り返しますが、世界的な知識の本が役立ち、DynDNS、no-ipなどのサービスが見つかりました。



登録後、プログラムをダウンロードする必要があることがわかりました(ルーターにダインの設定はありません)が、良心的な妄想として、サードパーティのソフトウェアをインストールするのは好きではありません。 Yandexに委任された第2レベルドメインを持っていることを思い出して、C#でソフトウェアを作成するための問題の側面を調査し始めました。



基礎として、 「Home-made Dynamic DNS」という記事を取り上げました。 APIにリクエストを送信するために、次のメソッドが作成されました。



static string GET(String getString) { HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(getString); request.Method = "GET"; String test = String.Empty; using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { Stream dataStream = response.GetResponseStream(); StreamReader reader = new StreamReader(dataStream); test = reader.ReadToEnd(); reader.Close(); dataStream.Close(); } return test; }
      
      





どういうわけか外部IPを取得する必要があり、DynDNSをまったく使用しないことしたのでcheckip.dyndns.orgページにアクセスしないことしました。 彼は同じYandexで検索を開始しました。 yandex.com/internetにgetリクエストを送信すると、そのようなリクエストに応答して興味深い行ipv4.internet.yandex.net/internet/api/v0/ipが見つかりました。私はその最も純粋な形の美しいIPを受け取りました。



トークンとIDがどこから来たのかを理解するには、基礎として取り上げた記事を参照してください。 したがって、次の行が形成されました。



  string ip = GET("http://ipv4.internet.yandex.net/internet/api/v0/ip").Trim('"'); string respons = GET("https://pddimp.yandex.ru/nsapi/edit_a_record.xml?token=" + token + "&domain=" + domain + " &subdomain=" + subdomain + "&record_id=" + id + "&content=" + ip);
      
      





最後に、なぜなら このビジネスはすべてサーバー上で動作するはずなので、稼働中のコンソールアプリケーションを再作成することにしました。 タイマーと以前のものと比較したIP変更のチェックが追加されました。



 using System; using System.ServiceProcess; using System.IO; using System.Net; using System.Timers; namespace DDNSyapi { public partial class Service1 : ServiceBase { String outIp = ""; Timer timer1; public const string token = "YOURTOKEN"; public const string domain = "YOURDOMAIN"; public const string subdomain ="UPDATINGSUBDOMAIN"; public const string id = "id"; //take token on pddimp.yandex.ru/get_token.xml?domain_name=YOURDOMAIN //take id on pddimp.yandex.ru/nsapi/get_domain_records.xml?token=YOURTOKEN&domain=YOURDOMAIN public Service1() { InitializeComponent(); } public static void Logs(string err) { StreamWriter txtIst = new StreamWriter(System.IO.Path.GetDirectoryName( System.Environment.GetCommandLineArgs()[0]) + "//IpServerLog_" + DateTime.Now.Year + DateTime.Now.Month + DateTime.Now.Day + ".txt", true); txtIst.WriteLine(DateTime.Now.ToString("HH:mm:ss") + " : " + err); txtIst.Close(); } protected override void OnStart(string[] args) { timer1 = new System.Timers.Timer(30 * 60 * 1000); timer1.Elapsed += timer1_Tick; timer1.Start(); timer1.Enabled = true; Logs(" "); } private void timer1_Tick(object sender, EventArgs e) { timer1.Enabled = false; try { string ip = GET("http://ipv4.internet.yandex.net/internet/api/v0/ip").Trim('"'); if (!ip.Equals(outIp)) { outIp = ip; string respons = GET("https://pddimp.yandex.ru/nsapi/edit_a_record.xml?token=" + token + "&domain=" + domain + " &subdomain=" + subdomain + "&record_id=" + id + "&content=" + ip); Logs(respons); } } catch { Logs("  .."); } timer1.Enabled = true; } static string GET(String getString) { HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(getString); request.Method = "GET"; String test = String.Empty; using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { Stream dataStream = response.GetResponseStream(); StreamReader reader = new StreamReader(dataStream); test = reader.ReadToEnd(); reader.Close(); dataStream.Close(); } return test; } protected override void OnStop() { timer1.Enabled = false; timer1.Stop(); timer1 = null; Logs(DateTime.Now.ToString("HH:mm:ss") + " - " + " "); } } }
      
      





現時点では、ログに大量の混乱を伴う新しいIPを書き込む際に、デバッグ後にまとめてコメントアウトするか、エラーエラータグで解析してから、APIからクリーンな応答を取得できます。 私はそれをしませんでした、なぜなら IPの変更は非常にまれであり、すべてがデバッグされると、APIエラーはほとんど発生しません。



したがって、外部IPを外部のリソースから取得するのではなく、ドメインを使用している同じ場所から、同じコードを任意のWindowsマシン(ホームコンピューターまで)で実行できます。 しかし、その後、私が言及した著者と同じように、IPチェックをやり直すことをお勧めします。別のファイルにIPを保存し、最後のIPを取り出して現在のファイルと比較することを勧めました。 サーバーの稼働時間が非常に長く、サービスを再起動してもoutIP変数が頻繁に消去されないため、これを行いませんでした。



それだけです。このソリューションが誰かに役立つことを願っています。 あなたのコメントと批判を待っています。



All Articles