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 и разэкранировать символы?