Advertisement
Guest User

Untitled

a guest
Dec 13th, 2018
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.79 KB | None | 0 0
  1. using System;
  2. using System.IO;
  3. using System.Net;
  4. using System.Windows.Forms;
  5. using System.Text.RegularExpressions;
  6. using MySql.Data.MySqlClient;
  7. namespace Laba_6
  8. {
  9. public partial class Form1 : Form
  10. {
  11. public static int Count = 0;
  12. public Form1()
  13. {
  14. InitializeComponent();
  15. }
  16. public static string GetHtmlPage(string url) //Функция получения html кода
  17. страницы по ссылке
  18. {
  19. string HtmlText;
  20. Uri myUri = new Uri(url);
  21. HttpWebRequest myHttwebrequest = (HttpWebRequest)WebRequest.Create(myUri);
  22. HttpWebResponse myHttpWebresponse =
  23. (HttpWebResponse)myHttwebrequest.GetResponse();
  24. // ReSharper disable once AssignNullToNotNullAttribute
  25. StreamReader strm = new StreamReader(myHttpWebresponse.GetResponseStream());
  26. HtmlText = strm.ReadToEnd();
  27. return HtmlText;
  28. }
  29. private bool Get_News(string element) //Получает RSS ленту, обрабатывает ее и
  30. записывает в базу
  31. {
  32. string title;
  33. string link;
  34. string description;
  35. string date;
  36. string[] stitle = new[] { "<title>", "</title>" }; //разделители
  37. title = element.Split(stitle,
  38. StringSplitOptions.RemoveEmptyEntries)
  39. [1]; //записываем поле, как второй элемент массив разделенных строк (0 и
  40. 3 - пустые строки)
  41. string[] slink = new[] { "<link>", "</link>" }; //разделители
  42. link = element.Split(slink, StringSplitOptions.RemoveEmptyEntries)[1];
  43. string[] sdescription = new[] { "<description>", "</description>" };
  44. //разделители
  45. description = element.Split(sdescription,
  46. StringSplitOptions.RemoveEmptyEntries)[1];
  47. //использование регулярных выражений для отсеивания мусора
  48. string regex = "(<i)[^а-яА-Я]*(/>)";
  49. description = Regex.Replace(description, regex, String.Empty);
  50. regex = @"(![^а-яА-Я]*\[)";
  51.  
  52. description = Regex.Replace(description, regex, String.Empty);
  53. regex = @"<?br>";
  54. description = Regex.Replace(description, regex, " ");
  55. regex = @"\s*<\s*[^а-яА-Я]+>?";
  56. description = Regex.Replace(description, regex, String.Empty);
  57. regex = @"\s*<\s*";
  58. description = Regex.Replace(description, regex, String.Empty);
  59. regex = @"\s*]]>\s*";
  60. description = Regex.Replace(description, regex, String.Empty);
  61. regex = "&[^а-яА-Я]*;";
  62. description = Regex.Replace(description, regex, String.Empty);
  63. string[] sdate = new[] { "<pubDate>", "</pubDate>" };
  64. date = element.Split(sdate, StringSplitOptions.RemoveEmptyEntries)[1];
  65. //запись в текстбокс
  66. richTextBox1.Text +=
  67. title + "\n" + date + "\n" + description + "\n" + link + "\n" + "\n";
  68. //вывод на экран
  69. label4.Text = "Попытка записи в БД...";
  70. //процесс записи в БД
  71. //строка подключения к БД
  72. string connStr =
  73. "server=localhost;user=root;database=people;password=password; CharSet=utf8";
  74. //создвем объект для подключения к БД
  75. MySqlConnection conn = new MySqlConnection(connStr);
  76. //устанавливаем соединение с БД
  77. try
  78. {
  79. conn.Open();
  80. }
  81. catch
  82. {
  83. label4.Text = "Не удалось подключиться к БД";
  84. return false;
  85. }
  86. string sql; //строка запросов
  87. MySqlCommand command;
  88. if (Count == 0) //если первый запуск, то надо удалить базу и обнулить
  89. автоинкремент
  90. {
  91. sql = "DELETE FROM rss WHERE 1";
  92. command = new MySqlCommand(sql, conn);
  93. command.ExecuteNonQuery();
  94. sql = "ALTER TABLE rss AUTO_INCREMENT=0";
  95. command = new MySqlCommand(sql, conn);
  96. command.ExecuteNonQuery();
  97. }
  98. //Вставка в БД
  99. sql = "INSERT INTO rss(name1, data1, ds, hl) VALUES('" + title + "', '" +
  100. date + "', '" + description + "', '" + link + "')";
  101. command = new MySqlCommand(sql, conn);
  102. command.ExecuteNonQuery();
  103. return true;
  104. }
  105. private void button1_Click(object sender, EventArgs e) //получить новости (в
  106. первый раз)
  107. {
  108. Count = 0; //считает вывод новостей (спасает от переполнения окна)
  109. richTextBox1.Text = String.Empty; //очистка окна
  110.  
  111. label3.Text = "Выполняется запрос. Пожалуйста, подождите...";
  112. bool bd = true; //определяет, открыта ли бд
  113. bool ik = true; //определяет есть ли интернет соединение
  114. string rss = String.Empty; //содержит код страницы
  115. try
  116. {
  117. rss = GetHtmlPage(textBox1.Text); //берет код по ссылке
  118. }
  119. catch
  120. {
  121. richTextBox1.Text = String.Empty; //очистка окна
  122. label3.Text = "Отсутствует интернет подключение либо ссылка введена
  123. неверно";
  124. ik = false;
  125. }
  126. if (ik != true) return; //если нет интернета то стоп
  127. string[] snews = new[] { "<item>", "</item>" }; //разделители
  128. string[] news = rss.Split(snews, StringSplitOptions.RemoveEmptyEntries);
  129. //делит код страницы на отдельные новости
  130. foreach (string element in news) //перебираем все новости
  131. {
  132. //проверяет количество новостей
  133. try
  134. {
  135. if ((Count == Convert.ToInt32(textBox2.Text)) ||
  136. (Convert.ToInt32(textBox2.Text) == 0)) break;
  137. }
  138. catch
  139. {
  140. return;
  141. }
  142. //попытка получения новости
  143. try
  144. {
  145. bd = Get_News(element);
  146. }
  147. catch
  148. {
  149. continue;
  150. }
  151. Count++;
  152. }
  153. if (bd == true) label4.Text = "Запись в БД прошла успешно";
  154. label3.Text = "Новости получены успешно";
  155. }
  156. private void textBox2_KeyPress(object sender, KeyPressEventArgs e) //позволяет
  157. ограничить ввод только цифрами и Backspace
  158. {
  159. char number = e.KeyChar;
  160. if (!Char.IsDigit(number) && number != 8)
  161. {
  162. e.Handled = true;
  163. }
  164. }
  165.  
  166. private void textBox3_KeyPress(object sender, KeyPressEventArgs e) //позволяет
  167. ограничить ввод только цифрами и Backspace
  168. {
  169. char number = e.KeyChar;
  170. if (!Char.IsDigit(number) && number != 8)
  171. {
  172. e.Handled = true;
  173. }
  174. }
  175. private void button2_Click(object sender, EventArgs e) //получить больше новостей
  176. {
  177. int k = 0; //счетчик новостей от текущей новости
  178. richTextBox1.Text = String.Empty; //очистка окна
  179. label3.Text = "Выполняется запрос. Пожалуйста, подождите...";
  180. bool bd = true; //определяет, открыта ли бд
  181. bool ik = true; //определяет есть ли интернет соединение
  182. string rss = String.Empty; //содержит код страницы
  183. try
  184. {
  185. rss = GetHtmlPage(textBox1.Text); //берет код по ссылке
  186. }
  187. catch
  188. {
  189. richTextBox1.Text = String.Empty; //очистка окна
  190. label3.Text = "Отсутствует интернет подключение либо ссылка введена
  191. неверно";
  192. ik = false;
  193. }
  194. if (ik != true) return; //если нет интернета то стоп
  195. string[] snews = new[] { "<item>", "</item>" }; //разделители
  196. string[] news = rss.Split(snews, StringSplitOptions.RemoveEmptyEntries);
  197. //делит код страницы на отдельные новости
  198. foreach (string element in news) //перебираем все новости
  199. {
  200. //проверяет количество новостей
  201. try
  202. {
  203. if ((k == Count + Convert.ToInt32(textBox3.Text)) ||
  204. (Convert.ToInt32(textBox3.Text) == 0)) break; //спасает от переполнения
  205. }
  206. catch
  207. {
  208. return;
  209. }
  210. //пропуск уже показанных новостей
  211. if (k < Count)
  212. {
  213. k++;
  214. continue;
  215. }
  216. //попытка получения новости
  217. try
  218. {
  219. bd = Get_News(element);
  220. }
  221. catch
  222. {
  223.  
  224. continue;
  225. }
  226. k++;
  227. }
  228. if (bd == true) label4.Text = "Запись в БД прошла успешно";
  229. label3.Text = "Новости получены успешно";
  230. Count += k; //увеличивает count для повторного использования кнопки
  231. }
  232. private void richTextBox1_LinkClicked(object sender, LinkClickedEventArgs e)
  233. //позволяет открывать ссылки из текстбокса
  234. {
  235. System.Diagnostics.Process.Start(e.LinkText);
  236. }
  237. }
  238. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement