Вопрос автозаполнения форм

Vodemart

Client
Регистрация
26.11.2021
Сообщения
47
Благодарностей
7
Баллы
8
Всем привет
Подскажите плиз- допустим я беру сотни ссылок с разных сайтов, в них необходимо заполнять рандомно формы, кроме мыл, мыла я буду указывать свои
По какой логике создать шаблон? Какие кубики использовать? Движки сайтов и формы заполнения везде разные
109802
109803
109804
109805


В какую сторону мне смотреть вообщем?
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 641
Баллы
113
например, для каждого поля собирать список путей xPath, а потом перебирать этот список и по каждому пути искать поле. То еще удовольствие
 

Deisler

Client
Регистрация
26.10.2019
Сообщения
486
Благодарностей
190
Баллы
43
Я бы составил относительно универсальный xPath под каждое поле. Нас интересует элемент input, у которого в одном из вложенных элементов будет innerText = 'First Name'

Соответственно пробуем такой xPath //*[contains(text(),'First Name')]//ancestor::input[1] - не тестировал, но логику построения xPath передал
Вышенаписанный xPath по идее должен отработать и найти input, внутри которого написано 'First Name', но не найдет input, внутри которого написано 'First name' и тем более если там написано 'Your name'

Соответственно ваш xPath будет расширяться через логическое ИЛИ что бы включать в себя все варианты, которые вы соберете только со временем опытным путем.

Итоговый вариант xPath для тех вариантов, которые мы видим на скринах скорее всего будет выглядеть так
//*[contains(text(),'First Name')]//ancestor::input[1] | //*[contains(text(),'First name')]//ancestor::input[1] | //*[contains(text(),'Yuor name')]//ancestor::input[1]

xPath пишу на коленке и не тестировал. Я вам именно показываю логику, которой бы я руководствовался при выполнении этой задачи
 
Последнее редактирование:
  • Спасибо
Реакции: Vodemart

usboff

Client
Регистрация
25.08.2021
Сообщения
87
Благодарностей
48
Баллы
18
Нашел в закромах времён поиска форм обратной связи для рассылки спама, возможно кому-то будет полезен данный код :-):


Поиск форм:
var tab = instance.ActiveTab;
//project.Variables["html"].Value = tab;

if (tab.IsBusy) tab.WaitDownloading();

List < HtmlElement > forms = tab.FindElementsByTags("form").ToList();

var domain = project.Variables["domain"].Value;

forms.ForEach(f =>{
   
if(project.Variables["good"].Value!="1"){  
       
  string NUrl = System.Net.WebUtility.HtmlDecode(project.Variables["url"].Value);

  NUrl = forms.IndexOf(f).ToString() + "|" + NUrl;
  if (forms.IndexOf(f) >= 10) {
    throw new Exception("Слишком много форм на странице. Перешли к следующему.");
  }
  if (f.Width > 0 && f.Height > 0) { //форма видимая на странице, значит с ней можно работать
    bool isMail = false;
    bool isTextArea = false;
    bool isCaptchaForms = false;
    bool isReCaptchaSites = false;
    bool isReCaptchaForms = false;
    bool isSendCopy = false;
    bool isFirewallForms = false;
    bool isCommentForms = false;

    f.FindChildrenByTags("input;label").ToList().ForEach(i =>{
      if (Regex.IsMatch(i.OuterHtml, "(?i)(mail|pochta|почта|мейл|мэйл|from)")) {
        isMail = true;
        //project.SendInfoToLog("ЧЕК ПОИНТ ", true);
      }

    });
   
    if (isMail) {

      project.SendInfoToLog("На форме присутствует input или label с признаком email", true);
      lock(SyncObjects.ListSyncer) {
        project.Lists["emailForms"].Add(NUrl);
      }

      if (f.FindChildrenByTags("textarea").Count > 0) { //проверить на форме тег textarea
        isTextArea = true;
        lock(SyncObjects.ListSyncer) {
          project.Lists["textAreaForms"].Add(NUrl);
        }
        project.SendInfoToLog("Форма содержит textarea", true);
      }
      if (Regex.IsMatch(tab.DomText, "(?i)(recaptcha|re-captcha)")) {
        isReCaptchaSites = true;
        project.SendInfoToLog("Сайт содержит ReCaptcha", true);
        lock(SyncObjects.ListSyncer) {
          project.Lists["ReCaptchaSites"].Add(NUrl);
        }
      }
      if (Regex.IsMatch(f.InnerHtml, "(?i)(recaptcha|re-captcha)")) { //проверяем признаки капчи
        isReCaptchaForms = true;
        lock(SyncObjects.ListSyncer) {
          project.Lists["ReCaptchaForms"].Add(NUrl);
        }
        project.SendInfoToLog("Форма содержит ReCaptcha", true);
      }
      if ((Regex.IsMatch(f.InnerHtml, "(?i)(capt(cha|ture))")) && !(isReCaptchaForms) && !(isReCaptchaSites)) { //проверяем признаки капчи
        isCaptchaForms = true;
        lock(SyncObjects.ListSyncer) {
          project.Lists["captchaForms"].Add(NUrl);
        }
        project.SendInfoToLog("Форма содержит каптчу", true);
      }
      if ((Regex.IsMatch(f.InnerHtml, "(?i)(copy)")) && !(Regex.IsMatch(f.InnerHtml, "(?i)(copyw|copyr)"))) { //проверяем признаки капчи
        isSendCopy = true;
        lock(SyncObjects.ListSyncer) {
          project.Lists["SendCopyForms"].Add(NUrl);
        }
        project.SendInfoToLog("Форма содержит checkbox отправки копии", true);
      }
      if ((Regex.IsMatch(f.InnerHtml, "(?i)(validat)")) && !(Regex.IsMatch(f.InnerHtml, "(?i)(gform_validation_container)"))) {
        //isFirewallForms = true;
        lock(SyncObjects.ListSyncer) {
          project.Lists["firewallForms"].Add(NUrl);
        }
        project.SendInfoToLog("Форма содержит валидацию форм", true);
      }
      if (Regex.IsMatch(tab.DomText, "(?i)(Leave a Comment|Leave a Reply)")) {
        isCommentForms = true;
        lock(SyncObjects.ListSyncer) {
          project.Lists["commentSites"].Add(NUrl);
        }
        project.SendInfoToLog("Попалась сайт с формой комментариев", true);
      }

      if ((isTextArea) && !(isReCaptchaSites) && !(isReCaptchaForms) && !(isCaptchaForms) && (isSendCopy) && !(isFirewallForms) && !(isCommentForms)) {
        lock(SyncObjects.ListSyncer) {
          project.Lists["veryGood_checkbox"].Add(NUrl);
        }
        project.Variables["good"].Value = "1";
        project.SendToLog("Нашли форму с EMAIL,TEXTAREA,CHECKBOX без каптчи и без ReCaptcha на сайте! :)", ZennoLab.InterfacesLibrary.Enums.Log.LogType.Info, true, ZennoLab.InterfacesLibrary.Enums.Log.LogColor.Green);
      }

      if ((isTextArea) && !(isReCaptchaSites) && !(isReCaptchaForms) && !(isCaptchaForms) && !(isSendCopy) && !(isFirewallForms) && !(isCommentForms)) {
        lock(SyncObjects.ListSyncer) {
          project.Lists["veryGood_NOcheckbox"].Add(NUrl);
        }
        project.Variables["good"].Value = "1";
        project.SendInfoToLog("Нашли форму с EMAIL,TEXTAREA без каптчи,ReCaptcha,checkbox на сайте! :|", true);
      }

      /*if ((isMail) && (isTextArea) && !(isCaptcha) && !(isReCaptchaForms) ){
                project.Lists["noCaptchaForms"].Add(NUrl);//форма без каптчи
                project.SendInfoToLog("Нашли форму без каптчи!", true);
            }

            if ( (isMail) && (isTextArea) && !(isCaptcha) && !(isReCaptchaSites)  && !(isReCaptchaForms) ){
                project.Lists["veryGood_NOcheckbox"].Add(NUrl);
                project.Lists["veryGood_url"].Add(project.Variables["url"].Value);
                project.SendToLog("Нашли форму с email,textarea без каптчи и ReCaptcha на сайте! :)", ZennoLab.InterfacesLibrary.Enums.Log.LogType.Info, true, ZennoLab.InterfacesLibrary.Enums.Log.LogColor.Green);
            }*/

    }
    else {
      project.SendInfoToLog("empty O_o", true);
    }
  }
}
});
 
Последнее редактирование:
  • Спасибо
Реакции: Vodemart и Deisler

usboff

Client
Регистрация
25.08.2021
Сообщения
87
Благодарностей
48
Баллы
18
Гулять так гулять, вот и рассыльщик, довольно универсальный :D

C#:
Random rand = new Random();

lock(SyncObjects.ListSyncer) //Лочим для много потока
{ var list = project.Lists["proxy"];
project.Variables["proxy"].Value = list[0];
list.RemoveAt(0);   
list.Add(project.Variables["proxy"].Value);}

instance.SetWindowSize(1280,1024);
instance.SetProxy(project.Variables["proxy"].Value);
instance.AllowPopUp = false;
instance.UseCSS = false;
instance.DownloadFrame = false;
instance.LoadPictures = false;
instance.UseAdds = false;

lock(SyncObjects.ListSyncer) //Лочим для много потока
{ var list = project.Lists["veryGood"];
project.Variables["NUrl"].Value = list[0];
list.RemoveAt(0);   
list.Add(project.Variables["NUrl"].Value);
}

string NUrl = project.Variables["NUrl"].Value;

List<char> nu = NUrl.ToArray()
    .ToList();
int N = int.Parse(
    nu.Where(
    c=>nu.IndexOf(c)<nu.IndexOf('|')
    ).First(
    ).ToString()
    );

string url = nu.Where(
    c=>nu.IndexOf(c)>nu.IndexOf('|')
    )
    .Aggregate("",(bef,af)=>bef.ToString()+af.ToString());

var tab = instance.ActiveTab;

string http = url.Substring(0, 4);

if(http=="http"){
string domain = new Uri(url).Host;
var domains = new []{domain};
instance.SetContentPolicy("WhiteList", domains, null);
}
else{
    int offset=url.IndexOf("/",0);
    string domain= url.Substring(0,offset+1);
}

project.Variables["url"].Value = url;

tab.Navigate(url);
System.Threading.Thread.Sleep(500);
tab.WaitDownloading();

HtmlElement hes = instance.ActiveTab.FindElementByTag("form",N);
var k = 0;
while (hes.IsVoid && k < 15) {
System.Threading.Thread.Sleep(rand.Next(500, 1000));
hes = instance.ActiveTab.FindElementByTag("form",N);
k++;
}
if (hes.IsVoid) throw new Exception("За 15 попыток не смогли найти необходимую форму!"); // их всегда


int code = rand.Next(900,999); int num = rand.Next(000,999); int num2 = rand.Next(0,99);int num3 = rand.Next(0,99);
int countrycode = rand.Next(0,999);
project.Variables["phone"].Value = countrycode + code.ToString() + num.ToString() +  num2.ToString() + num3.ToString();
//project.Variables["phone"].Value = "7" + code.ToString() + num.ToString() +  num2.ToString() + num3.ToString();

string text = project.ExecuteMacro(project.Variables["spintax_mess"].Value);
project.Variables["message"].Value = Macros.TextProcessing.Spintax(text, false);

lock(SyncObjects.ListSyncer) //Лочим для много потока
{
var list = project.Lists["domain"];
project.Variables["domain"].Value = list[0];
list.RemoveAt(0);
list.Add(project.Variables["domain"].Value);

int count = rand.Next(5, 30);
string rand_link = string.Empty;
int r;
char[] chars = "abcdefghijklmnopqrstuvwxyz0123456789".ToCharArray();
for (int j = 0; j < count; j++) {
    r = rand.Next(chars.Length);
    rand_link += chars[r];
}
project.Variables["link"].Value = project.Variables["domain"].Value + "/" +  rand_link;
}   
    
string link = project.Variables["link"].Value;
project.Variables["message"].Value = project.Variables["message"].Value.Replace("URL", link);

text = project.ExecuteMacro(project.Variables["spintax_subj"].Value);
project.Variables["subject"].Value = Macros.TextProcessing.Spintax(text, false);

lock(SyncObjects.ListSyncer) //Лочим для много потока
{
    int number = rand.Next(1, 3);
    string fio;

    if (number == 1 ) {
        number = rand.Next(0, project.Lists["muj_fam"].Count - 1);
        var muj_fam = project.Lists["muj_fam"][number];
        number = rand.Next(0, project.Lists["muj_imya"].Count - 1);
        var muj_imya = project.Lists["muj_imya"][number];
        number = rand.Next(0, project.Lists["muj_otch"].Count - 1);
        var muj_otch = project.Lists["muj_otch"][number];
        project.Variables["fio"].Value = muj_fam + " " + muj_imya + " " + muj_otch;
    }
    else{
        number = rand.Next(0, project.Lists["jen_fam"].Count - 1);
        var jen_fam = project.Lists["jen_fam"][number];
        number = rand.Next(0, project.Lists["jen_imya"].Count - 1);
        var jen_imya = project.Lists["jen_imya"][number];
        number = rand.Next(0, project.Lists["jen_otch"].Count - 1);
        var jen_otch = project.Lists["jen_otch"][number];
        project.Variables["fio"].Value = jen_fam + " " + jen_imya + " " + jen_otch;
    }
}

lock(SyncObjects.ListSyncer) //Лочим для много потока
    {
    var list = project.Lists["email"];
    project.Variables["email"].Value = list[0];
    list.RemoveAt(0);
    list.Add(project.Variables["email"].Value);
}
//////////////// БЕРЁМ ТЕМЫ И СООБЩЕНИЕ ИЗ ФАЙЛА//////////////////
    lock(SyncObjects.ListSyncer) //Лочим для много потока
    {
    var list = project.Lists["mess"];
    project.Variables["message"].Value = list[0];
    list.RemoveAt(0);
    string mess = project.Variables["message"].Value;
    list.Add(mess);
    project.Variables["message"].Value = project.Variables["message"].Value.Replace("URL", link);
    }


    lock(SyncObjects.ListSyncer) //Лочим для много потока
    {
    var list = project.Lists["subj"];
    project.Variables["subject"].Value = list[0];
    list.RemoveAt(0);
    string subject = project.Variables["subject"].Value;
    list.Add(subject);
    }
//////////////// БЕРЁМ ТЕМЫ И СООБЩЕНИЕ ИЗ ФАЙЛА//////////////////

    

//string name = project.Variables["fio"].Value;
string name = project.Variables["email"].Value;
    
string phone = project.Variables["phone"].Value;
string mail = project.Variables["email"].Value;
string message = project.Variables["message"].Value;
string subj= project.Variables["subject"].Value;   

string isName = "(?i)(name|имя)";//первым, т.к. name присутствует в outerHtml у всех инпутов
string isPhone="(?i)(tel|phone|fone)";
string isSubject="(?i)(subj|subject|t(h|)em(e|a)|тема|заголовок)";
string isMail="(?i)(m(a|e)il|po(4|ch)ta|почт)";//это всегда последним, т.к. email может случайно заполниться, а его обязательно указать верным
string isMessage="textarea";
    List<string> regs = new List<string>{
    isName,isPhone,isMail,isSubject,isMessage
};
Dictionary<string,string> regval = new Dictionary<string,string>();
regval.Add(isName,name);
regval.Add(isPhone,phone);
regval.Add(isMail,mail);
regval.Add(isSubject,subj);
regval.Add(isMessage,message);

Func<HtmlElement,string,bool> Check = (h,reg) =>
{
    bool output = false;//пока в начале не найдено соответствий
    string outer = h.OuterHtml;                        //сам инпут
        //project.SendInfoToLog(outer, true);
    var parent1 = h.ParentElement;                    //родитель
        //string parent11=Convert.ToString(parent1);
        //project.SendInfoToLog(parent11, true);
    var parent2= parent1.ParentElement;        //следующий родитель
        //string parent22=Convert.ToString(parent2);
        //project.SendInfoToLog(parent22, true);
    if(parent1.TagName=="label"||(parent1.FindChildrenByTags("label").Count>0
        &&parent1.FindChildrenByTags("input").Count==1)) //ищем тег label
        outer+=parent1.OuterHtml;                   
    if(parent2.TagName=="label"||(parent2.FindChildrenByTags("label").Count>0&&                    //и у второго родителя тоже
        parent2.FindChildrenByTags("input").Count==1     //смотрим что не попал еще один инпут
        ))                                             //что мы не ушли в область другого поля ввода
        outer+=parent2.OuterHtml;
    if(Regex.IsMatch(outer,reg,RegexOptions.IgnoreCase))
        output = true; //нашли соответствие
    return output;
};

Action<HtmlElement,string> SetValue = (h,val) =>
{
    h.Focus();
    h.Click();
    h.SetValue("", "none", true);
    h.SetValue(val, "none", true);
};

HtmlElement form = instance.ActiveTab.FindElementByTag("form",N);
regs.ForEach(reg=>
{
    form.FindChildrenByTags("input;textarea").ToList().ForEach(i=>
    {
        if(i.GetAttribute("type") != "submit" && i.GetAttribute("type") != "hidden") //пропускаем кнопки
        {
            if(Check(i,reg)) //если совпало
                SetValue(i,regval[reg]);//заполняем   
        }
    });   
});

/////////// ЗАТИРАНИЕ ПРОВЕРОЧНЫХ ПОЛЕЙ ПО ВХОЖДЕНИЮ CLASS РАДИТЕЛЯ ////////////

HtmlElementCollection he = instance.ActiveTab.FindElementsByXPath("//li[contains(@class, 'gform_validation_container')]");
foreach (HtmlElement inp in he)
{   
    inp.FindChildrenByTags("input;textarea").ToList().ForEach(i=>
        {
                    i.SetValue("", "none", true);//заполняем   
        });
}


/////////// ГАЛОЧКИ + АКТИВАЦИЯ ПОЛЯ EMAIL + ОТПРАВКА ПО ENTER ////////////

//отметим все чекбоксы
form.FindChildrenByTags("input:checkbox").ToList()
    .ForEach(c=>c.SetValue("true","Full",false,false));

form.FindChildrenByTags("select").ToList()//отметим все селекты
    .ForEach(sel=>
    {
        sel.Click();
        sel.SetValue(//выберем предполследний элемент селектов
            sel.FindChildrenByTags("option").ElementAt(sel.FindChildrenByTags("option").Count-1).InnerHtml
        ,"Middle",true,false);
    });

HtmlElement heCh = form.FindChildByTag("input", N);
heCh.Click();

instance.WaitFieldEmulationDelay();
instance.SendText("{ENTER}", 23);
instance.WaitFieldEmulationDelay();
HtmlElement button = instance.ActiveTab.FindElementByTag("form", N).FindChildByAttribute("input:submit", "type", "submit", "regexp", 0);
button.Click();

System.Threading.Thread.Sleep(500);
tab.WaitDownloading();

string log = "Успешно отправили с донора: " + project.Variables["url"].Value;
project.SendInfoToLog(log, true);

System.Threading.Thread.Sleep(rand.Next(1,333));
 
  • Спасибо
Реакции: Vodemart

Vodemart

Client
Регистрация
26.11.2021
Сообщения
47
Благодарностей
7
Баллы
8
ну вот)) спасибо большое)
 

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
723
Благодарностей
474
Баллы
63
  • Спасибо
Реакции: Vodemart

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)