Что нового

Получение аватаров всех участников форума

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Хочу сделать мозаику сообщества, используя аватары всех участников. Как сделать мозаику я нашёл (программа Mozaika), но вот никак не могу придумать как с форума вытащить все аватары.

Они конечно есть в базе, но они там вроде как зашифрованы, копаться в этом нет ни сил, ни времени. Конечно сохранять каждую аватарку тоже не вариант, пробовал автоматизировать через _IE* и через Inet*/TCP*, ничего толкого не вышло (тоже видимо лень с этим разбираться).

Нужен совет :whistle:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Попросить участников форума.

:smile:
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Пробовал примерно так:

Код удалён, чтобы предотвратить лишнюю нагрузку на сервер.
[
Скрытый контент
Вы должны ответить на это, чтобы увидеть это содержание.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Yashied [?]
Попросить участников форума.
Чтобы сделали что, залили куда нибудь свою аватарку? Но ведь всё равно придётся выдёргивать их по отдельности :laugh:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
У форума есть FTP? На обменник!
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
Аватарки сохраняются по шаблону:
Код:
<user name> (<user profile id>).<file type>

[
Скрытый контент
Вы должны ответить на это, чтобы увидеть это содержание.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
[
Скрытый контент
Вы должны ответить на это, чтобы увидеть это содержание.
]
Вот мой вариант.
Смешанная технология IE.au3 + InetGet :smile:
[
Скрытый контент
Вы должны ответить на это, чтобы увидеть это содержание.
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
Garrett
хммм, почемуж не совпадает размер Мб.....
у меня 193 файла 3,45 МБ (3 624 960 байт)
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
Это:
Код:
$aResult = StringRegExp($sSource, '(?s)<div class="content">.*?<img.*?"(http://.*?)".*?class="avatar".*?>.*?</div>', 3)

можно еще оптимезировать. Просто _IETagNameGetCollection в <div class="content">. Соответсвенно и URL на файл можно будет получить через IE COM. А то ж рег. выражения не слишком шустрые...
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
`p r o x y [?]
у тебя есть доступ к БД форума? Из БД вытащить вообще элементарно.
Есть, я весь внимания как это сделать :-\

Хмм, да и саму прогу мазаики написать на AutoIt не сложно...если без эффектов всяких.
Моё внимание ещё больше обострилось, тут и потом тут я про это мыслил вслух.
 

SyDr

Сидра
Сообщения
651
Репутация
158
`p r o x y, здесь не 193 аватарки. Их вроде 209 или 210

Мне кажется, или на проекте нет НИ ОДНОЙ .jpg аватарки?
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Если бы ещё скрипт предусматривал повторы, т.е чтобы не качал повторяющиеся аватары...
 

SyDr

Сидра
Сообщения
651
Репутация
158
А как это вообще возможно?

Мой вариант. 197 аватарок (хотя, чувствую, их больше :smile:)
[#]
Код:
DirCreate("avatars")
FileChangeDir("avatars")
HttpSetUserAgent("Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.9 (KHTML, like Gecko) Maxthon/3.0 Safari/533.9")
$sProfilePage = "http://autoit-script.ru/index.php?action=profile;u=%s" ; 1 - 3603
$sPatternAva = '\s<img\ssrc="(.*?)"\s.*?alt=""\sclass="avatar"\sborder="0"\s/>'
$iMaxUsers = 3603



For $iCurrentUser = 1 To $iMaxUsers
	$sPageData = BinaryToString(InetRead(StringFormat($sProfilePage, $iCurrentUser), 16))
	$aAvaURL = StringRegExp($sPageData, $sPatternAva, 3)
	If @error Then ContinueLoop
	$bAva = InetRead($aAvaURL[0], 16)
	If $bAva Then FileWrite($iCurrentUser & "." & GetType(BinaryMid($bAva, 1, 3)), $bAva)
Next

Func GetType($bData)
	Local $sData = String($bData)
	Switch $sData
		Case "0x89504E"
			Return "png"
		Case "0x474946"
			Return "gif"
		Case "0xFFD8FF"
			Return "jpg"
		Case Else
;~ 			O_O
	EndSwitch
EndFunc

Он же в сокращённом виде:
Код:
DirCreate("avatars")
FileChangeDir("avatars")
For $iCurrentUser = 1 To 3603
	$aAvaURL = StringRegExp(BinaryToString(InetRead(StringFormat("http://autoit-script.ru/index.php?action=profile;u=%s", $iCurrentUser), 16)), '\s<img\ssrc="(.*?)"\s.*?alt=""\sclass="avatar"\sborder="0"\s/>', 3)
	If @error Then ContinueLoop
	$bAva = InetRead($aAvaURL[0], 16)
	If $bAva Then FileWrite($iCurrentUser & "." & GetType(BinaryMid($bAva, 1, 3)), $bAva)
Next

Func GetType($bData)
	Switch String($bData)
		Case "0x89504E"
			Return "png"
		Case "0x474946"
			Return "gif"
		Case "0xFFD8FF"
			Return "jpg"
	EndSwitch
EndFunc
[/#]
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
CreatoR [?]
Если бы ещё скрипт предусматривал повторы, т.е чтобы не качал повторяющиеся аватары...
Ну это уже сааааавсем элементарно, открываем папку с аватарками, сортируем по размеру и выбираем повторные.
Делов, максимум, на 1-2 мин. В любом случае, проверку по размеру файла написать же элементарно.

SyDr
Жеесть! Хммм, ни когда не работа с такой задачей в бинарном виде....
197 аватарок - необходимо проверить, некоторые авы могут быть пустые, т.е. файла нет по ссылке.

Кстати, логичный ход:
Код:
For $iCurrentUser = 1 To 3603

User ID по любому по порядку будут идти. Конечно, если есть удаления, то не прокатит (будут сдвиги).
 

SyDr

Сидра
Сообщения
651
Репутация
158
CreatoR [?]
Если бы ещё скрипт предусматривал повторы, т.е чтобы не качал повторяющиеся аватары...
Их не так много. Хотя, сделаю вариант, коотрый не будет качать аватарки с одинаковых адресов.

`p r o x y
Привычка же :smile: Не первый раз тяну с форумов все профили.
С $iMaxUsers всё прокатывает. 3603 - это был номер последнего пользователя. У удалённых пользователей нет аватарок :smile:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Поправил свой код.

Теперь дело обстоит так:
Всего avatar 196 шт.
В действительности их больше, просто некоторые не доступны по своему адресу.

`p r o x y сказал(а):
Это:
Код:
$aResult = StringRegExp($sSource, '(?s)<div class="content">.*?<img.*?"(http://.*?)".*?class="avatar".*?>.*?</div>', 3)

можно еще оптимезировать. Просто _IETagNameGetCollection в <div class="content">. Соответсвенно и URL на файл можно будет получить через IE COM. А то ж рег. выражения не слишком шустрые...
Да, но в этом случае нужно будет перейти на страницу профиля пользователя, а это лишняя перезагрузка страницы.

SyDr [?]
Мне кажется, или на проекте нет НИ ОДНОЙ .jpg аватарки?
Нет, вы абсолютно правы, они есть! :smile:

В своём варианте я решил использовать IE, для сбора ссылок на профили пользователей, что бы в дальнейшем обратится к ним через InetGet.

Кстати на странице "профиль пользователя" имеются две одинаковые ссылки, одна на ваш (как авторизированного пользователя) avatar, другая на пользователя, профиль которого мы смотрим.
Так что нужно искать avatar, которая находится между:
Код:
<div class="content"> … </div>
.

SyDr, я сегодня под утро пришёл к аналогичному выводу, нужно искать тип файла по его сигнатуре, потому как попадаются ссылки такого вида:
Код:
http://autoit-script.ru/index.php?action=dlattach;attach=34;type=avatar
Но вы опередили. Так что, если вы не против, воспользовался, вашей функцией! :beer:
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
SyDr [?]
С $iMaxUsers всё прокатывает
Я про то, что просто можут быть пропуск в ID профилей, соответсвенно, лишняя трата времени на проверки.
Но с учетом, что нет поиска ссылок на профили, по любому будет быстрее.

SyDr сказал(а):
+Типы файлов еще могут быть: bmp, tif

Garrett [?]
Да, но в этом случае нужно будет перейти на страницу профиля пользователя, а это лишняя перезагрузка страницы.
Да, да, верно. Недоосмыслил комбинацию работы с IE и чтение InetRead.

хммм, а все не пустые?
 
Верх