1 (изменено: DD, 2018-04-11 16:54:53)

Тема: AHK: Скачивание через GET/POST-запросы

По мотивам темы VBS: Изменение условия скачивания, где обсуждалось скачивание постов ВКонтакта, лайков к ним, комментариев и лайков к ним.

Malcev пишет:

Не понимаю про какие подпрограммы вы пишите.
Я пристально этой темой не занимался, но в принципе все данные о "шагах" и их количестве должны выдаваться в ответе пост-запроса.
Например разберем эту ссылку:
https://vk.com/team?w=wall-22822305_377885
При отправлении постзапроса на https://vk.com/al_wall.php с данными act=get_replies&al=1&count=20&from=wkview&offset=0&post=-22822305_377885&rev=0
Выдаётся ответ в котором написано:
!json>{"num":20,"count":260,"offset":"0"}
Из чего можно сделать вывод о количестве текущих сообщений, об общем количестве сообщений и текущем отступе.
Кстати максимум текущих сообщений можно получить 100, то есть отправлять в пост-запросе:
act=get_replies&al=1&count=100&from=wkview&offset=0&post=-22822305_377885&rev=0
Когда получили все сообщения - проходите их регуляркой для определения количества лайков каждого сообщения.
И если лайки у сообщения есть, то определяете его ссылку и отправляете ее в пост-запросе.
После чего вы получаете информацию о лайкнувших.
И дальше используете такую же схему.

Имелся в виду случай, когда под-страниц у комментариев или лайков будет 10 штук — как тогда формировать сдвиг по offset?

post = -22822305_377885

HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
post_url = https://vk.com/wkview.php?act=show&al=1&w=wall%post%&offset=999999
HTTP.Open("GET", post_url, true)
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send()
HTTP.WaitForResponse()
ResponseText := HTTP.ResponseText

PostText := RegExReplace(ResponseText, "s).*?<\!bool><\!>(<div.*?</div>)<\!><\!json>.*", "$1")
fileappend  %PostText%, %A_desktop%/%post%.html

post_likes := RegExReplace(ResponseText, "s).*?,""likes"":(\d+),.*", "$1")
post_replies := RegExReplace(ResponseText, "s).*?,""count"":(\d+),.*", "$1")
msgbox, Лайков:%A_Tab%%A_Tab%%post_likes%`nКомментов:%A_Tab%%post_replies%

if (NOT post_likes = "") or (post_likes > 60)
gosub, post_likes
return


post_likes:
HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
HTTP.Open("POST", "https://vk.com/wkview.php", true)
HTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send("act=show&al=1&w=likes/wall" post "&offset=0")
HTTP.WaitForResponse()
clipboard := HTTP.ResponseText
fileappend  % clipboard, %A_desktop%/%post%.html

return

2 (изменено: Malcev, 2018-04-11 16:08:30)

Re: AHK: Скачивание через GET/POST-запросы

А почему вы отправляете GET запрос, когда надо POST?
Повторюсь, загрузите ссылку https://vk.com/team?w=wall-22822305_377885 в IE и проанализируйте какие запросы отправляются.
Во втором примере это неправильно:

HTTP.Open("POST", "https://vk.com/al_wall.php?act=get_replies&al=1&count=100&from=wkview&offset=100&post=%post%&rev=0", true)

Правильно так:

HTTP.Open("POST", "https://vk.com/al_wall.php", true)
...
HTTP.Send("act=get_replies&al=1&count=100&from=wkview&offset=100&post=" post "&rev=0")

3

Re: AHK: Скачивание через GET/POST-запросы

Аа-а, исправил. Но как брать следующие под-страницы лайков?

4

Re: AHK: Скачивание через GET/POST-запросы

А какой у вас сейчас код?

5

Re: AHK: Скачивание через GET/POST-запросы

Отредактировал первый пост: он получает пост и первую страницу лайкнувших его.

6

Re: AHK: Скачивание через GET/POST-запросы

Будет проще если вы подробно напишите, что вы хотите вытянуть из этого поста:
https://vk.com/team?w=wall-22822305_377885

7

Re: AHK: Скачивание через GET/POST-запросы

Последовательно в один файл хотелось бы получить собственно тело поста, потом список всех лайкнувших пост и все комментарии со списком их лайкеров.

8 (изменено: Malcev, 2018-04-13 20:22:44)

Re: AHK: Скачивание через GET/POST-запросы

Список лайкнувших пост можно получить так:

post := "-22822305_377885", n := 0, LikesText := LikesList := ""

HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
loop
{
   HTTP.Open("POST", "https://vk.com/wkview.php", true)
;   HTTP.SetRequestHeader("Cookie", "remixlang=0")   ; имена на русском
   HTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
   HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
   HTTP.SetRequestHeader("Pragma", "no-cache")
   HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
   HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
   HTTP.Send("act=show&al=1&al_ad=0&offset=" n "&w=likes`%2Fwall" post)
   HTTP.WaitForResponse()
   ResponseText := HTTP.ResponseText
   LikesText .= "`n" ResponseText
   If A_Index = 1
   {
      RegExMatch(ResponseText, "s)Likes<span class=""ui_tab_count"".+?>(.+?)<", match)
      if (RegExReplace(match1, "\d+") = "") and (match1 <= 120)
         break
   }
   If InStr(ResponseText, "<!bool><!><!json>")
      break
   If A_Index = 1
      n+=120
   else
      n+=60
}
match := "", Pos := 1  
While Pos := RegExMatch(LikesText, "s)fans_fan_lnk.+?>(.+?)<",match,Pos+StrLen(match))
   LikesList .= match1 "`n"
msgbox % clipboard := likesList

Комментирующие и лайки к ним так:

post := "-22822305_377885", n := 0, fin := CommentsText :=""

HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
loop
{
   HTTP.Open("POST", "https://vk.com/al_wall.php", true)
;   HTTP.SetRequestHeader("Cookie", "remixlang=0")   ; имена на русском
   HTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
   HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
   HTTP.SetRequestHeader("Pragma", "no-cache")
   HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
   HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
   HTTP.Send("act=get_replies&al=1&count=100&from=wkview&offset=" n "&post=" post "&rev=0")
   HTTP.WaitForResponse()
   ResponseText := HTTP.ResponseText
   CommentsText .= "`n" ResponseText
   If A_Index = 1
      postCount := RegExReplace(ResponseText, "s)^.*<!json>\{.+?""count"":(.+?),.*$", "$1")
   if (n >= postCount)
      break
   n+=100
}

match := "", Pos := 1
While Pos := RegExMatch(CommentsText, "s)<div id=""post(.+?)"".+?data-from-id=.+?>(.+?)</a>(.+?)</span></a></div> </div> </div> </div>",match,Pos+StrLen(match))
{
   post := match1, name := match2
   if RegexMatch(match3, "s)<span class=""like_count _count"">(.+?)</span>", matchh)
   {
      n := 0, LikesText := LikesList := "", LikesCount := matchh1
      loop
      {
         HTTP.Open("POST", "https://vk.com/wkview.php", true)
;         HTTP.SetRequestHeader("Cookie", "remixlang=0")   ; имена на русском
         HTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
         HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
         HTTP.SetRequestHeader("Pragma", "no-cache")
         HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
         HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
         HTTP.Send("act=show&al=1&al_ad=0&offset=" n "&w=likes`%2Fwall_reply" post)
         HTTP.WaitForResponse()
         ResponseText := HTTP.ResponseText
         LikesText .= "`n" ResponseText
         If ((A_Index = 1) and (RegExReplace(LikesCount, "\d+") = "") and (LikesCount <= 120)) or InStr(ResponseText, "<!bool><!><!json>")
            break
         If A_Index = 1
            n+=120
         else
            n+=60
      }
      matchh := "", Poss := 1  
      While Poss := RegExMatch(LikesText, "s)fans_fan_lnk.+?>(.+?)<",matchh,Poss+StrLen(matchh))
         LikesList .= matchh1 ", "
      LikesList := SubStr(LikesList, 1, StrLen(LikesList) - 2)
      name .= " - " LikesCount " (" LikesList ")"
   }
   fin .= name "`n"
}
msgbox % clipboard := fin

Проанализировав этот код, я думаю вы поймете по какому алгоритму он работает и сможете сами модифицировать или отловить баги.

+ DD

9 (изменено: DD, 2018-04-13 09:28:20)

Re: AHK: Скачивание через GET/POST-запросы

Спасибо, что-то получилось:


#SingleInstance Force

htmlcode=
(
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta http-equiv="content-type" content="text/html; charset=windows-1251" />
<title>Стена</title>
<link type="text/css" rel="stylesheet" href="css\common.css"></link>
<link type="text/css" rel="stylesheet" href="css\fonts-cnt.css"></link>
<link type="text/css" rel="stylesheet" href="css\page.css"></link>
<link type="text/css" rel="stylesheet" href="css\post.css"></link>
<link type="text/css" rel="stylesheet" href="css\ui-common.css"></link>
<link type="text/css" rel="stylesheet" href="css\uncommon.css"></link>
<link type="text/css" rel="stylesheet" href="css\wall.css"></link>
<link type="text/css" rel="stylesheet" href="css\wide-dd.css"></link>
<base href="https://vk.com/">
</head>
<body style="background-color:#ffffff!important;">

<div class="wall_wrap clear_fix">
  <div class="big_wall">
    <div class="wall_module">`n`n`n`n
)


postID := "-22822305_377885"
dest_path = %A_desktop%\%postID%.html


post := postID, n := 0, LikesText := LikesList := ""
HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")


;--------------------------------------------
;Пост:
;--------------------------------------------
HTTP.Open("GET", "https://vk.com/wkview.php?act=show&al=1&w=wall" post "&offset=999999", true)
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send()
HTTP.WaitForResponse()
ResponseText := HTTP.ResponseText
Gosub, PstProc
FileDelete, %dest_path%
fileappend, %htmlcode%%ResponseText%, %dest_path%


ResponseText =


;--------------------------------------------
;Список лайкнувших пост:
;--------------------------------------------
loop
{
   HTTP.Open("POST", "https://vk.com/wkview.php", true)
;   HTTP.SetRequestHeader("Cookie", "remixlang=0")   ; имена на русском
   HTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
   HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
   HTTP.SetRequestHeader("Pragma", "no-cache")
   HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
   HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
   HTTP.Send("act=show&al=1&al_ad=0&offset=" n "&w=likes`%2Fwall" post)
   HTTP.WaitForResponse()
   ResponseText := HTTP.ResponseText
   PstLikesText .= "`n" ResponseText
   If A_Index = 1
   {
      ResponseText := RegExReplace(ResponseText, "s)<span class=""num_delim"">\s+</span>", "")
      RegExMatch(ResponseText, "s)<span class=""ui_tab_count"".+?>(.+?)<", match)
      if match1 <= 120
         break
   }
   If InStr(ResponseText, "<!bool><!><!json>")
      break
   If A_Index = 1
      n+=120
   else
      n+=60 ; смещение по offset
}
match := "", Pos := 1  
;;;;While Pos := RegExMatch(PstLikesText, "s)fans_fan_lnk.+?>(.+?)<",match,Pos+StrLen(match))
While Pos := RegExMatch(PstLikesText, "s)(<div class=""fans_fan_row.+?</a></div>\R</div>)",match,Pos+StrLen(match))
   PstLikesList .= match1 "`n"
Gosub, PstLksProc
;msgbox % clipboard := PstlikesList
fileappend, %PstLikesList%`n`n`n<br><hr>`n`n`n`n`n`n, %dest_path%


ResponseText =
PstLikesList =
PstLikesText =
match =
match1 =

;--------------------------------------------
;Комментирующие и лайки к ним:
;--------------------------------------------
post := postID, n := 0, CommentsText :=""

HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
loop
{
   HTTP.Open("POST", "https://vk.com/al_wall.php", true)
;   HTTP.SetRequestHeader("Cookie", "remixlang=0")   ; имена на русском
   HTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
   HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
   HTTP.SetRequestHeader("Pragma", "no-cache")
   HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
   HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
   HTTP.Send("act=get_replies&al=1&count=100&from=wkview&offset=" n "&post=" post "&rev=0")
   HTTP.WaitForResponse()
   ResponseText := HTTP.ResponseText
   CommentsText .= "`n" ResponseText
   If A_Index = 1
      postCount := RegExReplace(ResponseText, "s)^.*<!json>\{.+?""count"":(.+?),.*$", "$1")
   if (n >= postCount)
      break
   n+=100 ; смещение по offset
}

match := "", Pos := 1
;While Pos := RegExMatch(CommentsText, "s)<div id=""post(.+?)"".+?data-from-id=.+?>(.+?)</a>(.+?)</span></a></div> </div> </div> </div>",match,Pos+StrLen(match))
While Pos := RegExMatch(CommentsText, "s)<div id=""post(.+?)("".+?data-from-id=.+?>.+?</a>)(.+?)(</span></a></div> </div> </div> </div>\R</div>)",match,Pos+StrLen(match))
{
   pst_cmt_lnk := match1, pst_cmt_body := "<div id=""post" match1 match2 match3 match4
   Gosub, CmtProc
   if RegexMatch(match3, "s)<span class=""like_count _count"">(.+?)</span>", matchh)
   {
      n := 0, CmtLikesText := CmtLikesList := "", CmtLikesCount := matchh1
      loop
      {
         HTTP.Open("POST", "https://vk.com/wkview.php", true)
;         HTTP.SetRequestHeader("Cookie", "remixlang=0")   ; имена на русском
         HTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
         HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
         HTTP.SetRequestHeader("Pragma", "no-cache")
         HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
         HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
         HTTP.Send("act=show&al=1&al_ad=0&offset=" n "&w=likes`%2Fwall_reply" pst_cmt_lnk)
         HTTP.WaitForResponse()
         ResponseText := HTTP.ResponseText
         Gosub, CmtLksProc
         CmtLikesText .= "`n" ResponseText
         If ((A_Index = 1) and (CmtLikesCount <= 120)) or InStr(ResponseText, "<!bool><!><!json>")
            break
         If A_Index = 1
            n+=120
         else
            n+=60 ; смещение по offset
      }
      matchh := "", Poss := 1
      ;;;;While Poss := RegExMatch(CmtLikesText, "s)fans_fan_lnk.+?>(.+?)<",matchh,Poss+StrLen(matchh))
      While Poss := RegExMatch(CmtLikesText, "s)(<div class=""fans_fan_row.+?</a></div>\R</div>)",matchh,Poss+StrLen(matchh))
         CmtLikesList .= matchh1 ;", "
      ;;;;CmtLikesList := SubStr(CmtLikesList, 1, StrLen(CmtLikesList) - 2)
      CmtLikesList := SubStr(CmtLikesList, 1, StrLen(CmtLikesList))
      ;;;;pst_cmt_body .= " - " CmtLikesCount " (" CmtLikesList ")"
      pst_cmt_body .= "`n`n<div id=""pst_lks"">" CmtLikesList "</div>`n"
   }
   fin .= pst_cmt_body "`n"
}
;msgbox % clipboard := fin
fileappend  % fin, %dest_path%





ResponseText =
CommentsText =
postCount =
match =
pst_cmt_lnk =
pst_cmt_body =
match1 =
match2 =
match3 =
match4 =
matchh =
CmtLikesList =
CmtLikesCount =
matchh1 =




return





PstProc:
ResponseText := RegExReplace(ResponseText, "s).*?<!bool><!>(<div.*?</div>)<!><!json>.*", "$1")
ResponseText := RegExReplace(ResponseText, "s)<a([^>]*)base&quot;:&quot;([^>]*)(&quot;,&quot;[^>]*\[&quot;)([^}]*)(&quot;[^>]*)>", "<a$1base&huot;:&huot;$2$3$4$5 href=""$2$4.jpg""><img class=""my"" src=""$2$4.jpg""></a>`n`n`n")
ResponseText := RegExReplace(ResponseText, "s) href=""(/away[^""]*)""([^>]* title=)""(https?:[^""]*)""", " href=""$3""$2""$3""") ;!!
ResponseText := RegExReplace(ResponseText, "s) (onmouse\w+=|onclick=|data-from-id="")", " X$1") ;!!
ResponseText := RegExReplace(ResponseText, "s)aria-label=", "title=") ;!!
ResponseText := RegExReplace(ResponseText, "s)[<div class=""ui_actions_menu_icons"".*?</a></div>|<div class=""ui_actions_menu _ui_menu"".*?</a></div>|<div id=""wl_reply_form_wrap"" class=""wl_reply_form_wrap""><div class=""wl_post_reply_form_forbidden"">.*?</div></div>|<button class=""flat_button.*?</button>|<span class=""blind_label""[^>]*>Показать список оценивших</span>|<span class=""blind_label"">Нравится</span>]", "")
ResponseText := RegExReplace(ResponseText, "s)<br><a class=""wall_\w+_more"" X?onclick=""hide\(this, domPS\(this\)\); show\(domNS\(this\)\);"">Показать полностью…</a><span style=""display: none"">", "")
ResponseText := RegExReplace(ResponseText, "m`a)^\s+<button class=""flat_button.*?>Вы подписаны</.*?</button>$", "")
return

CmtProc:
pst_cmt_body := RegExReplace(pst_cmt_body, "s) href=""(/away[^""]*)""([^>]* title=)""(https?:[^""]*)""", " href=""$3""$2""$3""") ;!!
pst_cmt_body := RegExReplace(pst_cmt_body, "s)<a([^>]*)base&quot;:&quot;([^>]*)(&quot;,&quot;[^>]*\[&quot;)([^}]*)(&quot;[^>]*)>", "<a$1base&huot;:&huot;$2$3$4$5 href=""$2$4.jpg""><img class=""my"" src=""$2$4.jpg""></a>`n`n`n")
pst_cmt_body := RegExReplace(pst_cmt_body, "s)aria-label=", "title=") ;!!
pst_cmt_body := RegExReplace(pst_cmt_body, "s)data-from-id=""(\d+)"">", "data-from-id=""$1"">id$1|")
pst_cmt_body := RegExReplace(pst_cmt_body, "s) rid=""(\d+)(""[^>]*>)", " rid=""$1$2to$1|")
pst_cmt_body := RegExReplace(pst_cmt_body, "s)<br><a class=""wall_\w+_more"" X?onclick=""hide\(this, domPS\(this\)\); show\(domNS\(this\)\);"">Показать полностью…</a><span style=""display: none"">", "")
return

PstLksProc:
PstLikesList := RegExReplace(PstLikesList, "s)( onmouse\w+=""[^""]*"")", "") ;!!
PstLikesList := RegExReplace(PstLikesList, "s) (onmouse\w+=|onclick=|data-from-id="")", " X$1") ;!!
PstLikesList := RegExReplace(PstLikesList, "s) data-id=""(\d+)("">\R\s+<div class=""fans_[^>]*>\R\s+<a class=""fans_[^>]*>\R\s+<img class=""fans_[^>]*>\R\s+</a>\R\s+</div>\R\s+<div class=""fans_fan_name""><a class=""fans_fan_lnk""[^>]*)>", " data-id=""$1$2>plk$1 ") ;прибавка ID к лайку поста
return

CmtLksProc:
ResponseText := RegExReplace(ResponseText, "s)<span class=""num_delim"">\s+</span>", "")
ResponseText := RegExReplace(ResponseText, "s)( onmouse\w+=""[^""]*"")", "") ;!!
PstLikesList := RegExReplace(PstLikesList, "s) (onmouse\w+=|onclick=|data-from-id="")", " X$1") ;!!
ResponseText := RegExReplace(ResponseText, "s) data-id=""(\d+)("">\R\s+<div class=""fans_[^>]*>\R\s+<a class=""fans_[^>]*>\R\s+<img class=""fans_[^>]*>\R\s+</a>\R\s+</div>\R\s+<div class=""fans_fan_name""><a class=""fans_fan_lnk""[^>]*)>", " data-id=""$1$2>clk$1 ") ;прибавка ID к лайку коммента
return

За исключением одного момента:
— не удалось выяснить, почему к комментариям возвращается не больше одной страницы лайков. То есть, на первой странице комментариев видно, что у одного из первых комментариев 80+ лайков, но скачиваются почему-то только 60 (то есть: первая страница).

Список лайкнувших пост в коде закомментирован, чтобы не грузилось 2000+ лайков к посту.

Во вложении прилагаются стили для правильного отображения скачанной страницы.

Post's attachments

css.rar 369.06 kb, file has never been downloaded. 

You don't have the permssions to download the attachments of this post.

10

Re: AHK: Скачивание через GET/POST-запросы

DD пишет:

— не удалось выяснить, почему к комментариям возвращается не больше одной страницы лайков. То есть, на первой странице комментариев видно, что у одного из первых комментариев 80+ лайков, но скачиваются почему-то только 60.

В моём коде или вашем?
Если в моём, то приведите ссылку на пост.

11

Re: AHK: Скачивание через GET/POST-запросы

Второй код этого поста. В первом коде баг отловил, но во втором всё вроде и правильно, но не работает.

12

Re: AHK: Скачивание через GET/POST-запросы

Да, неправильно я лайки подсчитывал. Так вроде должно работать.
Для первого кода заменить это:

   If A_Index = 1
   {
      RegExMatch(ResponseText, "s)Likes<span class=""ui_tab_count"".+?>(.+?)<", match)
      if match1 <= 120
         break
   }

на это:

   If A_Index = 1
   {
      RegExMatch(ResponseText, "s)Likes<span class=""ui_tab_count"".+?>(.+?)<", match)
      if (RegExReplace(match1, "\d+") = "") and (match1 <= 120)
         break
   }

Для второго кода заменить это:

         If ((A_Index = 1) and (LikesCount <= 120)) or InStr(ResponseText, "<!bool><!><!json>")
            break

на это:

         If ((A_Index = 1) and (RegExReplace(LikesCount, "\d+") = "") and (LikesCount <= 120)) or InStr(ResponseText, "<!bool><!><!json>")
            break

13 (изменено: DD, 2018-04-13 17:59:57)

Re: AHK: Скачивание через GET/POST-запросы

Malcev пишет:

А в первом какой баг?

В первом, вместо:


RegExMatch(ResponseText, "s)Likes<span class=""ui_tab_count"".+?>(.+?)<", match)

должно было:


ResponseText := RegExReplace(ResponseText, "s)<span class=""num_delim"">\s+</span>", "")
RegExMatch(ResponseText, "s)<span class=""ui_tab_count"".+?>(.+?)<", match)

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

Malcev пишет:

Ссылку по которой не получаете все лайки приведите.

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


While Poss := RegExMatch(CmtLikesText, "s)fans_fan_lnk.+?>(.+?)<",matchh,Poss+StrLen(matchh))

на это (моя замена, чтобы отдельные лайки извлекались полностью, а не только имена, как у вас):


While Poss := RegExMatch(CmtLikesText, "s)(<div class=""fans_fan_row.+?</a></div>\R</div>)",matchh,Poss+StrLen(matchh))

14

Re: AHK: Скачивание через GET/POST-запросы

Пока набирал, вы уже ответ дали. Спасибо, посмотрю.

15 (изменено: Malcev, 2018-04-13 16:27:39)

Re: AHK: Скачивание через GET/POST-запросы

У них подсчет лайков отображается по своему алгоритму.
Например, если больше 1000, то 1,000, если больше 10000, то 10K.
https://vk.com/durov?w=likes%2Fwall1_2285269
Поэтому я и вставил проверку на присутствие в переменной не цифр.
Если же нужно точное количество лайков, которое может отличаться от полученных лайкнувших в большую сторону, то нужно получать информацию с самого поста:
https://vk.com/durov?w=wall1_2285269
т.е посылать POST запрос на https://vk.com/wkview.php  с данными: act=show&al=1&is_znav=1&loc=durov&w=wall1_2285269.

16 (изменено: DD, 2018-04-13 18:03:40)

Re: AHK: Скачивание через GET/POST-запросы

Всё-таки, на моих примерах — где извлекаются лайки целиком, а не только имена — ваши поправки не срабатывают. Не могли бы вы посмотреть, почему в следующем коде это не работает? Если в нём закомментировать/раскомментировать следующие две строки (ваш код, получающий только имена лайкеров — и моя замена, получающая тело всего лайка),


;;;;While Poss := RegExMatch(CmtLikesText, "s)fans_fan_lnk.+?>(.+?)<",matchh,Poss+StrLen(matchh))
While Poss := RegExMatch(CmtLikesText, "s)(<div class=""fans_fan_row.+?</a></div>\R</div>)",matchh,Poss+StrLen(matchh))

то с вашей строчкой кода под-страницы лайков скачиваются, а со строкой моей замены — нет. То есть, мне надо, чтобы извлекался HTML-код с целыми лайками, а не имена. Ниже в коде выделил это место. Он для наглядности скачивает только один комментарий с 1000+ лайками, прошу взглянуть:


#SingleInstance Force

htmlcode=
(
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta http-equiv="content-type" content="text/html; charset=windows-1251" />
<title>Стена</title>
<link type="text/css" rel="stylesheet" href="css\common.css"></link>
<link type="text/css" rel="stylesheet" href="css\fonts-cnt.css"></link>
<link type="text/css" rel="stylesheet" href="css\page.css"></link>
<link type="text/css" rel="stylesheet" href="css\post.css"></link>
<link type="text/css" rel="stylesheet" href="css\ui-common.css"></link>
<link type="text/css" rel="stylesheet" href="css\uncommon.css"></link>
<link type="text/css" rel="stylesheet" href="css\wall.css"></link>
<link type="text/css" rel="stylesheet" href="css\wide-dd.css"></link>

<style>
html { 	margin: 1`% 2`% 2`% 2`%; }
body { font-size:100`% !important; }
.wl_replies_header_wrap {text-align:center !important; }
.fans_fan_lnk {font: bold 68`% Arial, Tahoma, Helvetica; font-weight:normal; }
.fans_fanph_wrap, .fans_fan_name, .fans_fan_lnk {line-height:12px !important; width:40px !important; text-align:center !important;  }
#pst_lks {background: #F0F2F5; margin: 0`% 1`% 1`% 4.5`%; }
.inl_bl { }
.inl_bl{display:-moz-inline-stack;display:inline-block;_overflow:hidden;vertical-align:top;zoom:1;font-size:13px !important;}
.inl_bl img { display:-moz-inline-stack;display:inline-block;_overflow:hidden;vertical-align:top;zoom:1;font-size:80`% !important;height: 40px !important; width:40px !important;}
#fw_replies_header {
text-align:right!important;
margin:0px;
padding:0px;}
</style>
<base href="https://vk.com/">
</head>
<body style="background-color:#ffffff!important;">

<div class="wall_wrap clear_fix">
  <div class="big_wall">
    <div class="wall_module">`n`n`n`n
)



postID := "1_2285269"
post := postID, n := 0, LikesText := LikesList := ""
HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")

;--------------------------------------------
;Комментирующие и лайки к ним:
;--------------------------------------------
post := postID, n := 0, CommentsText :=""

HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
loop
{
tooltip Комментирующие
sleep 500
   HTTP.Open("POST", "https://vk.com/al_wall.php", true)
;   HTTP.SetRequestHeader("Cookie", "remixlang=0")   ; имена на русском
   HTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
   HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
   HTTP.SetRequestHeader("Pragma", "no-cache")
   HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
   HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
   HTTP.Send("act=get_replies&al=1&count=1&from=wkview&offset=2&post=" post "&rev=0")
   HTTP.WaitForResponse()
   ResponseText := HTTP.ResponseText
   CommentsText .= "`n" ResponseText
   If A_Index = 1
      break
   if (n >= postCount)
      break
tooltip
}

tooltip и лайки к ним
sleep 500
match := "", Pos := 1
;While Pos := RegExMatch(CommentsText, "s)<div id=""post(.+?)"".+?data-from-id=.+?>(.+?)</a>(.+?)</span></a></div> </div> </div> </div>",match,Pos+StrLen(match))
While Pos := RegExMatch(CommentsText, "s)<div id=""post(.+?)("".+?data-from-id=.+?>.+?</a>)(.+?)(</span></a></div> </div> </div> </div>\R</div>)",match,Pos+StrLen(match))
{
   pst_cmt_lnk := match1, pst_cmt_body := "<div id=""post" match1 match2 match3 match4
   Gosub, CmtProc
   match3 := RegExReplace(match3, "s)<span class=""num_delim"">\s+</span>", "")
   if RegexMatch(match3, "s)<span class=""like_count _count"">(.+?)</span>", matchh)
   {
      n := 0, CmtLikesText := CmtLikesList := "", CmtLikesCount := matchh1
msgbox % matchh1
      loop
      {
         HTTP.Open("POST", "https://vk.com/wkview.php", true)
;         HTTP.SetRequestHeader("Cookie", "remixlang=0")   ; имена на русском
         HTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
         HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
         HTTP.SetRequestHeader("Pragma", "no-cache")
         HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
         HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
         HTTP.Send("act=show&al=1&al_ad=0&offset=" n "&w=likes`%2Fwall_reply" pst_cmt_lnk)
         HTTP.WaitForResponse()
         ResponseText := HTTP.ResponseText
         Gosub, CmtLksProc
         CmtLikesText .= "`n" ResponseText
         If ((A_Index = 1) and (CmtLikesCount <= 120)) or InStr(ResponseText, "<!bool><!><!json>")
            break
         If A_Index = 1
            n+=120
         else
            n+=60 ; смещение по offset
      }
      matchh := "", Poss := 1
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      ;;;;While Poss := RegExMatch(CmtLikesText, "s)fans_fan_lnk.+?>(.+?)<",matchh,Poss+StrLen(matchh))
      While Poss := RegExMatch(CmtLikesText, "s)(<div class=""fans_fan_row.+?</a></div>\R</div>)",matchh,Poss+StrLen(matchh))
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         CmtLikesList .= matchh1 ", "
      CmtLikesList := SubStr(CmtLikesList, 1, StrLen(CmtLikesList) - 2)
      CmtLikesList := SubStr(CmtLikesList, 1, StrLen(CmtLikesList))
      ;;;;pst_cmt_body .= " - " CmtLikesCount " (" CmtLikesList ")"
      pst_cmt_body .= "`n`n<div id=""pst_lks"">" CmtLikesList "</div>`n"
   }
   fin .= pst_cmt_body "`n"
}
tooltip
;msgbox % clipboard := fin
fileappend  %htmlcode%%fin%, %A_desktop%\%postID%.html
return





CmtProc:
pst_cmt_body := RegExReplace(pst_cmt_body, "s) href=""(/away[^""]*)""([^>]* title=)""(https?:[^""]*)""", " href=""$3""$2""$3""") ;!!
pst_cmt_body := RegExReplace(pst_cmt_body, "s)<a([^>]*)base&quot;:&quot;([^>]*)(&quot;,&quot;[^>]*\[&quot;)([^}]*)(&quot;[^>]*)>", "<a$1base&huot;:&huot;$2$3$4$5 href=""$2$4.jpg""><img class=""my"" src=""$2$4.jpg""></a>`n`n`n")
pst_cmt_body := RegExReplace(pst_cmt_body, "s)aria-label=", "title=") ;!!
pst_cmt_body := RegExReplace(pst_cmt_body, "s)data-from-id=""(\d+)"">", "data-from-id=""$1"">id$1|")
pst_cmt_body := RegExReplace(pst_cmt_body, "s) rid=""(\d+)(""[^>]*>)", " rid=""$1$2to$1|")
pst_cmt_body := RegExReplace(pst_cmt_body, "s)<br><a class=""wall_\w+_more"" X?onclick=""hide\(this, domPS\(this\)\); show\(domNS\(this\)\);"">Показать полностью…</a><span style=""display: none"">", "")
return

CmtLksProc:
ResponseText := RegExReplace(ResponseText, "s)<span class=""num_delim"">\s+</span>", "")
ResponseText := RegExReplace(ResponseText, "s)( onmouse\w+=""[^""]*"")", "") ;!!
PstLikesList := RegExReplace(PstLikesList, "s) (onmouse\w+=|onclick=|data-from-id="")", " X$1") ;!!
ResponseText := RegExReplace(ResponseText, "s) data-id=""(\d+)("">\R\s+<div class=""fans_[^>]*>\R\s+<a class=""fans_[^>]*>\R\s+<img class=""fans_[^>]*>\R\s+</a>\R\s+</div>\R\s+<div class=""fans_fan_name""><a class=""fans_fan_lnk""[^>]*)>", " data-id=""$1$2>clk$1 ") ;прибавка ID к лайку коммента
return

Кстати, во втором Вашем коде тоже потребовалось удалить пробел из лайков:


<span class="num_delim"> </span>

17 (изменено: Malcev, 2018-04-13 18:19:02)

Re: AHK: Скачивание через GET/POST-запросы

Не понимаю, зачем вам удалять пробел.
Код у вас слишком мудреный - лень копаться.
Моя правка убирает баг, что если лайков больше 1000, то может скачаться только первые 120:

a := "1,100"
if a <= 120
   msgbox

Чтобы скачать лайк целиком, нужно начинать регулярное выражение с:
<div class="fans_fan_row inl_bl".

18

Re: AHK: Скачивание через GET/POST-запросы

А так? Удалил всё лишнее, от вашего отличается только выражениями, захватывающими целые комментарии и лайки (закомментированные строки — воспроизводят ваши варианты кода):

postID := "1_2285269"
post := postID, n := 0, LikesText := LikesList := ""
HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")

;--------------------------------------------
;Комментирующие и лайки к ним:
;--------------------------------------------
post := postID, n := 0, CommentsText :=""

HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
loop
{
   HTTP.Open("POST", "https://vk.com/al_wall.php", true)
;   HTTP.SetRequestHeader("Cookie", "remixlang=0")   ; имена на русском
   HTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
   HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
   HTTP.SetRequestHeader("Pragma", "no-cache")
   HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
   HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
   HTTP.Send("act=get_replies&al=1&count=1&from=wkview&offset=2&post=" post "&rev=0")
   HTTP.WaitForResponse()
   ResponseText := HTTP.ResponseText
   CommentsText .= "`n" ResponseText
   If A_Index = 1
      break
   if (n >= postCount)
      break
}

match := "", Pos := 1
;While Pos := RegExMatch(CommentsText, "s)<div id=""post(.+?)"".+?data-from-id=.+?>(.+?)</a>(.+?)</span></a></div> </div> </div> </div>",match,Pos+StrLen(match))
While Pos := RegExMatch(CommentsText, "s)<div id=""post(.+?)("".+?data-from-id=.+?>.+?</a>)(.+?)(</span></a></div> </div> </div> </div>\R</div>)",match,Pos+StrLen(match))
{
   pst_cmt_lnk := match1, pst_cmt_body := "<div id=""post" match1 match2 match3 match4
   ;match3 := RegExReplace(match3, "s)<span class=""num_delim"">\s+</span>", "")
   if RegexMatch(match3, "s)<span class=""like_count _count"">(.+?)</span>", matchh)
   {
      n := 0, CmtLikesText := CmtLikesList := "", CmtLikesCount := matchh1
msgbox % matchh1
      loop
      {
         HTTP.Open("POST", "https://vk.com/wkview.php", true)
;         HTTP.SetRequestHeader("Cookie", "remixlang=0")   ; имена на русском
         HTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
         HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
         HTTP.SetRequestHeader("Pragma", "no-cache")
         HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
         HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
         HTTP.Send("act=show&al=1&al_ad=0&offset=" n "&w=likes`%2Fwall_reply" pst_cmt_lnk)
         HTTP.WaitForResponse()
         ResponseText := HTTP.ResponseText
         CmtLikesText .= "`n" ResponseText
         If ((A_Index = 1) and (CmtLikesCount <= 120)) or InStr(ResponseText, "<!bool><!><!json>")
            break
         If A_Index = 1
            n+=120
         else
            n+=60 ; смещение по offset
      }
      matchh := "", Poss := 1
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      ;;;;While Poss := RegExMatch(CmtLikesText, "s)fans_fan_lnk.+?>(.+?)<",matchh,Poss+StrLen(matchh))
      While Poss := RegExMatch(CmtLikesText, "s)(<div class=""fans_fan_row.+?</a></div>\R</div>)",matchh,Poss+StrLen(matchh))
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         CmtLikesList .= matchh1 ", "
      CmtLikesList := SubStr(CmtLikesList, 1, StrLen(CmtLikesList) - 2)
      CmtLikesList := SubStr(CmtLikesList, 1, StrLen(CmtLikesList))
      ;;;;pst_cmt_body .= " - " CmtLikesCount " (" CmtLikesList ")"
      pst_cmt_body .= "`n`n<div id=""pst_lks"">" CmtLikesList "</div>`n"
   }
   fin .= pst_cmt_body "`n"
}
;msgbox % clipboard := fin
fileappend  %fin%, %A_desktop%\%postID%.html

В этом коде, когда лайков больше 60 — последняя порция лайков (последний сдвиг по offset) пропускается. Может можно прописать условие, чтобы когда лайков больше 60-ти — добавлялось ещё 60 к общему числу?
С <div class="fans_fan_row inl_bl" я и начинаю регулярное выражение, но в вашем коде это недостаточно, потому что он извлекает лишь отдельные фрагменты и еще снабжен дополнительными операциями, о действии которых не имею представления.

19

Re: AHK: Скачивание через GET/POST-запросы

А почему вы не заменили в своём коде то, что я привел в  12 посте?
Это:

         If ((A_Index = 1) and (CmtLikesCount <= 120)) or InStr(ResponseText, "<!bool><!><!json>")
            break

на это:

         If ((A_Index = 1) and (RegExReplace(CmtLikesCount, "\d+") = "") and (CmtLikesCount <= 120)) or InStr(ResponseText, "<!bool><!><!json>")
            break

20

Re: AHK: Скачивание через GET/POST-запросы

Заменял при каждых изменениях, но результат либо тот же, либо возвращает меньше 60 лайков. Сейчас тот же результат — когда лайков больше 60 — последняя страница лайков пропускается.

21

Re: AHK: Скачивание через GET/POST-запросы

Значит виновата ваша регулярка, так как в переменной CmtLikesText все лайкеры присутствуют:

postID := "1_2285269"
post := postID, n := 0, LikesText := LikesList := ""
HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")

;--------------------------------------------
;Комментирующие и лайки к ним:
;--------------------------------------------
post := postID, n := 0, CommentsText :=""

HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
loop
{
   HTTP.Open("POST", "https://vk.com/al_wall.php", true)
;   HTTP.SetRequestHeader("Cookie", "remixlang=0")   ; имена на русском
   HTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
   HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
   HTTP.SetRequestHeader("Pragma", "no-cache")
   HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
   HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
   HTTP.Send("act=get_replies&al=1&count=1&from=wkview&offset=2&post=" post "&rev=0")
   HTTP.WaitForResponse()
   ResponseText := HTTP.ResponseText
   CommentsText .= "`n" ResponseText
   If A_Index = 1
      break
   if (n >= postCount)
      break
}

match := "", Pos := 1
;While Pos := RegExMatch(CommentsText, "s)<div id=""post(.+?)"".+?data-from-id=.+?>(.+?)</a>(.+?)</span></a></div> </div> </div> </div>",match,Pos+StrLen(match))
While Pos := RegExMatch(CommentsText, "s)<div id=""post(.+?)("".+?data-from-id=.+?>.+?</a>)(.+?)(</span></a></div> </div> </div> </div>\R</div>)",match,Pos+StrLen(match))
{
   pst_cmt_lnk := match1, pst_cmt_body := "<div id=""post" match1 match2 match3 match4
   ;match3 := RegExReplace(match3, "s)<span class=""num_delim"">\s+</span>", "")
   if RegexMatch(match3, "s)<span class=""like_count _count"">(.+?)</span>", matchh)
   {
      n := 0, CmtLikesText := CmtLikesList := "", CmtLikesCount := matchh1
msgbox % matchh1
      loop
      {
         HTTP.Open("POST", "https://vk.com/wkview.php", true)
;         HTTP.SetRequestHeader("Cookie", "remixlang=0")   ; имена на русском
         HTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
         HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
         HTTP.SetRequestHeader("Pragma", "no-cache")
         HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
         HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
         HTTP.Send("act=show&al=1&al_ad=0&offset=" n "&w=likes`%2Fwall_reply" pst_cmt_lnk)
         HTTP.WaitForResponse()
         ResponseText := HTTP.ResponseText
         CmtLikesText .= "`n" ResponseText
         If ((A_Index = 1) and (RegExReplace(CmtLikesCount, "\d+") = "") and (CmtLikesCount <= 120)) or InStr(ResponseText, "<!bool><!><!json>")
            break
         If A_Index = 1
            n+=120
         else
            n+=60 ; смещение по offset
      }
      msgbox := clipboard := CmtLikesText
      matchh := "", Poss := 1
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      ;;;;While Poss := RegExMatch(CmtLikesText, "s)fans_fan_lnk.+?>(.+?)<",matchh,Poss+StrLen(matchh))
      While Poss := RegExMatch(CmtLikesText, "s)(<div class=""fans_fan_row.+?</a></div>\R</div>)",matchh,Poss+StrLen(matchh))
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         CmtLikesList .= matchh1 ", "
      CmtLikesList := SubStr(CmtLikesList, 1, StrLen(CmtLikesList) - 2)
      CmtLikesList := SubStr(CmtLikesList, 1, StrLen(CmtLikesList))
      ;;;;pst_cmt_body .= " - " CmtLikesCount " (" CmtLikesList ")"
      pst_cmt_body .= "`n`n<div id=""pst_lks"">" CmtLikesList "</div>`n"
   }
   fin .= pst_cmt_body "`n"
}
msgbox % clipboard := fin

22 (изменено: DD, 2018-04-13 20:36:29)

Re: AHK: Скачивание через GET/POST-запросы

Подсчитал количество лайкеров из %CmtLikesText%, — но там то же самое: последнюю порцию в один сдвиг лайки не добирают.

23

Re: AHK: Скачивание через GET/POST-запросы

Там после 60 поста идет json, его надо переконвертировать в хтмл и будут тогда все лайкеры.

24 (изменено: DD, 2018-04-14 01:24:40)

Re: AHK: Скачивание через GET/POST-запросы

А может дело в шаге? Оказалось, что он везде пропускает offset=60, — то есть, в переменную n подставляются 0, потом 120, 180 и т.д., как видно по MsgBox:

+ открыть спойлер
postID := "1_2285269"
post := postID, n := 0, LikesText := LikesList := ""
HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")

;--------------------------------------------
;Комментирующие и лайки к ним:
;--------------------------------------------
post := postID, n := 0, CommentsText :=""

HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
loop
{
   HTTP.Open("POST", "https://vk.com/al_wall.php", true)
;   HTTP.SetRequestHeader("Cookie", "remixlang=0")   ; имена на русском
   HTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
   HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
   HTTP.SetRequestHeader("Pragma", "no-cache")
   HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
   HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
   HTTP.Send("act=get_replies&al=1&count=1&from=wkview&offset=2&post=" post "&rev=0")
   HTTP.WaitForResponse()
   ResponseText := HTTP.ResponseText
   CommentsText .= "`n" ResponseText
   If A_Index = 1
      break
   if (n >= postCount)
      break
}

match := "", Pos := 1
;While Pos := RegExMatch(CommentsText, "s)<div id=""post(.+?)"".+?data-from-id=.+?>(.+?)</a>(.+?)</span></a></div> </div> </div> </div>",match,Pos+StrLen(match))
While Pos := RegExMatch(CommentsText, "s)<div id=""post(.+?)("".+?data-from-id=.+?>.+?</a>)(.+?)(</span></a></div> </div> </div> </div>\R</div>)",match,Pos+StrLen(match))
{
   pst_cmt_lnk := match1, pst_cmt_body := "<div id=""post" match1 match2 match3 match4
   match3 := RegExReplace(match3, "s)<span class=""num_delim"">\s+</span>", "")
   if RegexMatch(match3, "s)<span class=""like_count _count"">(.+?)</span>", matchh)
   {
      ;matchh1 := matchh1 + 60  ;!!
      n := 0, CmtLikesText := CmtLikesList := "", CmtLikesCount := matchh1
;msgbox % n
;msgbox % matchh1

      loop
      {
         HTTP.Open("POST", "https://vk.com/wkview.php", true)
;         HTTP.SetRequestHeader("Cookie", "remixlang=0")   ; имена на русском
         HTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
         HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
         HTTP.SetRequestHeader("Pragma", "no-cache")
         HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
         HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
msgbox % n
         HTTP.Send("act=show&al=1&al_ad=0&count=60&offset=" n "&w=likes`%2Fwall_reply" pst_cmt_lnk)
         HTTP.WaitForResponse()
         ResponseText := HTTP.ResponseText
         CmtLikesText .= "`n" ResponseText
         ;If ((A_Index = 1) and (CmtLikesCount <= 120)) or InStr(ResponseText, "<!bool><!><!json>")
         If ((A_Index = 1) and (RegExReplace(CmtLikesCount, "\d+") = "") and (CmtLikesCount <= 120)) or InStr(ResponseText, "<!bool><!><!json>")
            break
         If A_Index = 1
            n+=120
         else
            n+=60 ; смещение по offset
      }
      matchh := "", Poss := 1
      ;;;;While Poss := RegExMatch(CmtLikesText, "s)fans_fan_lnk.+?>(.+?)<",matchh,Poss+StrLen(matchh))
      While Poss := RegExMatch(CmtLikesText, "s)(<div class=""fans_fan_row.+?</a></div>\R</div>)",matchh,Poss+StrLen(matchh))
         CmtLikesList .= matchh1 ", "
      CmtLikesList := SubStr(CmtLikesList, 1, StrLen(CmtLikesList) - 2)
      CmtLikesList := SubStr(CmtLikesList, 1, StrLen(CmtLikesList))
      ;;;;pst_cmt_body .= " - " CmtLikesCount " (" CmtLikesList ")"
      pst_cmt_body .= "`n`n<div id=""pst_lks"">" CmtLikesList "</div>`n"
   }
   fin .= pst_cmt_body "`n"
}
;msgbox % clipboard := fin
fileappend  %fin%, %A_desktop%\%postID%.html
return

25

Re: AHK: Скачивание через GET/POST-запросы

DD пишет:

Оказалось, что он везде пропускает offset=6

Да. Так и надо делать.
В чём проблема пробежать регуляркой по json и разэкранировать символы?

26

Re: AHK: Скачивание через GET/POST-запросы

Malcev пишет:

В чём проблема пробежать регуляркой по json и разэкранировать символы?

Судя по опытам, это работает только на количестве лайков меньше тысячи, а когда больше — одна страница куда-то теряется:

post := "-22822305_377885", n := 0, LikesText := LikesList := ""

HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
loop
{
   HTTP.Open("POST", "https://vk.com/wkview.php", true)
;   HTTP.SetRequestHeader("Cookie", "remixlang=0")   ; имена на русском
   HTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
   HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
   HTTP.SetRequestHeader("Pragma", "no-cache")
   HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
   HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
   HTTP.Send("act=show&al=1&al_ad=0&offset=" n "&w=likes`%2Fwall" post)
   HTTP.WaitForResponse()
   ResponseText := HTTP.ResponseText
   LikesText .= "`n" ResponseText
   If A_Index = 1
   {
      ResponseText := RegExReplace(ResponseText, "s)<span class=""num_delim"">\s+</span>", "")
      RegExMatch(ResponseText, "s)<span class=""ui_tab_count"".+?>(.+?)<", match)
      if (RegExReplace(match1, "\d+") = "") and (match1 <= 120)
         break
   }
   If InStr(ResponseText, "<!bool><!><!json>")
      break
   If A_Index = 1
      n+=120
   else
      n+=60
}
match := "", Pos := 1  

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
LikesText := RegExReplace(LikesText, "s)\\([""|/])", "$1")
LikesText := RegExReplace(LikesText, "s)\\n\b", "`r`n")
fileappend  % LikesText, %A_desktop%\LikesText.html
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

While Pos := RegExMatch(LikesText, "s)(<div class=""fans_fan_row.+?</a></div>\R</div>)",match,Pos+StrLen(match))
   LikesList .= match1 "`n"
msgbox % clipboard := likesList
;fileappend  % likesList, %A_desktop%\%post%.html

27

Re: AHK: Скачивание через GET/POST-запросы

С чего вы это взяли?
У вас 2176 лайков и на странице показывается 2176 лайков.
В этом можно убедиться, выделив их всех на странице и скопировав исходный код.

28

Re: AHK: Скачивание через GET/POST-запросы

Я на странице вижу 2209 лайков.

29 (изменено: DD, 2018-04-14 18:11:16)

Re: AHK: Скачивание через GET/POST-запросы

Или вы имеете в виду, что их фактически не 2209?

30 (изменено: Malcev, 2018-04-14 18:05:57)

Re: AHK: Скачивание через GET/POST-запросы

Я имею в виду, что если их всех показать на странице в браузере, то их будет 2176.
https://vk.com/wall-22822305_377885?w=l … 305_377885

+ DD

31 (изменено: DD, 2018-04-14 18:11:24)

Re: AHK: Скачивание через GET/POST-запросы

Так и есть, фактически их 2176, хотя ВК показывает число 2209. Спасибо, сам бы я так не копнул)).

32

Re: AHK: Скачивание через GET/POST-запросы

В список не попадают удаленные или "временно заблокированные" профили, хотя во всплывающей подсказке бывают видны.

33 (изменено: DD, 2018-05-01 14:45:48)

Re: AHK: Скачивание через GET/POST-запросы

В продолжение темы об удаленных/заблокированных профилях среди лайков, набрёл на команду, которая выводит первые несколько профилей, среди которых могут быть видны в том числе удаленные. К примеру, для этого комментария с шестнадцатью лайками — это следующий запрос для содержимого из всплывающей подсказки:

https://vk.com/like.php?act=a_get_stats&al=1&has_share=&object=wall_reply-101965347_163

Тогда как, если перейти на стандартный список, фактически лайков будет 12, так как некоторые профили удалены или заблокированы:

https://vk.com/wall-101965347_161?w=lik … 965347_163

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

34 (изменено: DD, 2018-05-02 00:13:35)

Re: AHK: Скачивание через GET/POST-запросы

Оказалось, что в интерфейсе для разработчиков доступен список всех лайкеров (рабочую ссылку не удалось поставить, из-за множества квадратных скобок):

https://vk.com/dev/likes.getList?params[type]=comment&params[owner_id]=-101965347&params[item_id]=163&params[filter]=likes&params[friends_only]=0&params[extended]=0&params[count]=20&params[skip_own]=0&params[v]=5.74

Буду думать, какой формировать запрос.

35 (изменено: DD, 2018-05-04 17:59:55)

Re: AHK: Скачивание через GET/POST-запросы

Вроде, для полноты списка лайкеров надо обращаться к API — иначе список не полный. Хорошо бы, кабы была процедура-execute, возвращающая только деактивированных юзеров.

36

Re: AHK: Скачивание через GET/POST-запросы

Дано ли добавить условие, чтобы следующий фрагмент кода авторизации на ВК — выполнился один раз, а не каждый раз в течении сессии? —


;--------------------------------------------
;Авторизация:
;--------------------------------------------
email := "ПОЧТА"
password := "ПАРОЛЬ"

HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
HTTP.Open("GET", "https://vk.com/", true)
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send()
HTTP.WaitForResponse()
RegexMatch(HTTP.ResponseText, "s)name=""ip_h"" value=""(.+?)"".+?name=""lg_h"" value=""(.+?)""", match)
PostData := "act=login&role=al_frame&expire=&recaptcha=&captcha_sid=&captcha_key=&_origin=https`%3A`%2F`%2Fvk.com&ip_h=" match1 "&lg_h=" match2 "&email=" email "&pass=" password

HTTP.Open("POST", "https://login.vk.com/?act=login", true)
HTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send(PostData)
HTTP.WaitForResponse()

ResponseText =

37

Re: AHK: Скачивание через GET/POST-запросы

Вставьте эту часть кода под лейбл "login".
И потом "GoSub, login", когда это необходимо.

38

Re: AHK: Скачивание через GET/POST-запросы

То есть, там уже есть условие?

39 (изменено: Malcev, 2018-05-06 14:20:41)

Re: AHK: Скачивание через GET/POST-запросы

Не понимаю, что вы хотите добиться.
Если определить время, когда сайт закончит вашу сессию, то можно смотреть cookie expires, либо проверять HTTP.ResponseText на имя вашего логина.
Лично я пользуюсь последним.

+ DD

40

Re: AHK: Скачивание через GET/POST-запросы

Вроде, если проверять HTTP.ResponseText на имя логина — это надо каждый раз выполнять этот код (со скачиванием и т.д.), а я хотел возможности однократного входа с последующим его пропуском.

41

Re: AHK: Скачивание через GET/POST-запросы

А после логина у вас происходят какие-то действия или нет?
Или вы хотите просто быть всё время онлайн?

42 (изменено: DD, 2018-05-06 14:32:11)

Re: AHK: Скачивание через GET/POST-запросы

После логина выполняется код, который в начале обсуждался — скачивание страниц ВК и т.п. Вы имели в виду на них искать данные о логине?

43 (изменено: DD, 2018-05-06 15:01:25)

Re: AHK: Скачивание через GET/POST-запросы

Сейчас выяснил, что если не выполнять код авторизации перед скачиваниями страниц каждый раз — логин сбрасывается. То есть, надо авторизоваться — и потом качать страницу или еще что-то в рамках цикла. Потом в начале кода снова выполнять код авторизации и скачивать что-то. Так и должно быть?

44 (изменено: Malcev, 2018-05-06 15:15:11)

Re: AHK: Скачивание через GET/POST-запросы

DD пишет:

Вы имели в виду на них искать данные о логине?

Можно пробовать там искать.
Можно пробовать смотреть в cookie expires и релогиниться, как дата будет подходить к концу.

DD пишет:

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

При каждом создании объекта WinHTTP.WinHTTPRequest.5.1 куки сбрасываются.
А возможно, нужно самому отправлять куки с хешем вашего логина.
Надо смотреть.

45 (изменено: DD, 2018-05-06 15:40:50)

Re: AHK: Скачивание через GET/POST-запросы

Получается, посты я скачивал залогинившись, а комментарии после них — нет, потому что между ними был указан объект WinHTTP.WinHTTPRequest.5.1)).

46 (изменено: DD, 2018-05-11 18:44:10)

Re: AHK: Скачивание через GET/POST-запросы

В продолжение темы по работе с GET/POST, просьба подсказать. Сначала код ниже скачивает страницу как есть — публикацию и начало комментариев. Потом докачивает методом POST окончание комментариев и объединяет их в одной переменной: пост, начало комментариев + окончание комментариев. Затем происходит перебор комментариев, с дальнейшей задачей применить закомментированный фрагмент кода, возвращающий полные тексты комментариев, в теле которых присутствует Read more ».


#SingleInstance Force

;--------------------------------------------
;страница "как есть" — пост и начало комментариев:
;--------------------------------------------
HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
HTTP.Open("GET", "https://vigilantcitizen.com/musicbusiness/iggy-azaleas-savior-its-occult-meaning", true)
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send()
HTTP.WaitForResponse()
wc_post := HTTP.ResponseText
RegexMatch(HTTP.ResponseText, "s)""wc_post_id"":(.+?),", match)
wc_post_id = %match1%
RegexMatch(HTTP.ResponseText, "s)data-lastparentid=""(.+?)"">", match)
lastParentId = %match1%

;msgbox %wc_post_id%`n%lastParentId%


;--------------------------------------------
;продолжение комментариев с объединением всего в одной переменной:
;--------------------------------------------
Boundary := RandomBoundary()
data =
(
-----------------------------%Boundary%
Content-Disposition: form-data; name="action"

loadMoreComments
-----------------------------%Boundary%
Content-Disposition: form-data; name="offset"

1
-----------------------------%Boundary%
Content-Disposition: form-data; name="orderBy"

by_vote
-----------------------------%Boundary%
Content-Disposition: form-data; name="order"

desc
-----------------------------%Boundary%
Content-Disposition: form-data; name="lastParentId"

%lastParentId%
-----------------------------%Boundary%
Content-Disposition: form-data; name="wpdiscuz_last_visit"

undefined
-----------------------------%Boundary%
Content-Disposition: form-data; name="postId"

%wc_post_id%
-----------------------------%Boundary%--

)

HTTP.Open("POST", "https://vigilantcitizen.com/wp-admin/admin-ajax.php", true)
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.SetRequestHeader("Content-Type", "multipart/form-data; boundary=---------------------------" Boundary)
HTTP.Send(data)
HTTP.WaitForResponse()
loadMoreComments := HTTP.ResponseText
;msgbox % ResponseText

loadMoreComments := RegExReplace(loadMoreComments, "s)\\n", "`r`n")
loadMoreComments := RegExReplace(loadMoreComments, "s)\\/", "/")
loadMoreComments := RegExReplace(loadMoreComments, "s)\\""", """")

wc_post := RegExReplace(wc_post, "s)<div class=""wpdiscuz-comment-pagination"">.*\Z", "")

wc_post_and_comments .= wc_post "`n" loadMoreComments

;fileappend, %wc_post_and_comments%`n, %a_desktop%\post_all.txt




;--------------------------------------------
;перебор комментариев
;--------------------------------------------
match := "", Pos := 1
While Pos := RegExMatch(wc_post_and_comments, "s)(<div id=""comment-)(.+?)("".*?wc_comment_level-\d+"">|""  style=""clear:both""></div></div>)",match,Pos+StrLen(match))
{
   cmts_body := match1 match2 match3
   commentId := match2
   ;fileappend, %cmts_body%`n`n`n`n, %a_desktop%\cmts.txt
}



/*

;--------------------------------------------
;разворачивание полного текста комментария:
;--------------------------------------------
Boundary := RandomBoundary()
data =
(
-----------------------------%Boundary%
Content-Disposition: form-data; name="action"

readMore
-----------------------------%Boundary%
Content-Disposition: form-data; name="commentId"

%commentId%
-----------------------------%Boundary%
Content-Disposition: form-data; name="postId"

%wc_post_id%
-----------------------------%Boundary%--

)

HTTP.Open("POST", "https://vigilantcitizen.com/wp-admin/admin-ajax.php", true)
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.SetRequestHeader("Content-Type", "multipart/form-data; boundary=---------------------------" Boundary)
HTTP.Send(data)
HTTP.WaitForResponse()
msgbox % HTTP.ResponseText

*/


RandomBoundary()
{
   str := "0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z"
   Sort, str, D| Random
   str := StrReplace(str, "|")
   Return SubStr(str, 1, 12)
}

47 (изменено: DD, 2018-05-11 19:00:17)

Re: AHK: Скачивание через GET/POST-запросы

Кстати, насчёт execute процедуры — со следующей можно получать 5000 лайков к посту/комменту за раз —

+ открыть спойлер
// 
// 5000 лайков к посту/комменту за раз
// Формат вызова
// https://api.vk.com/method/execute.get_5000_LikesToPstOrCmt?type=[POST/COMMENT]&owner_id=[OWNER_ID]&item_id=[ITEM_ID]&extended=[1/0]&offset=0&v=5.74&access_token=[TOKEN]
// 
// Шаг/offset: 0, 5000, 10000, 15000, 20000, 25000 ...
// 
var owner_id = Args.owner_id;
var item_id  = Args.item_id;
var offset   = Args.offset;
var extended = Args.extended;
var type     = Args.type;
//var filter   = Args.filter;

return
    API.likes.getList({
        "type":type,
        "owner_id":owner_id,
        "item_id":item_id,
        "count":1000,
        "extended":extended,
        "filter":"likes",
        "lang":"ru",
        "offset"   : parseInt(offset) + 0 * 1000
    }).items + 
    API.likes.getList({
        "type":type,
        "owner_id":owner_id,
        "item_id":item_id,
        "count":1000,
        "extended":extended,
        "filter":"likes",
        "lang":"ru",
        "offset"   : parseInt(offset) + 1 * 1000
    }).items +
    API.likes.getList({
        "type":type,
        "owner_id":owner_id,
        "item_id":item_id,
        "count":1000,
        "extended":extended,
        "filter":"likes",
        "lang":"ru",
        "offset"   : parseInt(offset) + 2 * 1000
    }).items + 
    API.likes.getList({
        "type":type,
        "owner_id":owner_id,
        "item_id":item_id,
        "count":1000,
        "extended":extended,
        "filter":"likes",
        "lang":"ru",
        "offset"   : parseInt(offset) + 3 * 1000
    }).items +
    API.likes.getList({
        "type":type,
        "owner_id":owner_id,
        "item_id":item_id,
        "count":1000,
        "extended":extended,
        "filter":"likes",
        "lang":"ru",
        "offset"   : parseInt(offset) + 4 * 1000
    }).items; 

48

Re: AHK: Скачивание через GET/POST-запросы

Так а в чём собственно вопрос?
Перебирайте комментарии в цикле и если есть в них таг read more, то посылайте multipart/form-data запрос.

49 (изменено: DD, 2018-05-11 21:05:13)

Re: AHK: Скачивание через GET/POST-запросы

Точно, спасибо. А я за чем-то внутри цикла пытался это сделать, как с примерами кодов для ВК. Осталось непонятным, как такого плана символы \u00bb, которые встречаются в комментариях — преобразовывать в HTML-код? Нет ли преобразователя на AHK?

50

Re: AHK: Скачивание через GET/POST-запросы

Так попробуйте:

msgbox % JavaEscapedToHtml("\u00bbtest\u00bb")

JavaEscapedToHtml(s) {
    i := 1
    while j := RegExMatch(s, "\\u[A-Fa-f0-9]{1,4}", m, i)
        e .= SubStr(s, i, j-i) Chr("0x" SubStr(m, 3)), i := j + StrLen(m)
    Transform, OutputVar, HTML, % e . SubStr(s, i)
    return OutputVar
}
+ DD

51 (изменено: DD, 2018-05-11 23:48:15)

Re: AHK: Скачивание через GET/POST-запросы

Круто, спасибо! Можно ли будет задать игнорируемые символы — в частности, угловые скобки (тэги), а то они переделываются в &lt;&gt;? Или может имеется код, преобразующий юникод в готовые символы, как есть? —

\u2026   —>   
\u201d   —>   

52 (изменено: DD, 2018-05-11 23:59:52)

Re: AHK: Скачивание через GET/POST-запросы

Нашёл)) —

HTM =
(
<p>Your comment is correct, and I would like to add more&#8230; Crucifixion was not only a death sentence, but a form of cruel torture that sometimes took days for one to die as the individual endured excruciation pain beforehand&#8230; The scribes, and Pharisee&#8217;s who hated Jesus (not all did), wanted to humiliate our Savior to the utmost while demanding that the Roman governor Pilate execute HIM in this manner&#8230; Of course scripture had to fulfilled, but never the less, their hatred for Jesus was nothing more than Satanically inspired&#8230; </p>
<p>The cross is a pagan symbol that was used to honor Tammuz&#8230; The ancient son of Semiramis, who was worshiped by many as a goddess&#8230; Thus making her son a god in the eyes of the population&#8230; The ancient Israelites were shown to be worshiping Tammuz in the temple of God by weeping for this false god within Ezekiel chapter 8&#8230;<br />
&#8220;13 And He said to me, \u201cTurn again, and you will see greater abominations that they are doing.\u201d 14 So He brought me to the door of the north gate of the Lord\u2019s house; and to my dismay, women were sitting there weeping for Tammuz.&#8221;</p>
<p>Crucifixion was basically a sacrifice to the so called god Tammuz&#8230; Thus the scribes, and Pharisee&#8217;s were trying their best to discredit the Son of God&#8230; But it does not matter what these man thought, or imagined, that sacrifice of our Savior (the perfect Lamb of God) was necessary for the redemption of mankind&#8217;s sins&#8230; Only through HIM is anyone forgiven for the remission of sin&#8230;
)
HTM := JavaEscapedToHtml(HTM)
HTM := UnHTM(HTM)
msgbox % HTM


JavaEscapedToHtml(s) {
    i := 1
    while j := RegExMatch(s, "\\u[A-Fa-f0-9]{1,4}", m, i)
        e .= SubStr(s, i, j-i) Chr("0x" SubStr(m, 3)), i := j + StrLen(m)
    Transform, OutputVar, HTML, % e . SubStr(s, i)
    return OutputVar
}

UnHTM( HTM ) { ; Remove HTML formatting / Convert to ordinary text     by SKAN 19-Nov-2009
   Static HT     ; Forum Topic: www.autohotkey.com/forum/topic51342.html
   IfEqual,HT,,   SetEnv,HT, % "&aacuteá&acircâ&acute´&aeligæ&agraveà&amp&aringå&atildeã&au"
 . "mlä&bdquo„&brvbar¦&bull•&ccedilç&cedil¸&cent¢&circˆ&copy©&curren¤&dagger†&dagger‡&deg"
 . "°&divide÷&eacuteé&ecircê&egraveè&ethð&eumlë&euro€&fnofƒ&frac12½&frac14¼&frac34¾&gt>&h"
 . "ellip…&iacuteí&icircî&iexcl¡&igraveì&iquest¿&iumlï&laquo«&ldquo“&lsaquo‹&lsquo‘&lt<&m"
 . "acr¯&mdash—&microµ&middot·&nbsp &ndash–&not¬&ntildeñ&oacuteó&ocircô&oeligœ&ograveò&or"
 . "dfª&ordmº&oslashø&otildeõ&oumlö&para¶&permil‰&plusmn±&pound£&quot""&raquo»&rdquo”&reg"
 . "®&rsaquo›&rsquo’&sbquo‚&scaronš&sect§&shy&sup1¹&sup2²&sup3³&szligß&thornþ&tilde˜&tim"
 . "es×&trade™&uacuteú&ucircû&ugraveù&uml¨&uumlü&yacuteý&yen¥&yumlÿ"

   HTM := RegExReplace( HTM,"&amp;(\w+;)", "&$1" )   ;!! для обработки &amp;lt; 
   HTM := RegExReplace( HTM,"&amp;(#\d+;)", "&$1" )  ;!! для обработки &amp;#60;

   TXT := RegExReplace( HTM,"<[^>]+>", " " )               ; Remove all tags between  "<" and ">"
   Loop, Parse, TXT, &`;                              ; Create a list of special characters
      L := "&" A_LoopField ";", R .= (!(A_Index&1)) ? ( (!InStr(R,L,1)) ? L:"" ) : ""
   StringTrimRight, R, R, 1
   Loop, Parse, R , `;                                ; Parse Special Characters
      If F := InStr( HT, A_LoopField )                  ; Lookup HT Data
         StringReplace, TXT,TXT, %A_LoopField%`;, % SubStr( HT,F+StrLen(A_LoopField), 1 ), All
   Else If ( SubStr( A_LoopField,2,1)="#" )
      StringReplace, TXT, TXT, %A_LoopField%`;, % Chr(SubStr(A_LoopField,3)), All

   TXT := RegExReplace(TXT, " +", " ")       ;!! множественные пробелы на один
   TXT := RegExReplace(TXT, "m)(*UCP)(?<=\s|^)""(?=\w)", "«")      ;!! кавычки
   TXT := RegExReplace(TXT, "m)(*UCP)(?<=[^\s""])""(?=\W|$)", "»") ;!! кавычки

;!! кавычки
loop, 10
{
      TXT := RegExReplace(TXT, "«([^«»]*)«([^«»]*)»", "«$1«$2»")
      TXT := RegExReplace(TXT, " ""([\s?\)\]\}\,\.\:\;\!\?…""'])", "n~b~s~p""$1")
      TXT := RegExReplace(TXT, "((^|[\s]|&nbsp;)([\(\[\{""]|\d+)*)([""])(\S([^""]*?|.*?\x20[""]\x20.*?)\S|[^""\s])[""]((\d+|[\)\]\}\,\.\:\;\!\?…""])*($|[\s]|&nbsp;))", "$1«$5»$7")
      TXT := RegExReplace(TXT, "n~b~s~p", " ")
      TXT := RegExReplace(TXT, "«([^«»]*)«([^«»]*)»", "«$1„$2“")
}

   Return RegExReplace( TXT, "(^\s*|\s*$)")            ; Remove leading/trailing white spaces
}

53 (изменено: Malcev, 2018-05-12 02:14:28)

Re: AHK: Скачивание через GET/POST-запросы

DD пишет:

Или может имеется код, преобразующий юникод в готовые символы, как есть? —

msgbox % JavaEscapedToHtml("\u2026test\u00bb")

JavaEscapedToHtml(s) {
    i := 1
    while j := RegExMatch(s, "\\u[A-Fa-f0-9]{1,4}", m, i)
        e .= SubStr(s, i, j-i) Chr("0x" SubStr(m, 3)), i := j + StrLen(m)
    return e . SubStr(s, i)
}
+ DD

54

Re: AHK: Скачивание через GET/POST-запросы

Авторизация на ВК перестала работать. Капчу добавили?

55

Re: AHK: Скачивание через GET/POST-запросы

Ну я вам уже объяснял как получить данные для отправки.
Посмотрите, что отправляете в IE и повторите тоже самое в скрипте.

56

Re: AHK: Скачивание через GET/POST-запросы

Имелось в виду, что скрипт авторизации, который работал вчера — сегодня не работает. У вас получается залогиниться с помощью кода по ссылке?

57

Re: AHK: Скачивание через GET/POST-запросы

С помощью моего, да.
http://forum.script-coding.com/viewtopi … 83#p124583

+ DD

58 (изменено: DD, 2018-08-20 14:21:53)

Re: AHK: Скачивание через GET/POST-запросы

Я тот же использую). Сейчас заработало — видимо, по IP блокировали.

59

Re: AHK: Скачивание через GET/POST-запросы

Постепенно назрел вопрос скачивания изображений из страниц, получаемых через GET/POST-запросы. Нет ли чего готового? Как быть при скачивании вот таких образцов из Фейсбука? —

+ открыть спойлер

https://z-p3-external-frt3-2.xx.fbcdn.net/safe_image.php?d=AQC3zNibI5IvR9xS&w=56&h=56&url=https%3A%2F%2Fi.ytimg.com%2Fvi%2Fj_b68PLpptE%2Fmaxresdefault.jpg&cfs=1&jq=75&sx=560&sy=0&sw=720&sh=720&ext=jpg&_nc_hash=AQCtNqSvG2JiJbch
https://z-p3-static.xx.fbcdn.net/rsrc.php/v3/y8/r/sEX739EOBGI.png
https://z-p3-external-frt3-2.xx.fbcdn.net/safe_image.php?d=AQCD1xocR0u8pGcr&w=56&h=56&url=https%3A%2F%2Fi.ytimg.com%2Fvi%2FohApS9e56z8%2Fhqdefault.jpg&cfs=1&jq=75&sx=33&sy=0&sw=360&sh=360&ext=jpg&_nc_hash=AQDTIEG1tWbIB793

P.S. Кстати, в расширенном поиске указал "POST" в ключевых словах для "только заголовков" — и настоящая тема почему-то не нашлась.

60

Re: AHK: Скачивание через GET/POST-запросы

А в чём проблема-то? Сохраняете responseBody в файл, примеры вроде есть.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

61

Re: AHK: Скачивание через GET/POST-запросы

http://forum.script-coding.com/viewtopic.php?id=9592

62 (изменено: DD, 2018-09-21 23:49:56)

Re: AHK: Скачивание через GET/POST-запросы

teadrinker
Имелась в виду ситуация, когда в responseBody находится список изображений (в т.ч. по образцу выше) и задача их все скачать — меняя пути на локальные, обрабатывая с учётом запрещенных символов (в т.ч. в ссылках на скачивание, напр., % — на `%), длины имён, уже существующих в директории файлов с теми же именами, но с др. размером, и т.п. Наверняка кто-то уже написал такую подпрограмму?

Malcev
Спасибо, кое-то приметил. К примеру, как настроить следующий код оттуда — на загрузку списка изображений, полученного из responseBody? —


#SingleInstance Force

Global Dir := "C:\Tmp\"
url = https://z-p3-external-frt3-2.xx.fbcdn.net/safe_image.php?d=AQC3zNibI5IvR9xS&w=56&h=56&url=https`%3A`%2F`%2Fi.ytimg.com`%2Fvi`%2Fj_b68PLpptE`%2Fmaxresdefault.jpg&cfs=1&jq=75&sx=560&sy=0&sw=720&sh=720&ext=jpg&_nc_hash=AQCtNqSvG2JiJbch
 
MsgBox % Download(url) 
Return 

Download(Location)
{
    Global Path, FullSize, KBSize 
    Info := HttpQueryInfo(Location, 22)  
    RegexMatch(Info, "i).*? (.*?)\R", stat)
    If !InStr(stat1, "200 OK")
        Return "Error: " stat1
    RegexMatch(Info, "i)\RContent-Disposition: .*?filename=""(?<D>.*?)""", C)   
    If CD !=  
        Path := CD
    Else
    { 
        SplitPath, Location, FileName, , Ext, NameNoExt 
        RegexMatch(Info, "i)\RContent-Type: (.*?/(.*?))\R", CT)   
        RegRead, ExtMIME, HKEY_CLASSES_ROOT, MIME\Database\Content Type\%CT1%, Extension  
        If (ExtMIME != "")
           Path := NameNoExt ExtMIME
        Else If (Ext = "" && CT2 != "")
            Path := NameNoExt "." CT2
        Else
            Path := FileName
    }
    If !Path
        Return "Error: Path not found"  
    RegexMatch(Info, "i)\RContent-Length: (?<L>.*?)\R", C), FullSize := CL
    Path := Dir Path ;!!
    MsgBox % Path "`n`n" KBSize := Floor(FullSize/1024) "KB"
    SetTimer, GetSize, 100 



StringReplace, Path, Path, ?, _, All

    UrlDownloadToFile, %Location%, %Path%   
    SetTimer, GetSize, -1
    Progress, Hide
    Return "Complete"
}

GetSize: 
    FSize := FileOpen(Path, "r").Length 
    Percent := Floor((FSize / FullSize) * 100)  
    Progress, %Percent%, %Percent%`% Complete, Downloading... 
        , % Floor(FSize/1024) "KB / " KBSize " || " Path 
    Return
 
Esc::   
    ExitApp

HttpQueryInfo(URL, QueryInfoFlag=21, Proxy="", ProxyBypass="")
{
   hModule := DllCall("LoadLibrary", "str", "wininet.dll", Ptr)
   AccessType := Proxy = "" ? 1 : 3
   
   Loop 1
   {
      Error := 1
      if !io_hInternet := DllCall("wininet\InternetOpen", "str", "", "uint", AccessType, "str", Proxy, "str", ProxyBypass, "uint", 0, Ptr) ;dwFlags
         break
      
      if !iou_hInternet := DllCall("wininet\InternetOpenUrl", Ptr, io_hInternet, "str", url, "str", "", "uint", 0, "uint", 0x80000000, "uint", 0)
         break
      
      VarSetCapacity(buffer_len, 4, 0) 
      Loop
      {         
         if A_Index = 3
            break 2
         
         VarSetCapacity(buffer, NumGet(&buffer_len+0, "UInt"))
         hqi := DllCall("wininet\HttpQueryInfo", Ptr, iou_hInternet, "uint", QueryInfoFlag, Ptr, &buffer, Ptr, &buffer_len, "uint", 0)
      } Until hqi
      Error := ""
   }
   
   DllCall("wininet\InternetCloseHandle",  Ptr, iou_hInternet)
   DllCall("wininet\InternetCloseHandle",  Ptr, io_hInternet)
   DllCall("FreeLibrary", Ptr, hModule)
   
   Return, Error ? -1 : StrGet(&buffer)
}

63

Re: AHK: Скачивание через GET/POST-запросы

Из responseBody либо через ado либо через rawwrite:
http://forum.script-coding.com/viewtopi … 761#p83761

64

Re: AHK: Скачивание через GET/POST-запросы

А вот если получил я список изображений и скачиваю в подпрограмме — получается, после загрузки каждого изображения из списка, надо новое локальное имя этого файла отражать в responseBody? То есть, каждый раз заменять гиперссылку из responseBody на новый локальный путь картинки, или можно иначе? И не было ли тут примера такой обработки?

65

Re: AHK: Скачивание через GET/POST-запросы

Если вы получаете в ответе от сервера список картинок, то надо этот список парсить и загружать каждую картинку отдельно.

66 (изменено: DD, 2018-09-22 14:44:23)

Re: AHK: Скачивание через GET/POST-запросы

То есть, надо перебирать по одной ссылке из responseBody — находить, например, такое:

src="https://z-p3-static.xx.fbcdn.net/rsrc.php/v3/y8/r/sEX739EOBGI.png"

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

67

Re: AHK: Скачивание через GET/POST-запросы

Можно и из 62, а можно и через WinHttpRequest.

68

Re: AHK: Скачивание через GET/POST-запросы

А что эффективней? Достаточно будет заменить

UrlDownloadToFile, %Location%, %Path%

на код с WinHttpRequest? И непонятно, как обрабатывать дубликаты изображений — когда, например, с одной страницы это —

src="https://z-p3-static.xx.fbcdn.net/rsrc.php/v3/y8/r/sEX739EOBGI.png"

скачалось как это, —

src="../sEX739EOBGI.png"

а на другой, получается, его тоже надо скачать, чтобы выяснить, было оно ранее загружено или нет?

69

Re: AHK: Скачивание через GET/POST-запросы

Здесь или на оф. форуме нет примера загрузки страницы с изображениями?

70

Re: AHK: Скачивание через GET/POST-запросы

Я бы создавал список, то чего уже скачал, чтобы не было дубликатов, потом через Winhttprequest определял бы расширение и размер скачиваемого файла и сохранял бы через rawwrite.

DD пишет:

Здесь или на оф. форуме нет примера загрузки страницы с изображениями?

Не знаю. Я давно перестал этим интересоваться.

71 (изменено: DD, 2018-09-28 19:50:07)

Re: AHK: Скачивание через GET/POST-запросы

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

Но как сделать, чтобы при ошибке скачивания, было уведомление? Пойдёт, если проверять существование после скачивания?

#SingleInstance Force

Global Dir := "C:\Tmp\"
url = 
(
https://z-p3-external-frt3-2.xx.fbcdn.net/safe_image.php?d=AQC3zNibI5IvR9xS&w=56&h=56&url=https`%3A`%2F`%2Fi.ytimg.com`%2Fvi`%2Fj_b68PLpptE`%2Fmaxresdefault.jpg&cfs=1&jq=75&sx=560&sy=0&sw=720&sh=720&ext=jpg&_nc_hash=AQCtNqSvG2JiJbch
https://z-p3-static.xx.fbcdn.net/rsrc.php/v3/y8/r/sEX739EOBGI.png
https://z-p3-external-frt3-2.xx.fbcdn.net/safe_image.php?d=AQCD1xocR0u8pGcr&w=56&h=56&url=https`%3A`%2F`%2Fi.ytimg.com`%2Fvi`%2FohApS9e56z8`%2Fhqdefault.jpg&cfs=1&jq=75&sx=33&sy=0&sw=360&sh=360&ext=jpg&_nc_hash=AQDTIEG1tWbIB793
https://docs.google.com/document/d/1jhW6J2gCY1eMO7p4nUto0Yn7Z5SWOFL2rNs6V5ZC7D8/
)

Loop, parse, url, `n
{
ths := A_LoopField
url := Download(ths) 
}
Return 

Download(Location)
{
    Global Path, FullSize, KBSize 
    Info := HttpQueryInfo(Location, 22)  
    RegexMatch(Info, "i).*? (.*?)\R", stat)
    If !InStr(stat1, "200 OK")
        Return "Error: " stat1
    RegexMatch(Info, "i)\RContent-Disposition: .*?filename=""(?<D>.*?)""", C)   
    If CD !=  
        Path := CD
    Else
    { 
        SplitPath, Location, FileName, , Ext, NameNoExt 
        RegexMatch(Info, "i)\RContent-Type: (.*?/(.*?))\R", CT)   
        RegRead, ExtMIME, HKEY_CLASSES_ROOT, MIME\Database\Content Type\%CT1%, Extension  
        If (ExtMIME != "")
        {
           Path := NameNoExt ExtMIME
           SplitPath, Path, , , thsExt,  	;!!add
           ;MsgBox 1 %thsExt%  			;!!add
        }
        Else If (Ext = "" && CT2 != "")
        {

            CT2:=RegExReplace(CT2,"^(.*?)(`; charset=utf-8)?$", "$1")
            Path := NameNoExt "." CT2
            MsgBox 2 %Path%
        }
        Else
        {
            Path := FileName
            MsgBox 3 %Path%
        }
    }
    If !Path
        Return "Error: Path not found"  
    RegexMatch(Info, "i)\RContent-Length: (?<L>.*?)\R", C), FullSize := CL
    Path := Dir Path ;!!
    ;!!MsgBox % Path "`n`n" Location "`n`n" KBSize := Floor(FullSize/1024) "KB"
    ;!!SetTimer, GetSize, 100 

    StringReplace, Path, Path, ?, _, All  	;!!add
    Location2 := Location "." thsExt  		;!!add
    Location2:=ValidName(Location2)  		;!!add
    ;MsgBox 3 %Location2%  			;!!add

    If NOT FileExist(Dir Location2)
        UrlDownloadToFile, %Location%, %Dir%%Location2%   
    ;!!SetTimer, GetSize, -1
    ;!!Progress, Hide
    Return "Complete"
}

GetSize: 
    FSize := FileOpen(Path, "r").Length 
    Percent := Floor((FSize / FullSize) * 100)  
    Progress, %Percent%, %Percent%`% Complete, Downloading... 
        , % Floor(FSize/1024) "KB / " KBSize " || " Path 
    Return
 

HttpQueryInfo(URL, QueryInfoFlag=21, Proxy="", ProxyBypass="")
{
   hModule := DllCall("LoadLibrary", "str", "wininet.dll", Ptr)
   AccessType := Proxy = "" ? 1 : 3
   
   Loop 1
   {
      Error := 1
      if !io_hInternet := DllCall("wininet\InternetOpen", "str", "", "uint", AccessType, "str", Proxy, "str", ProxyBypass, "uint", 0, Ptr) ;dwFlags
         break
      
      if !iou_hInternet := DllCall("wininet\InternetOpenUrl", Ptr, io_hInternet, "str", url, "str", "", "uint", 0, "uint", 0x80000000, "uint", 0)
         break
      
      VarSetCapacity(buffer_len, 4, 0) 
      Loop
      {         
         if A_Index = 3
            break 2
         
         VarSetCapacity(buffer, NumGet(&buffer_len+0, "UInt"))
         hqi := DllCall("wininet\HttpQueryInfo", Ptr, iou_hInternet, "uint", QueryInfoFlag, Ptr, &buffer, Ptr, &buffer_len, "uint", 0)
      } Until hqi
      Error := ""
   }
   
   DllCall("wininet\InternetCloseHandle",  Ptr, iou_hInternet)
   DllCall("wininet\InternetCloseHandle",  Ptr, io_hInternet)
   DllCall("FreeLibrary", Ptr, hModule)
   
   Return, Error ? -1 : StrGet(&buffer)
}

ValidName(n,r="")
{
    ;;n:=RegExReplace(n,"(:|;|,|\*|\?|\\|/|<|>|"")"," ")
    n:=RegExReplace(n,"(https?://)","")
    n:=RegExReplace(n,"(\.\w+)\1$","$1")
    n:=RegExReplace(n,"(:|\\)","-")
    n:=RegExReplace(n,"(/)","=")
    n:=RegExReplace(n,"(,|\*|\?|<|>)","_")
    n:=RegExReplace(n,"(;|"")","'")
    n:=RegExReplace(n,"\s+"," ")
    StringReplace n, n, |, -, All
    If r
        StringReplace n, n, % " ", % r, All
    return Trim(n)
}

72

Re: AHK: Скачивание через GET/POST-запросы

DD пишет:

как сделать, чтобы при ошибке скачивания, было уведомление?

Нужно почитать про команды, которые используете.
В частности UrlDownloadToFile.

+ DD

73

Re: AHK: Скачивание через GET/POST-запросы

А без разницы в данном случае, скачивать через WinHttpRequest или UrlDownloadToFile?

74

Re: AHK: Скачивание через GET/POST-запросы

Разница в том, что WinHttpRequest скачивает весь файл в оперативную память, а UrlDownloadToFile записывает частями на диск.
По скорости не сравнивал.

75

Re: AHK: Скачивание через GET/POST-запросы

Добавляю в список на скачивание — ссылку на не существующее изо, и все равно уведомление не выводится. С чего бы?


        UrlDownloadToFile, %Location%, %Dir%%Location2%
        If ErrorLevel
            msgbox %Location% "`n`nnot dwn"

76

Re: AHK: Скачивание через GET/POST-запросы

Могу только повторить, что написал в 72 посте.

77

Re: AHK: Скачивание через GET/POST-запросы

Получается, с UrlDownloadToFile успешную загрузку нельзя выявить? Тогда лучше WinHttpRequest использовать, или проверять по FileExist после отработки UrlDownloadToFile ?

78

Re: AHK: Скачивание через GET/POST-запросы

Так файл будет существовать, только не исо, а со страницей 404.
У вас же в функции проверяются хедеры:

    Info := HttpQueryInfo(Location, 22)  
    RegexMatch(Info, "i).*? (.*?)\R", stat)
    If !InStr(stat1, "200 OK")
        Return "Error: " stat1

Вы понимаете по какому алгоритму работает код?

79 (изменено: DD, 2018-09-28 22:13:05)

Re: AHK: Скачивание через GET/POST-запросы

Я имел в виду не ситуацию со страницей 404, а когда например изоб. не сохранилось из-за недопустимой длины, например, или потому что соединение ненадолго прервалось. В этом случае проверка существования сработает? Некоторое представление по алгоритму есть)).

80

Re: AHK: Скачивание через GET/POST-запросы

По идее должно, но надо проверять.

81

Re: AHK: Скачивание через GET/POST-запросы

Ок, спасибо.

82

Re: AHK: Скачивание через GET/POST-запросы

Баги:

url := "http://counter.yadro.ru/hit?t44.6;rhttps%3A//www.google.com/;s1920*1080*24;uhttp%3A//aydenfamilydentistry.com/viewtopic.php%3Ft%3D953254;h%u0414%u043E%u0441%u0442%u0443%u043F%20%u043A%20%u0434%u0430%u043D%u043D%u043E%u043C%u0443%20%u043C%u0430%u0442%u0435%u0440%u0438%u0430%u043B%u0443%20%u043E%u0433%u0440%u0430%u043D%u0438%u0447%u0435%u043D%20%u043F%u0440%u0430%u0432%u043E%u043E%u0431%u043B%u0430%u0434%u0430%u0442%u0435%u043B%u0435%u043C.;0.17554469522970428"
url := "https://vignette.wikia.nocookie.net/madmen/images/c/cf/002.jpg.php_229x344.jpg/revision/latest?cb=20100806000458"

83 (изменено: DD, 2018-09-29 11:42:07)

Re: AHK: Скачивание через GET/POST-запросы

Вот так gif теперь обрабатывается, — но почему не с jpg?

#SingleInstance Force

Global Dir4Pics := "C:\Tmp\"
url_lst = 
(
https://vignette.wikia.nocookie.net/madmen/images/c/cf/002.jpg.php_229x344.jpg/revision/latest?cb=20100806000458
http://counter.yadro.ru/hit?t44.6;rhttps`%3A//www.google.com/;s1920*1080*24;uhttp`%3A//aydenfamilydentistry.com/viewtopic.php`%3Ft`%3D953254;h`%u0414`%u043E`%u0441`%u0442`%u0443`%u043F`%20`%u043A`%20`%u0434`%u0430`%u043D`%u043D`%u043E`%u043C`%u0443`%20`%u043C`%u0430`%u0442`%u0435`%u0440`%u0438`%u0430`%u043B`%u0443`%20`%u043E`%u0433`%u0440`%u0430`%u043D`%u0438`%u0447`%u0435`%u043D`%20`%u043F`%u0440`%u0430`%u0432`%u043E`%u043E`%u0431`%u043B`%u0430`%u0434`%u0430`%u0442`%u0435`%u043B`%u0435`%u043C.;0.17554469522970428
)

Loop, parse, url_lst, `n
{
ths := A_LoopField
url_lst := Download(ths) 
}
Return

Download(Location)
{
    Global Path, FullSize, KBSize 
    Info := HttpQueryInfo(Location, 22)  
    RegexMatch(Info, "i).*? (.*?)\R", stat)
    If !InStr(stat1, "200 OK")
        Return "Error: " stat1
    RegexMatch(Info, "i)\RContent-Disposition: .*?filename=""(?<D>.*?)""", C) 
    If CD !=  
        Path := CD
    Else
    { 
        SplitPath, Location, FileName, , Ext, NameNoExt 
        RegexMatch(Info, "i)\RContent-Type: (.*?/(.*?))\R", CT)
MsgBox %Info%`n`n%CT%  			;!!add
        RegRead, ExtMIME, HKEY_CLASSES_ROOT, MIME\Database\Content Type\%CT1%, Extension
        If (ExtMIME != "")
        {
            Path := NameNoExt ExtMIME
;thsExt := ExtMIME
            SplitPath, Path, , , thsExt,  	;!!add
            ;MsgBox 1 %thsExt%  			;!!add
        }
        Else If (Ext = "" && CT2 != "")
        {

            CT2:=RegExReplace(CT2,"^(.*?)(`; charset=utf-8)?$", "$1")
            Path := NameNoExt "." CT2
            MsgBox 2 %Path%
        }
        Else
        {
            Path := FileName
            MsgBox 3`n %Path%`n%thsExt%
        }
    }
    If !Path
        Return "Error: Path not found"  
    RegexMatch(Info, "i)\RContent-Length: (?<L>.*?)\R", C), FullSize := CL
    Path := Dir4Pics Path ;!!
    ;!!MsgBox % Path "`n`n" Location "`n`n" KBSize := Floor(FullSize/1024) "KB"
    ;!!SetTimer, GetSize, 100 

    StringReplace, Path, Path, ?, _, All  	;!!add
    Location2 := Location "." thsExt  		;!!add
    Location2 := ValidName(Location2)  		;!!add
    ;MsgBox 3 %Location2%  			;!!add

    If NOT FileExist(Dir4Pics Location2)
    {
        UrlDownloadToFile, %Location%, %Dir4Pics%%Location2%
        If NOT FileExist(Dir4Pics Location2)
            msgbox %Location% not dwn
    }

    StringReplace, Location2, Location2, `n, , All
    StringReplace, all, all, src="%Location%", src="pic/%Location2%", All

    ;!!SetTimer, GetSize, -1
    ;!!Progress, Hide
    Return "Complete"
}

GetSize: 
    FSize := FileOpen(Path, "r").Length 
    Percent := Floor((FSize / FullSize) * 100)  
    Progress, %Percent%, %Percent%`% Complete, Downloading... 
        , % Floor(FSize/1024) "KB / " KBSize " || " Path 
    Return
 

HttpQueryInfo(URL, QueryInfoFlag=21, Proxy="", ProxyBypass="")
{
   hModule := DllCall("LoadLibrary", "str", "wininet.dll", Ptr)
   AccessType := Proxy = "" ? 1 : 3
   
   Loop 1
   {
      Error := 1
      if !io_hInternet := DllCall("wininet\InternetOpen", "str", "", "uint", AccessType, "str", Proxy, "str", ProxyBypass, "uint", 0, Ptr) ;dwFlags
         break
      
      if !iou_hInternet := DllCall("wininet\InternetOpenUrl", Ptr, io_hInternet, "str", url, "str", "", "uint", 0, "uint", 0x80000000, "uint", 0)
         break
      
      VarSetCapacity(buffer_len, 4, 0) 
      Loop
      {         
         if A_Index = 3
            break 2
         
         VarSetCapacity(buffer, NumGet(&buffer_len+0, "UInt"))
         hqi := DllCall("wininet\HttpQueryInfo", Ptr, iou_hInternet, "uint", QueryInfoFlag, Ptr, &buffer, Ptr, &buffer_len, "uint", 0)
      } Until hqi
      Error := ""
   }
   
   DllCall("wininet\InternetCloseHandle",  Ptr, iou_hInternet)
   DllCall("wininet\InternetCloseHandle",  Ptr, io_hInternet)
   DllCall("FreeLibrary", Ptr, hModule)
   
   Return, Error ? -1 : StrGet(&buffer)
}

ValidName(n,r="")
{
    ;;n:=RegExReplace(n,"(:|;|,|\*|\?|\\|/|<|>|"")"," ")
    n:=RegExReplace(n,"(https?://)","")
    n:=RegExReplace(n,"(\.\w+)\1$","$1")
    n:=RegExReplace(n,"(:|\\)","-")
    n:=RegExReplace(n,"(/)","=")
    n:=RegExReplace(n,"(,|\*|\?|<|>)","_")
    n:=RegExReplace(n,"(;|"")","'")
    n:=RegExReplace(n,"\s+"," ")
    StringReplace n, n, |, -, All

    StrLen(n)
    if n > 150
    {
        n:=RegExReplace(n,"^(.{100,120}).*(\.\w+)$","$1$2")
        ;n:=n thsExt
    }
    If r
        StringReplace n, n, % " ", % r, All
    return Trim(n)
}

84

Re: AHK: Скачивание через GET/POST-запросы

Оригинальный код скачивает нормально - значит проблема в вашей модернизации.

85

Re: AHK: Скачивание через GET/POST-запросы

Теперича работает)). Код получает расширение и дописывает его к сохраняемому изображению (которому вместо оригинального имени назначается полное имя ссылки на него) перед этим проверяя на существование —

#SingleInstance Force

Global Dir4Pics := "C:\Tmp\"
url_lst = 
(
https://vignette.wikia.nocookie.net/madmen/images/c/cf/002.jpg.php_229x344.jpg/revision/latest?cb=20100806000458
http://counter.yadro.ru/hit?t44.6;rhttps`%3A//www.google.com/;s1920*1080*24;uhttp`%3A//aydenfamilydentistry.com/viewtopic.php`%3Ft`%3D953254;h`%u0414`%u043E`%u0441`%u0442`%u0443`%u043F`%20`%u043A`%20`%u0434`%u0430`%u043D`%u043D`%u043E`%u043C`%u0443`%20`%u043C`%u0430`%u0442`%u0435`%u0440`%u0438`%u0430`%u043B`%u0443`%20`%u043E`%u0433`%u0440`%u0430`%u043D`%u0438`%u0447`%u0435`%u043D`%20`%u043F`%u0440`%u0430`%u0432`%u043E`%u043E`%u0431`%u043B`%u0430`%u0434`%u0430`%u0442`%u0435`%u043B`%u0435`%u043C.;0.17554469522970428
https://z-p3-external-frx5-1.xx.fbcdn.net/safe_image.php?d=AQDNtaXtIxXNdOk8&w=112&h=112&url=https`%3A`%2F`%2Fcdn4.telesco.pe`%2Ffile`%2Ficlic5-5hYm9zK7LmfXDDUm_SwCbeP5eNqJqS71hmG6m_Fg9xs2pO6mu26AgIx32mTE3lOUWFsOMNnYykS4nmi1x5_8M0qU3gVLYb2Z7g8eCVIbkoWtZ9zONkZdMz5uVstWfGOtXZCTXBoGni7ciH23w9UmCXs_pBmuFToygAa4MpLkF50I7amNev_pufp6YWLaovhoeHyzDmPNzkJHegDC0NP6kuwR-VRzkTRiSEpmD9leZZ0iNYL7DPNz-MZEQzGMG74eTpiDpOMd90771yPe5ST8vVaI6bGiWm4VW5v3BhNXK5GZZo0uQB27j21rpf5GIHBYIQc_Fysg04Ro2TA.jpg&cfs=1&jq=75&ext=jpg&_nc_hash=AQAdWxR5TYn3Ww8p
https://z-p3-static.xx.fbcdn.net/rsrc.php/v3/y8/r/sEX739EOBGI.png
https://z-p3-external-frt3-2.xx.fbcdn.net/safe_image.php?d=AQCD1xocR0u8pGcr&w=56&h=56&url=https`%3A`%2F`%2Fi.ytimg.com`%2Fvi`%2FohApS9e56z8`%2Fhqdefault.jpg&cfs=1&jq=75&sx=33&sy=0&sw=360&sh=360&ext=jpg&_nc_hash=AQDTIEG1tWbIB793
;https://docs.google.com/document/d/1jhW6J2gCY1eMO7p4nUto0Yn7Z5SWOFL2rNs6V5ZC7D8/
)

Loop, parse, url_lst, `n
{
    ths := A_LoopField
    url_lst := Download(ths) 
}
Return

Download(Location)
{
    Global Path ;, FullSize, KBSize 
    Info := HttpQueryInfo(Location, 22)  
    RegexMatch(Info, "i).*? (.*?)\R", stat)
    If !InStr(stat1, "200 OK")
        Return "Error: " stat1
    ;;RegexMatch(Info, "i)\RContent-Disposition: .*?filename=""(?<D>.*?)""", C) 
    ;;If CD !=  
    ;;    Path := CD
    ;;Else
    { 
        SplitPath, Location, FileName, , Ext, NameNoExt 
        RegexMatch(Info, "i)\RContent-Type: (.*?/(.*?))\R", CT)
        RegRead, ExtMIME, HKEY_CLASSES_ROOT, MIME\Database\Content Type\%CT1%, Extension
        If (ExtMIME != "")
        {
            Path := NameNoExt ExtMIME
            SplitPath, Path, , , thsExt,  	;!!add
            ;MsgBox 1 %thsExt%  			;!!add
        }
        Else If (Ext = "" && CT2 != "")
        {

            CT2:=RegExReplace(CT2,"^(.*?)(`; charset=utf-8)?$", "$1")
            Path := NameNoExt "." CT2
            ;MsgBox 2 %Path%
        }
        Else
        {
            Path := FileName
            ;MsgBox 3`n %Path%`n%thsExt%
        }
    }
    If !Path
        Return "Error: Path not found"  


    ;;RegexMatch(Info, "i)\RContent-Length: (?<L>.*?)\R", C), FullSize := CL
    ;MsgBox 2) %Path%
    ;;Path := Dir4Pics Path ;!!

    ;!!MsgBox % Path "`n`n" Location "`n`n" KBSize := Floor(FullSize/1024) "KB"
    ;!!SetTimer, GetSize, 100 

    StringReplace, Path, Path, ?, _, All  	;!!add
    Location2 := Location "." thsExt  		;!!add
    Location2 := ValidName(Location2)  		;!!add
    ;MsgBox 3 %Location2%  			;!!add
    If NOT FileExist(Dir4Pics Location2)
    {
        UrlDownloadToFile, %Location%, %Dir4Pics%%Location2%
        If NOT FileExist(Dir4Pics Location2)
            msgbox %Location% not dwn
    }

    StringReplace, Location2, Location2, `n, , All
    StringReplace, all, all, src="%Location%", src="pic/%Location2%", All

    ;!!SetTimer, GetSize, -1
    ;!!Progress, Hide
    Return "Complete"
}

GetSize: 
    FSize := FileOpen(Path, "r").Length 
    Percent := Floor((FSize / FullSize) * 100)  
    Progress, %Percent%, %Percent%`% Complete, Downloading... 
        , % Floor(FSize/1024) "KB / " KBSize " || " Path 
    Return
 

HttpQueryInfo(URL, QueryInfoFlag=21, Proxy="", ProxyBypass="")
{
   hModule := DllCall("LoadLibrary", "str", "wininet.dll", Ptr)
   AccessType := Proxy = "" ? 1 : 3
   
   Loop 1
   {
      Error := 1
      if !io_hInternet := DllCall("wininet\InternetOpen", "str", "", "uint", AccessType, "str", Proxy, "str", ProxyBypass, "uint", 0, Ptr) ;dwFlags
         break
      
      if !iou_hInternet := DllCall("wininet\InternetOpenUrl", Ptr, io_hInternet, "str", url, "str", "", "uint", 0, "uint", 0x80000000, "uint", 0)
         break
      
      VarSetCapacity(buffer_len, 4, 0) 
      Loop
      {         
         if A_Index = 3
            break 2
         
         VarSetCapacity(buffer, NumGet(&buffer_len+0, "UInt"))
         hqi := DllCall("wininet\HttpQueryInfo", Ptr, iou_hInternet, "uint", QueryInfoFlag, Ptr, &buffer, Ptr, &buffer_len, "uint", 0)
      } Until hqi
      Error := ""
   }
   
   DllCall("wininet\InternetCloseHandle",  Ptr, iou_hInternet)
   DllCall("wininet\InternetCloseHandle",  Ptr, io_hInternet)
   DllCall("FreeLibrary", Ptr, hModule)
   
   Return, Error ? -1 : StrGet(&buffer)
}

ValidName(n,r="")
{
    ;;n:=RegExReplace(n,"(:|;|,|\*|\?|\\|/|<|>|"")"," ")
    n:=RegExReplace(n,"(https?://)","")
    n:=RegExReplace(n,"(\.\w+)\1$","$1")
    n:=RegExReplace(n,"(:|\\)","-")
    n:=RegExReplace(n,"(/)","=")
    n:=RegExReplace(n,"(,|\*|\?|<|>)","_")
    n:=RegExReplace(n,"(;|"")","'")
    n:=RegExReplace(n,"\s+"," ")
    StringReplace n, n, |, -, All

    StrLen(n)
    if n > 150
    {
        n:=RegExReplace(n,"^(.{100,120}).*(\.\w+)$","$1$2")
        ;n:=n thsExt
    }
    If r
        StringReplace n, n, % " ", % r, All
    return Trim(n)
}

86

Re: AHK: Скачивание через GET/POST-запросы

В функции ValidName() — длинное имя обрезается, но лучше обрабатывать исходя из формата ссылок конкретного сайта.

87

Re: AHK: Скачивание через GET/POST-запросы

http://forum.script-coding.com/viewtopi … 44#p128944

+ DD

88

Re: AHK: Скачивание через GET/POST-запросы

Как правильно скачать pdf-файл?

HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
HTTP.Open("GET", "http://astreya-region.ru/files/64.pdf", true)
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send()
HTTP.WaitForResponse()
ResponseText := HTTP.ResponseText
fileappend, %ResponseText%, %A_ScriptDir%\64.pdf

89

Re: AHK: Скачивание через GET/POST-запросы

URLDownloadToFile?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

90

Re: AHK: Скачивание через GET/POST-запросы

Хотелось через GET-запросы, так как URLDownloadToFile качает файлы частями на диск, а не сначала полностью в память. Но если иначе нельзя — делать нечего.

91

Re: AHK: Скачивание через GET/POST-запросы

HTTP.WaitForResponse()
Body := HTTP.ResponseBody
pData := NumGet(ComObjValue(Body), A_PtrSize = 8? 16:12, "ptr")
File := FileOpen("64.pdf", "w")
File.RawWrite(pData + 0, Body.MaxIndex() + 1)
+ DD

92 (изменено: teadrinker, 2018-11-26 04:39:25)

Re: AHK: Скачивание через GET/POST-запросы

А что, есть отличие от любого другого файла? В этой теме же обсуждалось уже.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

93 (изменено: DD, 2018-12-26 11:31:51)

Re: AHK: Скачивание через GET/POST-запросы

По какой причине из-за специфического символа Юникода не происходит скачивание страницы? —

HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")

HTTP.Open("GET", "https://www.livejournal.com/__rpc_get_thread?journal=v-sidorov&itemid=310165&flat=&skip=&media=&expand_all=1&page=0", true)
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send()
HTTP.WaitForResponse()
ResponseText := HTTP.ResponseText

msgbox % ResponseText

94

Re: AHK: Скачивание через GET/POST-запросы

Так происходит:

HTTP := ComObjCreate("Msxml2.XMLHTTP")
HTTP.Open("GET", "https://www.livejournal.com/__rpc_get_thread?journal=v-sidorov&itemid=310165&flat=&skip=&media=&expand_all=1&page=0&" . A_TickCount, false)
HTTP.Send()
ResponseText := HTTP.ResponseText
MsgBox, % ResponseText
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder
+ DD

95 (изменено: DD, 2018-12-26 14:15:24)

Re: AHK: Скачивание через GET/POST-запросы

Спасибо!
Стало интересно, каково назначение " . A_TickCount" в ссылке и для чего используется "false"/"Msxml2.XMLHTTP" — вместо "true"/"WinHTTP.WinHTTPRequest.5.1"? Можно ли всегда скачивать с такими изменениями?

96 (изменено: teadrinker, 2018-12-26 14:31:26)

Re: AHK: Скачивание через GET/POST-запросы

При использовании WinHTTP.WinHTTPRequest.5.1 ответы, насколько я знаю, не кешируются, в случае же Msxml2.XMLHTTP можно получить результат из кеша, если адрес тот же самый, а завершающее рандомное число решает эту проблему. false/true — синхронный/асинхронный запрос, смотря что нужно, в данном случае объём информации небольшой, так что в асинхронном особо нет смысла.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

97 (изменено: DD, 2018-12-26 14:50:02)

Re: AHK: Скачивание через GET/POST-запросы

Ясно. А вот как для того же кода отловить ошибку, чтобы в случае проблемы скачивалось по предложенному Вами образцу, с задействованным кэшем и т.п.? —

HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")

HTTP.Open("GET", "https://www.livejournal.com/__rpc_get_thread?journal=v-sidorov&itemid=310165&flat=&skip=&media=&expand_all=1&page=0", true)
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send()
HTTP.WaitForResponse()
If ErrorLevel
   msgbox
else
   ResponseText := HTTP.ResponseText

98

Re: AHK: Скачивание через GET/POST-запросы

HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")

HTTP.Open("GET", "https://www.livejournal.com/__rpc_get_thread?journal=v-sidorov&itemid=310165&flat=&skip=&media=&expand_all=1&page=0", true)
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send()
HTTP.WaitForResponse()
status := HTTP.status
if status not in 200,304
{
   MsgBox, Статус: %status%
   Return
}
try ResponseText := HTTP.ResponseText
catch  {
   MsgBox, Error
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder
+ DD

99

Re: AHK: Скачивание через GET/POST-запросы

DD пишет:

По какой причине из-за специфического символа Юникода не происходит скачивание страницы?

Видимо из-за кривого алгоритма метода ResponseText.

HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")

HTTP.Open("GET", "https://www.livejournal.com/__rpc_get_thread?journal=v-sidorov&itemid=310165&flat=&skip=&media=&expand_all=1&page=0", true)
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko)")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send()
HTTP.WaitForResponse()
Body := HTTP.ResponseBody
pData := NumGet(ComObjValue(Body)+8+A_PtrSize)
ResponseText := StrGet(pData, Body.MaxIndex() + 1, "utf-8")

msgbox % ResponseText

100

Re: AHK: Скачивание через GET/POST-запросы

Malcev, а зачем тут

HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")

нужно? Что они дают?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder