Что нового

[Сеть, интернет] Загрузка фото в альбом VK с описанием из XLS

DOMINANT

Новичок
Сообщения
42
Репутация
0
Версия AutoIt: 3.3.12.0

Описание:
Здравствуйте уважаемые ауто-итовцы:smile:! Прошу вашей помощи, опыт работы с программой 3 дня :-\. Есть EXCEL файл (во вложении), есть сообщество VK. Замысел алгоритма такой.

1) Скрипт открывает EXCEL файл с базой товаров. "каждая строчка новый товар"

2015-07-01_15-25-44.png


2) Скрипт открывает ссылку на альбом в сообществе ячейка A2, которая указана в столбце URL_VK_ALBUM

3) Далее ищет в папке указанной мной, перечисленные через ";" в ячейке B2 изображения.

4) Как то выделяет их и перетягивает в эту область

2015-07-01.png


5) Под каждое изображение пишет описание из EXCEL

2015-07-01_15-32-06.png


5) Нажимает сохранить

2015-07-01_15-33-55.png


6) Закрывает вкладку

2015-07-01_15-35-36.png


7) И заново проделывает все тоже самое но уже спускается вниз на следующую строку, к следующему товару, и так далее
Примечания:
 

Вложения

  • tovar.zip
    17.8 КБ · Просмотры: 21

alex33

Скриптер
Сообщения
1,457
Репутация
186
Вот, написал.
Скрипт запоминает текущую позицию и при перезапуске начинает с того места, от куда закончил.
Я протестировал этот скрипт, у меня он работает отлично (Windows 7 ru, IE 11, AutoIt 3.3.12.0).
Код:
#include <Array.au3>; подключаем библиотеку для работы с массивами
#include <File.au3>; подключаем библиотеку для работы с файлами
#include <IE.au3>; подключаем библиотеку для работы с браузером IE
#include <Excel.au3>; подключаем библиотеку для работы с Excel
Local $tmp, $arr, $oIE, $aFiles, $sImageFilePath, $oTextareas, $oButtons, $oDivs, $iFlag = 0; переменные
Local $sConfigFilePath = @UserProfileDir & "\vk_photos_album_config.ini"; путь к конфигурационному файлу
Local $sPathXL = @ScriptDir & "\tovar.xlsx"; путь к Excel файлу с данными
Local $sPathImages = @ScriptDir & "\photos"; папка, где искать изображения

_Excel_BookReadToArray($sPathXL, $arr)
If @error Then Exit 1
;_ArrayDisplay($arr)

_IELoadWaitTimeout(10000)
$oIE = _IECreate("http://vk.com/")
If @error Or Not IsObj($oIE) Then Exit 2
$tmp = IniRead($sConfigFilePath, "config", "line", "0")
If (Not StringIsDigit($tmp)) Or ($tmp > UBound($arr)) Or ($tmp < 1) Then $tmp = 0
If $tmp > 0 Then $tmp += 1
For $i = $tmp To UBound($arr) - 1
	ConsoleWrite("For#" & $i & "/" & UBound($arr) & @CRLF)
	If StringInStr($arr[$i][0], "http") = 0 Then ContinueLoop
	Sleep(1000)
	$aFiles = _FileListToArrayRec($sPathImages, $arr[$i][1], $FLTAR_FILES, $FLTAR_NORECUR, $FLTAR_NOSORT, $FLTAR_FULLPATH)
	If @error Or Not IsArray($aFiles) Then ContinueLoop
	$sImageFilePath = $aFiles[1]
	If Not StringInStr($sImageFilePath, '"') Then $sImageFilePath = StringFormat('"%s"', $sImageFilePath)
	_IENavigate($oIE,$arr[$i][0])
	Sleep(100)
	ConsoleWrite(StringFormat("URL: %s; Files: %s; Desc: %s\r\n", $arr[$i][0], $arr[$i][1], $arr[$i][2]))
	;_ArrayDisplay($aFiles,"files#"&$i)
	_IENavigate($oIE, 'javascript:document.getElementById("photos_upload_area").click();void(0);', 0)
	$hWin = WinWait("[TITLE:Выбор выкладываемого файла; CLASS:#32770]", "", 10)
	If Not $hWin Then ContinueLoop
	ControlFocus($hWin, "", "Edit1")
	Sleep(100)
	ControlSetText($hWin, "", "Edit1", $sImageFilePath)
	Sleep(100)
	ControlFocus($hWin, "", "Button1")
	Sleep(100)
	ControlClick($hWin, "", "Button1", "main", 1)
	ConsoleWrite("Selected file: " & $sImageFilePath & @CRLF)
	WinWaitNotActive($hWin, "", 2)
	Do
		Sleep(100)
		$oTextareas = _IETagNameGetCollection($oIE, "textarea")
		If Not IsObj($oTextareas) Then ContinueLoop
		$oPhotos_add_s_caption = 0
		For $oTextarea In $oTextareas
			If $oTextarea.className = "photos_add_s_caption" Then
				$oPhotos_add_s_caption = $oTextarea
				ExitLoop
			EndIf
		Next
	Until IsObj($oPhotos_add_s_caption)
	_IEAction($oPhotos_add_s_caption, "focus")
	Sleep(100)
	_IEFormElementSetValue($oPhotos_add_s_caption, $arr[$i][2])
	Sleep(100)
	_IEAction($oPhotos_add_s_caption, "blur")
	Do
		Sleep(100)
		$oButtons = _IETagNameGetCollection($oIE, "button")
		If Not IsObj($oButtons) Then ContinueLoop
		For $oButton In $oButtons
			If $oButton.innerHTML = "Сохранить фотографии" Or $oButton.className = "flat_button" Then
				_IEAction($oButton, "focus")
				Sleep(100)
				_IEAction($oButton, "click")
				ExitLoop
			EndIf
		Next
	Until IsObj($oButtons)
	$iFlag = 0
	Do
		Sleep(100)
		$oDivs = _IETagNameGetCollection($oIE, "div")
		If Not IsObj($oDivs) Then ExitLoop
		For $oDiv In $oDivs
			If StringInStr($oDiv.id, "photo_save_result-") Then
				$iFlag = 1
				ExitLoop
			EndIf
		Next
	Until $iFlag = 0
	ConsoleWrite("Save OK" & @CRLF)
	IniWrite($sConfigFilePath, "config", "line", $i)
	ConsoleWrite("----------" & @CRLF)
Next

_IEQuit($oIE)


Func _Excel_BookReadToArray($_sPath, ByRef $_aArray)
	If Not FileExists($_sPath) Then Return SetError(1, 0, 0)
	Local $oAppl = _Excel_Open()
	If @error Then Return SetError(2, 0, 0)
	Local $oWorkbook = _Excel_BookOpen($oAppl, $_sPath)
	If @error Then
		_Excel_Close($oAppl)
		Return SetError(3, 0, 0)
	EndIf
	Dim $_aArray[0][3]
	Local $iIndex = 0, $A = "", $B = "", $C = ""
	While 1
		$A = _Excel_RangeRead($oWorkbook, Default, "A" & Execute($iIndex + 1))
		If @error Or $A == "" Then ExitLoop
		$B = _Excel_RangeRead($oWorkbook, Default, "B" & Execute($iIndex + 1))
		If @error Or $B == "" Then ExitLoop
		$C = _Excel_RangeRead($oWorkbook, Default, "C" & Execute($iIndex + 1))
		If @error Or $C == "" Then ExitLoop
		ReDim $_aArray[$iIndex + 1][3]
		$_aArray[$iIndex][0] = $A
		$_aArray[$iIndex][1] = $B
		$_aArray[$iIndex][2] = $C
		$iIndex += 1
	WEnd
	_Excel_Close($oAppl)
	Return 1
EndFunc   ;==>_Excel_BookReadToArray


Добавлено:
Сообщение автоматически объединено:

OffTopic:

Функцию для чтения excel в массив я не нашёл, по этому написал свою функцию _Excel_BookReadToArray. :smile:
Была бы там функция по типу как
Код:
_IETableWriteToArray

Было бы вообще отлично. :smile: Может быть такая функция есть, но я её не обнаружил... :(
 
Автор
DOMINANT

DOMINANT

Новичок
Сообщения
42
Репутация
0
alex33 сказал(а):
Вот, написал.
Скрипт запоминает текущую позицию и при перезапуске начинает с того места, от куда закончил.
Я протестировал этот скрипт, у меня он работает отлично (Windows 7 ru, IE 11, AutoIt 3.3.12.0).
Код:
#include <Array.au3>; подключаем библиотеку для работы с массивами
#include <File.au3>; подключаем библиотеку для работы с файлами
#include <IE.au3>; подключаем библиотеку для работы с браузером IE
#include <Excel.au3>; подключаем библиотеку для работы с Excel
Local $tmp, $arr, $oIE, $aFiles, $sImageFilePath, $oTextareas, $oButtons, $oDivs, $iFlag = 0; переменные
Local $sConfigFilePath = @UserProfileDir & "\vk_photos_album_config.ini"; путь к конфигурационному файлу
Local $sPathXL = @ScriptDir & "\tovar.xlsx"; путь к Excel файлу с данными
Local $sPathImages = @ScriptDir & "\photos"; папка, где искать изображения

_Excel_BookReadToArray($sPathXL, $arr)
If @error Then Exit 1
;_ArrayDisplay($arr)

_IELoadWaitTimeout(10000)
$oIE = _IECreate("http://vk.com/")
If @error Or Not IsObj($oIE) Then Exit 2
$tmp = IniRead($sConfigFilePath, "config", "line", "0")
If (Not StringIsDigit($tmp)) Or ($tmp > UBound($arr)) Or ($tmp < 1) Then $tmp = 0
If $tmp > 0 Then $tmp += 1
For $i = $tmp To UBound($arr) - 1
	ConsoleWrite("For#" & $i & "/" & UBound($arr) & @CRLF)
	If StringInStr($arr[$i][0], "http") = 0 Then ContinueLoop
	Sleep(1000)
	$aFiles = _FileListToArrayRec($sPathImages, $arr[$i][1], $FLTAR_FILES, $FLTAR_NORECUR, $FLTAR_NOSORT, $FLTAR_FULLPATH)
	If @error Or Not IsArray($aFiles) Then ContinueLoop
	$sImageFilePath = $aFiles[1]
	If Not StringInStr($sImageFilePath, '"') Then $sImageFilePath = StringFormat('"%s"', $sImageFilePath)
	_IENavigate($oIE,$arr[$i][0])
	Sleep(100)
	ConsoleWrite(StringFormat("URL: %s; Files: %s; Desc: %s\r\n", $arr[$i][0], $arr[$i][1], $arr[$i][2]))
	;_ArrayDisplay($aFiles,"files#"&$i)
	_IENavigate($oIE, 'javascript:document.getElementById("photos_upload_area").click();void(0);', 0)
	$hWin = WinWait("[TITLE:Выбор выкладываемого файла; CLASS:#32770]", "", 10)
	If Not $hWin Then ContinueLoop
	ControlFocus($hWin, "", "Edit1")
	Sleep(100)
	ControlSetText($hWin, "", "Edit1", $sImageFilePath)
	Sleep(100)
	ControlFocus($hWin, "", "Button1")
	Sleep(100)
	ControlClick($hWin, "", "Button1", "main", 1)
	ConsoleWrite("Selected file: " & $sImageFilePath & @CRLF)
	WinWaitNotActive($hWin, "", 2)
	Do
		Sleep(100)
		$oTextareas = _IETagNameGetCollection($oIE, "textarea")
		If Not IsObj($oTextareas) Then ContinueLoop
		$oPhotos_add_s_caption = 0
		For $oTextarea In $oTextareas
			If $oTextarea.className = "photos_add_s_caption" Then
				$oPhotos_add_s_caption = $oTextarea
				ExitLoop
			EndIf
		Next
	Until IsObj($oPhotos_add_s_caption)
	_IEAction($oPhotos_add_s_caption, "focus")
	Sleep(100)
	_IEFormElementSetValue($oPhotos_add_s_caption, $arr[$i][2])
	Sleep(100)
	_IEAction($oPhotos_add_s_caption, "blur")
	Do
		Sleep(100)
		$oButtons = _IETagNameGetCollection($oIE, "button")
		If Not IsObj($oButtons) Then ContinueLoop
		For $oButton In $oButtons
			If $oButton.innerHTML = "Сохранить фотографии" Or $oButton.className = "flat_button" Then
				_IEAction($oButton, "focus")
				Sleep(100)
				_IEAction($oButton, "click")
				ExitLoop
			EndIf
		Next
	Until IsObj($oButtons)
	$iFlag = 0
	Do
		Sleep(100)
		$oDivs = _IETagNameGetCollection($oIE, "div")
		If Not IsObj($oDivs) Then ExitLoop
		For $oDiv In $oDivs
			If StringInStr($oDiv.id, "photo_save_result-") Then
				$iFlag = 1
				ExitLoop
			EndIf
		Next
	Until $iFlag = 0
	ConsoleWrite("Save OK" & @CRLF)
	IniWrite($sConfigFilePath, "config", "line", $i)
	ConsoleWrite("----------" & @CRLF)
Next

_IEQuit($oIE)


Func _Excel_BookReadToArray($_sPath, ByRef $_aArray)
	If Not FileExists($_sPath) Then Return SetError(1, 0, 0)
	Local $oAppl = _Excel_Open()
	If @error Then Return SetError(2, 0, 0)
	Local $oWorkbook = _Excel_BookOpen($oAppl, $_sPath)
	If @error Then
		_Excel_Close($oAppl)
		Return SetError(3, 0, 0)
	EndIf
	Dim $_aArray[0][3]
	Local $iIndex = 0, $A = "", $B = "", $C = ""
	While 1
		$A = _Excel_RangeRead($oWorkbook, Default, "A" & Execute($iIndex + 1))
		If @error Or $A == "" Then ExitLoop
		$B = _Excel_RangeRead($oWorkbook, Default, "B" & Execute($iIndex + 1))
		If @error Or $B == "" Then ExitLoop
		$C = _Excel_RangeRead($oWorkbook, Default, "C" & Execute($iIndex + 1))
		If @error Or $C == "" Then ExitLoop
		ReDim $_aArray[$iIndex + 1][3]
		$_aArray[$iIndex][0] = $A
		$_aArray[$iIndex][1] = $B
		$_aArray[$iIndex][2] = $C
		$iIndex += 1
	WEnd
	_Excel_Close($oAppl)
	Return 1
EndFunc   ;==>_Excel_BookReadToArray


Добавлено:
Сообщение автоматически объединено:

OffTopic:

Функцию для чтения excel в массив я не нашёл, по этому написал свою функцию _Excel_BookReadToArray. :smile:
Была бы там функция по типу как
Код:
_IETableWriteToArray

Было бы вообще отлично. :smile: Может быть такая функция есть, но я её не обнаружил... :(





Спасибо огромное, с первых прибылей если все получится готов вознаградить :smile:!!! А для чего этот файл нужен? \vk_photos_album_config.ini
Я без него пока попробовал запустить открывается нужный файл tovar.xlsx c базой товаров, и процессор на 100% загружен, дальше ничего не происходит :(. Просто стоит открытая книга EXCEL, но стоит закрыть книгу, тут же, открывается IE заходит вконтакт, потом по ссылке в альбом в который нужно грузить. Вроде и грузит но альбом пустой все равно, пути на папки с изображениями верные стоят
 

Вложения

  • 2015-07-02 19-25-52 Фотографии - Windows Internet Explorer.png
    2015-07-02 19-25-52 Фотографии - Windows Internet Explorer.png
    154.8 КБ · Просмотры: 26

alex33

Скриптер
Сообщения
1,457
Репутация
186
DOMINANT [?]
А для чего этот файл нужен? \vk_photos_album_config.ini
В него записывается последняя строка и потом из него берётся при повторном запуске.

попробовал запустить открывается нужный файл tovar.xlsx c базой товаров, и процессор на 100% загружен, дальше ничего не происходит :(. Просто стоит открытая книга EXCEL, но стоит закрыть книгу, тут же, открывается IE заходит вконтакт
Книга закроется сама и браузер тоже сам откроется (их трогать не надо). Скрипт просто считывает информацию из Excel в массив, это может занять длительное время. Это нормально, так и должно быть.


Добавлено:
Сообщение автоматически объединено:

P.S. alex33 [?]
Я протестировал этот скрипт, у меня он работает отлично


Добавлено:
Сообщение автоматически объединено:

И альбом не пустой, всё нормально загружает и сохраняет.
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Автор
DOMINANT

DOMINANT

Новичок
Сообщения
42
Репутация
0
Блин так у меня же IE 8 стоит Windows XP, поэтому и не грузит, на IE 11 пашет наверняка под Windows 7 :D, стрелкой указал может из за этого?
 

Вложения

  • 2015-07-02 19-25-52 Фотографии - Windows Internet Explorer (2).png
    2015-07-02 19-25-52 Фотографии - Windows Internet Explorer (2).png
    159.6 КБ · Просмотры: 21

alex33

Скриптер
Сообщения
1,457
Репутация
186
Возможно из-за заголовка окна. Вот универсальный вариант:
Код:
$hWin = WinWait("[REGEXPTITLE:(Выбор выкладываемого файла|Выбор файла); CLASS:#32770]", "", 10)



Добавлено:
Сообщение автоматически объединено:

Можно ещё вот эту строку:
Код:
ControlClick($hWin, "", "Button1", "main", 1)

убрать и заменить на эту:
Код:
ControlSend($hWin, "", "Edit1", "{ENTER}")

Потому что я сейчас переставил Windows на XP, а там, как выяснилось, не только заголовок окна другой, но и кнопка не нажимается...
 
Автор
DOMINANT

DOMINANT

Новичок
Сообщения
42
Репутация
0
Ребят попробуйте воспроизвести скрипт у себя кто ни будь. Скрипт у автора работает вроде нормально, но на моей системе получаю ошибку, как ее можно исравить? :stars:

--> IE.au3 T3.0-1 Error from function _IENavigate, $_IESTATUS_COMError (-2147352567)

Windows 7 x86
IE 11 v.11.0.9600.17843

Код:
#include <Array.au3>; подключаем библиотеку для работы с массивами
#include <File.au3>; подключаем библиотеку для работы с файлами
#include <IE.au3>; подключаем библиотеку для работы с браузером IE
#include <Excel.au3>; подключаем библиотеку для работы с Excel
Local $tmp, $arr, $oIE, $aFiles, $sImageFilePath, $oTextareas, $oButtons, $oDivs, $iFlag = 0; переменные
Local $sConfigFilePath = @UserProfileDir & "\vk_photos_album_config.ini"; путь к конфигурационному файлу
Local $sPathXL = @ScriptDir & "\tovar2.xlsx"; путь к Excel файлу с данными
Local $sPathImages = @ScriptDir & "\zara_men"; папка, где искать изображения

_Excel_BookReadToArray($sPathXL, $arr)
If @error Then Exit 1
;_ArrayDisplay($arr)

_IELoadWaitTimeout(10000)
$oIE = _IECreate("http://vk.com/")
If @error Or Not IsObj($oIE) Then Exit 2
$tmp = IniRead($sConfigFilePath, "config", "line", "0")
If (Not StringIsDigit($tmp)) Or ($tmp > UBound($arr)) Or ($tmp < 1) Then $tmp = 0
If $tmp > 0 Then $tmp += 1
For $i = $tmp To UBound($arr) - 1
    ConsoleWrite("For#" & $i & "/" & UBound($arr) & @CRLF)
    If StringInStr($arr[$i][0], "http") = 0 Then ContinueLoop
    Sleep(1000)
    $aFiles = _FileListToArrayRec($sPathImages, $arr[$i][1], $FLTAR_FILES, $FLTAR_NORECUR, $FLTAR_NOSORT, $FLTAR_FULLPATH)
    If @error Or Not IsArray($aFiles) Then ContinueLoop
    $sImageFilePath = $aFiles[1]
    If Not StringInStr($sImageFilePath, '"') Then $sImageFilePath = StringFormat('"%s"', $sImageFilePath)
    _IENavigate($oIE,$arr[$i][0])
    Sleep(100)
    ConsoleWrite(StringFormat("URL: %s; Files: %s; Desc: %s\r\n", $arr[$i][0], $arr[$i][1], $arr[$i][2]))
    ;_ArrayDisplay($aFiles,"files#"&$i)
    _IENavigate($oIE, 'javascript:document.getElementById("photos_upload_area").click();void(0);', 0)
    $hWin = WinWait("[REGEXPTITLE:(Выбор выкладываемого файла|Выбор файла|Выберите файлы для отправки с помощью vk.com); CLASS:#32770]", "", 10)
    If Not $hWin Then ContinueLoop
    ControlFocus($hWin, "", "Edit1")
    Sleep(100)
    ControlSetText($hWin, "", "Edit1", $sImageFilePath)
    Sleep(100)
    ControlFocus($hWin, "", "Button1")
    Sleep(100)
    ControlSend($hWin, "", "Edit1", "{ENTER}")
    ConsoleWrite("Selected file: " & $sImageFilePath & @CRLF)
    WinWaitNotActive($hWin, "", 2)
    Do
        Sleep(100)
        $oTextareas = _IETagNameGetCollection($oIE, "textarea")
        If Not IsObj($oTextareas) Then ContinueLoop
        $oPhotos_add_s_caption = 0
        For $oTextarea In $oTextareas
            If $oTextarea.className = "photos_add_s_caption" Then
                $oPhotos_add_s_caption = $oTextarea
                ExitLoop
            EndIf
        Next
    Until IsObj($oPhotos_add_s_caption)
    _IEAction($oPhotos_add_s_caption, "focus")
    Sleep(100)
    _IEFormElementSetValue($oPhotos_add_s_caption, $arr[$i][2])
    Sleep(100)
    _IEAction($oPhotos_add_s_caption, "blur")
    Do
        Sleep(100)
        $oButtons = _IETagNameGetCollection($oIE, "button")
        If Not IsObj($oButtons) Then ContinueLoop
        For $oButton In $oButtons
            If $oButton.innerHTML = "Сохранить фотографии" Or $oButton.className = "flat_button" Then
                _IEAction($oButton, "focus")
                Sleep(100)
                _IEAction($oButton, "click")
                ExitLoop
            EndIf
        Next
    Until IsObj($oButtons)
    $iFlag = 0
    Do
        Sleep(100)
        $oDivs = _IETagNameGetCollection($oIE, "div")
        If Not IsObj($oDivs) Then ExitLoop
        For $oDiv In $oDivs
            If StringInStr($oDiv.id, "photo_save_result-") Then
                $iFlag = 1
                ExitLoop
            EndIf
        Next
    Until $iFlag = 0
    ConsoleWrite("Save OK" & @CRLF)
    IniWrite($sConfigFilePath, "config", "line", $i)
    ConsoleWrite("----------" & @CRLF)
Next

_IEQuit($oIE)


Func _Excel_BookReadToArray($_sPath, ByRef $_aArray)
    If Not FileExists($_sPath) Then Return SetError(1, 0, 0)
    Local $oAppl = _Excel_Open()
    If @error Then Return SetError(2, 0, 0)
    Local $oWorkbook = _Excel_BookOpen($oAppl, $_sPath)
    If @error Then
        _Excel_Close($oAppl)
        Return SetError(3, 0, 0)
    EndIf
    Dim $_aArray[0][3]
    Local $iIndex = 0, $A = "", $B = "", $C = ""
    While 1
        $A = _Excel_RangeRead($oWorkbook, Default, "A" & Execute($iIndex + 1))
        If @error Or $A == "" Then ExitLoop
        $B = _Excel_RangeRead($oWorkbook, Default, "B" & Execute($iIndex + 1))
        If @error Or $B == "" Then ExitLoop
        $C = _Excel_RangeRead($oWorkbook, Default, "C" & Execute($iIndex + 1))
        If @error Or $C == "" Then ExitLoop
        ReDim $_aArray[$iIndex + 1][3]
        $_aArray[$iIndex][0] = $A
        $_aArray[$iIndex][1] = $B
        $_aArray[$iIndex][2] = $C
        $iIndex += 1
    WEnd
    _Excel_Close($oAppl)
    Return 1
EndFunc   ;==>_Excel_BookReadToArray
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Возможно эта ошибка возникает из-за режима совместимости.
 

Anufriy

Новичок
Сообщения
3
Репутация
0
Возможно сделать все тоже самое но только через API VK?
 
Верх