Предупреждение: Все авторские права и сама статью принадлежат нашему форумчанину SooLFaa. Как и обещал публикую очередную статью нашего друга по форуму SooLFaa. Вечер в хату, Арестанты. Приветствую вас господа. Попросил меня мой хороший товарищ, значится, написать такую программулину, которая будет менять вёрстку в браузере на лету, дабы похвастаться перед друзьями сколько много у него денег на счету или обмануть каких - нибудь людей "взломом вк". Казалось бы, "Да чё нам стоит - дом построить", залез в исходный код элемента, нажал редактировать элемент, поменял в вёрстке на нужный элемент. Профит. Дело это, конечно, хорошее, но беда в том, что ничего из этого не выйдет и после перезагрузки страницы наш счет вернется на прежний. Что же давайте это поправим.... Итак, пишем собственного бота для работы со стороннем браузером на C# или прокси сервер. Надо ли говорить, что в ненадежных руках, эта штука, представляет серьезную опасность, поэтому сорцы будут чуток битые. Поехали. Открываем Visual Studio, создаем консольный проект. А далее устанавливаем следующий пакет. Code: Install-Package Titanium.Web.Proxy Как это сделать? Открываем Консоль диспетчера пакетов И в окне вводим команду выше. А далее всё просто. Пишем следующий код. Code: namespace ConsoleApplication1 { class Program { static void Main(string[] args) { ProxyServer proxy = new ProxyServer(); proxy.TrustRootCertificate = true; proxy.BeforeRequest -= OnRequest; // Подписываем методы запрос proxy.BeforeResponse -= OnResponse; // Подписываем методы ответа proxy.ServerCertificateValidationCallback -= OnCertificateValidation; // Получени сертификата для SSL proxy.ClientCertificateSelectionCallback -= OnCertificateSelection; // Создаем точки входа и исключения ExplicitProxyEndPoint explicitEndPoint = new ExplicitProxyEndPoint(IPAddress.Any, 8000, true); proxy.AddEndPoint(explicitEndPoint); proxy.Start(); var transparentEndPoint = new TransparentProxyEndPoint(IPAddress.Any, 8001, true) { GenericCertificateName = "google.com" }; proxy.AddEndPoint(transparentEndPoint); foreach (ProxyEndPoint endPoint in proxy.ProxyEndPoints) Console.WriteLine("Listening on '{0}' endpoint at Ip {1} and port: {2} ", endPoint.GetType().Name, endPoint.IpAddress, endPoint.Port); // Устанавливаем прокси proxy.SetAsSystemHttpProxy(explicitEndPoint); proxy.SetAsSystemHttpsProxy(explicitEndPoint); Console.Read(); proxy.BeforeRequest -= OnRequest; proxy.BeforeResponse -= OnResponse; proxy.ServerCertificateValidationCallback -= OnCertificateValidation; proxy.ClientCertificateSelectionCallback -= OnCertificateSelection; proxy.Stop(); } public static async Task OnRequest(object sender, SessionEventArgs e) { Console.WriteLine(e.WebSession.Request.Url); requestHeaders = e.WebSession.Request.RequestHeaders; var method = e.WebSession.Request.Method.ToUpper(); if ((method == "POST")) { byte[] bodyBytes = await e.GetRequestBody(); await e.SetRequestBody(bodyBytes); string bodyString = await e.GetRequestBodyAsString(); await e.SetRequestBodyString(bodyString); } } public static async Task OnResponse(object sender, SessionEventArgs e) { var responseHeaders = e.WebSession.Response.ResponseHeaders; if (e.WebSession.Request.Method == "GET" || e.WebSession.Request.Method == "POST") { // Если всё ок возвращаем ответ if (e.WebSession.Response.ResponseStatusCode == "200") { if (e.WebSession.Response.ContentType != null && e.WebSession.Response.ContentType.Trim().ToLower().Contains("text/html")) { byte[] bodyBytes = await e.GetResponseBody(); await e.SetResponseBody(bodyBytes); // если запрашиваем вконтакте if (e.WebSession.Request.Url.Contains("vk.com")) { //то изменяем верстку string body = e.GetResponseBodyAsString(); await e.SetResponseBodyString(body.Replace(@"<span class=""current_text"">W.E.L.C.O.M.E..</span>", @"<span class=""current_text"">Специально для Codeby</span>")); } else { string body = await e.GetResponseBodyAsString(); await e.SetResponseBodyString(body); } } } } } public static Task OnCertificateValidation(object sender, CertificateValidationEventArgs e) { if (e.SslPolicyErrors = System.Net.Security.SslPolicyErrors.None) e.IsValid = true; return Task.FromResult(0); } public static Task OnCertificateSelection(object sender, CertificateSelectionEventArgs e) { return Task.FromResult(0); } } } Меня просили пилить видосики к статьям, вот Вам видосик. Большое человеческое спасибо автору статей SooLFaa за разрешение публикации его статьи. Ждем от таких их же интересных статей в дальнейшем.
UserJS и кастомные CSS тоже могут это сделать. И изобретать велосипед не надо. Хотя конечно кто с чем работает тот так все и видит.
Эммм кастомные CSS?! Причем тут они? Задача была написать по факту прокси сервер. Чтобы любая тачка и любой браузер на лету мог видоизменять траффик. Это я приурочил как пример, в вкшке менял строку, а так идея куда глобальнее, чтобы с этим траффиком можно было в итоге программно работать ну и опять же кроссбраузерность.
Просьба к ТС только. Если форкаешь, то без уважаемых и дорогих друзей. На этом форуме есть люди, которые куда респектабельнее меня.
А в посте: Ну... менять верстку и менять траффик не совсем одно и то же. Greasemonkey и stylish есть практически для всех браузеров, а для которых нет - есть другие. А CSS и JS они в любом браузере одинаковы. Конечно с их помощью все не сделаешь, прокси более универсально, но опять таки - для простых примеров они лучше подходят из-за скорости разработки и проверки, нажал Ctrl+S в скрипте - и сайт перерисовался.