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