1 (изменено: DD, 2018-09-21 02:48:11)

Тема: AHK: Пример скачивания поста с Фейсбука с развёрнутыми комментариями

Пример скачивания поста с Фейсбука с развёрнутыми комментариями:


#MaxMem 200
SetBatchLines -1
#SingleInstance Force
HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")

login := "*********"  ;ЛОГИН (М. Б. НОМЕР ТЕЛЕФОНА В ФОРМАТЕ +12345678910)
password := "*********"   ;ПАРОЛЬ
email := login
owner_id := 810732232462076  ;АЙДИ ПРОФИЛЯ
post_num := 907883219413643  ;АЙДИ СТРАНИЦЫ

If not (LoginMode == 1)  ;логинимся при первом запуске один раз:
{
   GoSub, login
   LoginMode = 1
}

n := 0
loop
{
   sleep 400
   URL := "https://mobile.facebook.com/story.php?story_fbid=" post_num "&id=" owner_id "&p=" n
   gosub, HTTP

   all := ResponseText "`n" all

   If NOT InStr(ResponseText, "Просмотр предыдущих комментариев")
      break
   If A_Index = 1
      n+=10
   else
      n+=10
}

Gosub, htmlcode
gosub, ProcPost
subLnkPlus = 

all := all

loop
{
   If RegExMatch(all, "s)(<div[^>]*><div[^>]*id=""comment_replies_more[^>]*>.*?href="")([^""]*)(""[^>]*>)([^<]* отве[А-ЯЁа-яё]+[^<]*)(</a></div></div></div>)", matchh)
   subLnk := matchh2

   If NOT InStr(matchh, "id=""comment_replies_more")
      break

loop
{
   sleep, 400
   If A_Index = 1
      URL := subLnk
   if (NOT subLnkPlus = "")
   {
      URL = https://mobile.facebook.com%subLnkPlus%
      subLnkPlus = 
   }
   gosub, HTTP

   all2 := ResponseText "`n" all2

   ;подсчёт реального количества ответов:
   StrReplace(all2, "</abbr>",, SubCmtsRealCount)
   If (SubCmtsRealCount = 1)
      all2 =

   RegExMatch(ResponseText, "s)<a href=""([^""]*)""[^>]*>(<span[^>]*>)?Посмотреть предыдущие ответы<", match)
   subLnkPlus := match1
   loop, 20
      StringReplace subLnkPlus, subLnkPlus, &amp`;, &, All
   match1 =

   If NOT InStr(ResponseText, ">Посмотреть предыдущие ответы<")
      break

   If( subLnkPlus = "" )
      break
}

gosub, ProcPostOtv
all2 := all2
matchh4 := RegExReplace(matchh4, "s)Смотреть вс(е|ё)\s", "")
all2 := RegExReplace(all2, "s)(<div[^>]*>|</?span[^>]*>| (class|id)=""[^""]*"")", "")
all2 := RegExReplace(all2, "s)(</div[^>]*>)+", "<br>")
all2 := RegExReplace(all2, "s)(<br>)+", "<br>")
all2 := RegExReplace(all2, "s)(<br><h3>|<h3>)", "`n<h3>")

If (SubCmtsRealCount = 1)
   StringReplace all, all, %matchh%, `n`n<blockquote id="otv"><s><span><a href="%matchh2%">%matchh4%</a></span></s></blockquote>`n`n, All
Else
{
   matchh4 := RegExReplace(matchh4, "s)^.*? 1 ответ$", "1 ответ")
   StringReplace all, all, %matchh%, `n`n<blockquote id="otv"><a href="%matchh2%"><u>%matchh4%:</u></a>`n%all2%</blockquote>`n`n, All
}

matchh=
matchh1=
matchh2=
matchh3=
matchh4=
matchh5=
matchhh=
matchhh1=
all2=
}
fileappend, %all%, %a_scriptdir%\pst%post_num%.html, UTF-8
ExitApp

ProcPost:
all := RegExReplace(all, "s)<a [^>]*>(<img [^>]*>)?&nbsp;Еще комментарии…</a>.*?<a [^>]*>(<img [^>]*>)?&nbsp;Просмотр предыдущих комментариев…</a>", "")
all := RegExReplace(all, "s)^.*?<head>", htmlcode)
all := RegExReplace(all, "s)<form method=""post""((?!<form|</abbr).)*</form>", "") ;!!SIC
all := RegExReplace(all, "s)<a [^>]*>(Отреагировать|Ответить|Пожаловаться|Нравится|Отправить в сообщении|Отметить на фото)</a>([^·]*)<span [^>]*> · </span>", "$2")
all := RegExReplace(all, "s)(<span class=""word_break""></span>|<wbr />|font-size:0;?|<a [^>]*>На главную страницу</a>)", "")
all := RegExReplace(all, "s)<span [^>]*> · </span>(.*?)<span [^>]*>(Друзья|Доступно всем)</span>", "$1")
loop, 20
  all := RegExReplace(all, "s)(=""[^""]*&)amp;([^""]*"")", "$1$2")
StringReplace, all, all, >отредактировано</a>, >/</a>, All
StringReplace, all, all, href="/, href="https://mobile.facebook.com/, All
all := RegExReplace(all, "s)href=""https://mobile.facebook.com/home.php?[^""]*""", "href=""../_index.html#" post_num """")
StringReplace, all, all, line-height:, Xline-height:, All
StringReplace, all, all, aria-label=", title=", All
all := RegExReplace(all, "s)&#x(\w+);", "\u$1")
all := JavaEscapedToHtml(all)
all := RegExReplace(all, "s)<table [^>]*><tbody>((?!<table|</table|</div|</abbr).)*(Нравится|Отреагировать|Комментарий|Поделиться|Пожаловаться)((?!<table|</table|</div|</abbr).)*</tbody></table>", "") ;!!SIC
all := RegExReplace(all, "s)(<a [^>]* target=""_blank""[^>]*>)(<div[^>]*><table[^>]*><tbody>)", "$2$1")
all := RegExReplace(all, "s)(href=""https://lm.facebook.com/[^""]*)&h=[^""]*""", "$1""")
return

ProcPostOtv:
all2 := RegExReplace(all2, "s)<a [^>]*>(<span[^>]*>)?Посмотреть следующие ответы(</span>)?</a>.*?<a [^>]*>(<span[^>]*>)?Посмотреть предыдущие ответы(</span>)?</a>", "") ;!!
all2 := RegExReplace(all2, "s)^.*?</abbr>.*?(<div.*</abbr>.*?)<div.*$", "$1") ;!!SIC!!
all2 := RegExReplace(all2, "s)<a [^>]*>(Отреагировать|Ответить|Пожаловаться|Нравится)</a>([^·]*)<span [^>]*> · </span>", "$2")
all2 := RegExReplace(all2, "s)(<span class=""word_break""></span>|<wbr />|font-size:0;?)", "")
loop, 20
  all2 := RegExReplace(all2, "s)(=""[^""]*&)amp;([^""]*"")", "$1$2")
StringReplace, all2, all2, >отредактировано</a>, >/</a>, All
StringReplace, all2, all2, href="/, href="https://mobile.facebook.com/, All
StringReplace, all2, all2, line-height:, Xline-height:, All
StringReplace, all2, all2, aria-label=", title=", All
all2 := RegExReplace(all2, "s)&#x(\w+);", "\u$1")
all2 := JavaEscapedToHtml(all2)
;all2 := RegExReplace(all2, "s)(<div class=""[^""]*"" id="")", "`n$1")
all2 := RegExReplace(all2, "s)(<a [^>]* target=""_blank""[^>]*>)(<div[^>]*><table[^>]*><tbody>)", "$2$1")
all2 := RegExReplace(all2, "s)(href=""https://lm.facebook.com/[^""]*)&h=[^""]*""", "$1""")
return

login:
SplashImage,, y-2 x60 w40 h14 M C11 ZH0 ZW0 ZX1 ZY1 B1 CTffffff CW3B5998 FM8 FS6 WM600 WS400,, login
;--------------------------------------------
;Авторизация:
;--------------------------------------------
HTTP.Open("POST", "https://mobile.facebook.com/login.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("email=" email "&pass=" password "&login=" login)
HTTP.WaitForResponse()
ResponseText := HTTP.ResponseText
ResponseText =
;--------------------------------------------
SplashImage, OFF
Return

;преобразование юникодных кодов в символы
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)
}

HTTP:
   HTTP.Open("GET", URL, 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()
   HTTP.WaitForResponse()
   ResponseText := HTTP.ResponseText
return

htmlcode:
htmlcode=
(
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><META http-equiv=Content-Type content="text/html; charset=utf-8">
<link rel="stylesheet" type="text/css" href="../style.css">
<link rel="stylesheet" type="text/css" href="style.css">

<style>
body {vertical-align:baseline;line-height:125`%;margin-bottom:6`% !important;}
.d #viewport, #viewport {margin:0 auto;max-width:600px;width:600px;}
s {vertical-align: middle; color:#FF0000;} s span { color:#222222;} 
abbr { font-size:14px !important; color:#999 !important; border:0 !important;}
div h3, #otv  { margin-top:7px !important;margin-bottom:3px !important;}
h3 a { font-size:18px !important; color:#3B5998 !important;}
h3 a:hover { color:#fff !important; background-color: #3B5998 !important;}
p {font-weight:normal !important; color:#242C3B !important; background-color: #fff !important;}
img {border:0 !important; padding-right:2px !important;}
blockquote {border:0 !important; color:#242C3B !important; font-size:85`% !important; clear: both !important; 
margin:.83em 10px 0px 10px !important; border-left: 1px solid #808796 !important;padding-left: 15px !important;}
blockquote a h3 { font-size:85`% !important;}
blockquote table, blockquote tbody, blockquote tr, blockquote td {font-size:100`% !important; }
blockquote table a {color:blue !important;}
blockquote table a:hover {color:#ffffff !important;}
#otv a {text-decoration:none;border-bottom: dotted 1px;}
#otv u {font-family: monospace; cursor:default; color:red !important; font-weight:normal !important;}
</style>

<head>
)
Return