purebasic.info
http://purebasic.info/phpBB3ex/

Прокси чекер Proxy checker Программа для проверки proxy
http://purebasic.info/phpBB3ex/viewtopic.php?f=10&t=2782
Страница 1 из 1

Автор:  m0t0d0r [ Пн ноя 26, 2012 10:21 pm ]
Заголовок сообщения:  Прокси чекер Proxy checker Программа для проверки proxy

Мне для парсера нужен встроеный прокси чекер, сегодня целый день писал, вот что получилось, отдаю на суд общественности, ну и надеюсь, что кому нить пригодится

_______________________
Исправил недочёт при редактирование результатов.
Добавил возможность передачи в параметрах, файла на прокси лист, после чека, данные будут записаны в этот же файл, старые данные будут удалены.

Вложения:
Комментарий к файлу: прокси чекер
ProxyChecker.rar [186.34 KiB]
Скачиваний: 323

Автор:  qpAHToMAS [ Пн ноя 26, 2012 10:49 pm ]
Заголовок сообщения: 

А почему парсишь именно через Proxy?

Автор:  m0t0d0r [ Пн ноя 26, 2012 10:54 pm ]
Заголовок сообщения: 

qpAHToMAS писал(а):
А почему парсишь именно через Proxy?


нетолько, просто уважающий себя парсер, обязан иметь поддержку работы через прокси, вот я и решил добавить, а чекер, как дополнительный инструмент.

Да и как ещё парсить, если надо быстро, много и без бана, датацентры палятся на ура, свой ип через пару минут даже антикапчёй неотмоешь, остаются только прокси, хотя может я чего то не знаю

Автор:  MrF [ Пн ноя 26, 2012 11:09 pm ]
Заголовок сообщения: 

А зачем принудительно убивать поток, если есть WaitThread? К тому же KillThread не очищает память, а это приводит к ее утечке. С 5-10к проксей будет очень заметно.

Автор:  m0t0d0r [ Пн ноя 26, 2012 11:18 pm ]
Заголовок сообщения: 

MrF писал(а):
А зачем принудительно убивать поток, если есть WaitThread? К тому же KillThread не очищает память, а это приводит к ее утечке. С 5-10к проксей будет очень заметно.

Ну например у меня было так, что больше 5ти мин не отвечал поток, если ждать, то это ХЗ, если игнорить и идти дальше, это ещё хуже, когда он очухается, то начнёт обращаться к несуществующим гаджетам и создавать уже удалённые файлы, ставить на паузу и идти дальше, тоже самое что и убить, память не освобадится, короче если не надо, чтоб ресурсы захламлялись, то ставить таймаут минуты на 3-6, всё будет ОК

Автор:  MrF [ Пн ноя 26, 2012 11:40 pm ]
Заголовок сообщения: 

Я же тебе не зря про WaitThread сказал. Там есть свой таймаут с безопасным завершением.

m0t0d0r писал(а):
короче если не надо, чтоб ресурсы захламлялись, то ставить таймаут минуты на 3-6, всё будет ОК

Также и будет, память-то никто же не очистит.

И чекать прокси лучше через специальные страницы, например, anonymity.freeproxy.ru/check.php
2кб против 90кб гугловских - существенная разница.

Автор:  m0t0d0r [ Вт ноя 27, 2012 9:27 am ]
Заголовок сообщения: 

MrF писал(а):
Я же тебе не зря про WaitThread сказал. Там есть свой таймаут с безопасным завершением.

m0t0d0r писал(а):
короче если не надо, чтоб ресурсы захламлялись, то ставить таймаут минуты на 3-6, всё будет ОК

Также и будет, память-то никто же не очистит.

И чекать прокси лучше через специальные страницы, например, anonymity.freeproxy.ru/check.php
2кб против 90кб гугловских - существенная разница.


да надо попробовать WaitThread, может я из справки что то не понял

большинство таких страниц палят прокси лист и черз час он уже не актуален, а искать чесные, дело долгое и много листов понадобится

Код:
1
2
3
4
5
6
7
8
Procedure th(val)
  Delay(10000)
EndProcedure
th_1 = CreateThread(@th(), 1)
If IsThread(th_1)<>0
  WaitThread(th_1, 1)
  Debug IsThread(th_1)
EndIf


Не прекращает эта функция поток и не для этого походу она

Автор:  Пётр [ Вт ноя 27, 2012 10:19 am ]
Заголовок сообщения: 

m0t0d0r писал(а):
не для этого походу она
Она ожидает завершения потока. http://purebasic.ru/manual.php?id=1324&lng=rus
Сначала нужно сообщить потоку что он должен завершиться, а потом уже использовать эту функцию.

Автор:  m0t0d0r [ Вт ноя 27, 2012 10:25 am ]
Заголовок сообщения: 

Пётр писал(а):
m0t0d0r писал(а):
не для этого походу она
Она ожидает завершения потока. http://purebasic.ru/manual.php?id=1324&lng=rus
Сначала нужно сообщить потоку что он должен завершиться, а потом уже использовать эту функцию.

так речь о том, что поток завис на стадие соединения(коннекта) к серву, через прокси, в остальных местах ему зависать негде, там некак не сообщить, ну по крайней мере я способ не нашёл, вот и встаёт вопрос, валить такие потоки, или что с ними делать, потому что ждать отклика иногда приходится по 5, а может и более минут, я сам больше 5 минут не наблюдал, это был фотохостинг, не помню какой, вот он не отвечал так долго.

Автор:  MrF [ Вт ноя 27, 2012 4:14 pm ]
Заголовок сообщения: 

Пётр писал(а):
Сначала нужно сообщить потоку что он должен завершиться, а потом уже использовать эту функцию.

С таймаутом этого не надо.

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Procedure PrintStuff(*Interval)
  Debug " 1 trd"
    For i = 0 To 10
      PrintN(".")
      Delay(*Interval)
    Next
  EndProcedure
 
  If OpenConsole()
    Debug "start 1 trd"
    thread = CreateThread(@PrintStuff(), 1000)
     Debug "start "+ Str(thread)+" trd"
    If thread
      WaitThread(thread )
        PrintN("A")
        Delay(1000)
    EndIf
  EndIf



Если в этом примере в WaitThread добавить таймаут в 100мс, то программа не будет отсчитывать 10 итераций в потоке и завершится после первой.

m0t0d0r писал(а):
что поток завис на стадие соединения(коннекта) к серву

Так добавь таймаут в HttpGetPage, по истечению которого будет происходить InternetCloseHandle_

Автор:  m0t0d0r [ Вт ноя 27, 2012 4:26 pm ]
Заголовок сообщения: 

Цитата:
Если в этом примере в WaitThread добавить таймаут в 100мс, то программа не будет отсчитывать 10 итераций в потоке и завершится после первой.

m0t0d0r писал(а):
что поток завис на стадие соединения(коннекта) к серву

Так добавь таймаут в HttpGetPage, по истечению которого будет происходить InternetCloseHandle_


Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Procedure PrintStuff(*Interval) 
   Debug " 1 trd"
     For i = 0 To 10
       PrintN(".")
       Delay(*Interval)
     Next
   EndProcedure
   
   If OpenConsole()
     Debug "start 1 trd"
     thread = CreateThread(@PrintStuff(), 1000)
      Debug "start "+ Str(thread)+" trd"
     If thread
       WaitThread(thread, 100)
       Delay(100);так просто
       Debug IsThread(thread)
       Delay (10000)
         PrintN("A")
         Delay(1000)
     EndIf
   EndIf



не пашет твой пример, поток работает дальше, он не завершился, ресурсы не освобадились, просто сразу этого не видно, так как прога завершалась, а в моём примере точки идут дальше

Автор:  MrF [ Вт ноя 27, 2012 5:49 pm ]
Заголовок сообщения: 

Точно. Прошу прощенья, это я все перепутал и какую-то чушь написал :)

Автор:  Aleksandr [ Ср сен 18, 2019 10:28 pm ]
Заголовок сообщения:  Re: Прокси чекер Proxy checker Программа для проверки proxy

Пытаюсь написать прокси чекер, по сути научиться работать с потоками.

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
 
 
Global  NewList CheckedProxy.s()
Global MtxVar = CreateMutex()
 
InitNetwork()
 
Procedure.s SendHTTPData(Map headers$(), url.s, Proxy.s, TypeMethod.s, BodySend.s, ResponseHeaders.l,NoRedirest.l, GetResponseCode.l)
  ;Debug SendHTTPData(Header$(), "https://ipv4-internet.yandex.net/", "", "get", "", 0,0, 0);
 
  If Not Proxy =""
    HTTPProxy(Proxy)
  EndIf
 
  If TypeMethod = "get"
    Type = #PB_HTTP_Get
  EndIf                    
 
 
 
  If ResponseHeaders = 1  
    Response$ = GetHTTPHeader(url,HTTP_NoRedirect,headers$())    
 
  EndIf
 
  ProcedureReturn Response$
 
EndProcedure
 
 
 
 
Procedure TreadCheckProxy(*str_mem)
     Protected  NewMap Header$(),  bodyPage.s
   
Header$("User-Agent:") = "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0"
Header$("Accept:") = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
Header$("Accept-Language:") = "en-US;q=0.5,en;q=0.3"
Header$("Connection:") = "keep-alive"
Header$("Upgrade-Insecure-Requests:") = "1"
 
  str_proxy.s= PeekS(*str_mem)
 
  If str_proxy.s=""
    ProcedureReturn 0
  EndIf
 
  bodyPage.s = SendHTTPData(Header$(), "https://yandex.ru/internet/", "socks5://"+str_proxy, "get", "", 1,0, 0)
 
      If Not bodyPage = ""
 
           LockMutex(MtxVar) ; поток занял мьютекс
   
          AddElement(CheckedProxy())
          CheckedProxy()=str_proxy
          Debug  "add Proxy "+str_proxy
   
    UnlockMutex(MtxVar) ;
        EndIf
 
EndProcedure
 
 
Procedure.s CheckProxyList(File.s,FileTo.s)
  Protected str_pr.s
  thread = 400
  num_threads = thread
  threads_timelimit = 15
  Dim threads(thread, 2)
 
  If ReadFile(0,File.s)
    If OpenFile(1,FileTo,#PB_File_Append)
      While Eof(0) = 0
        str_pr.s = ReadString(0)
          str_pr.s = RemoveString(str_pr.s, #CR$)
          str_pr.s = RemoveString(str_pr.s, #LF$)
              If Not str_pr.s =""
                *MemoireID = AllocateMemory(5000)
  If *MemoireID
    PokeS(*MemoireID, str_pr.s)
      EndIf        
          EndIf    
           stoped = 0
      Repeat
     For a=0 To num_threads-1
          If IsThread(threads(a,0)) = 0
         
         
            threads(a,0) = CreateThread(@TreadCheckProxy(), *MemoireID)
           
          str_pr.s=""
           threads(a,1) = Date()
            stoped = 1
            Break
       
       
      ElseIf Date()-threads(a,1) >= threads_timelimit
       
         
            KillThread(threads(a,0))
            threads(a,1) = 0
            threads(a,0) = CreateThread(@TreadCheckProxy(),*MemoireID)
         
            threads(a,1) = Date()
            stoped = 1
            Break
          EndIf
     
       
        Next a
        Delay(100)
      Until stoped = 1
     
     
    Wend
   
     Repeat
      stoped = 1
      For a=0 To num_threads-1
        If IsThread(threads(a,0)) <> 0 And Date()-threads(a,1) < threads_timelimit
          stoped = 0
          Break
        ElseIf threads(a,1)<>0 And Date()-threads(a,1) >= threads_timelimit And IsThread(threads(a,0))<>0
          KillThread(threads(a,0))
          threads(a,1) = 0
          stoped = 0
          Break
        EndIf
      Next a
      Delay(100)
    Until stoped = 1
       
 
   ForEach CheckedProxy()
     Debug CheckedProxy()
      WriteStringN(1,CheckedProxy())
  Next
 
CloseFile(1)
EndIf
CloseFile(0)
    EndIf
  EndProcedure  
 
 
 
  CheckProxyList("List.txt","ListChecked.txt")
 



При увеличение количества потоков, искажается результат, даже в 100 потоках не работает корректно, при 10 потоках результат в два - три раза больше.
Как победить ?
Прокси для сервера брал здесь https://www.proxy-list.download/SOCKS5

И ещё вопрос, есть ли способ определить какой прокси будет использоваться( http/socks5(5)....) до команды HTTPProxy( ?
Или может есть более универсальный способ использования прокси, имеется введу что бы можно было не указывать заголовков hhtp/socks?

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/