artbobylev.ru

Как настроить автопостинг товаров vk-маркета группы вконтакте?

В предыдущей статье мы добавили 15 тысяч товаров в VK-маркет группы, используя API вконтакте.

Теперь настроим ежедневный автопостинг публикаций с фотографиями, описанием и ценой товаров – группа будет «живой»!

Так, например, выглядит автоматическая публикация для одного из моих проектов – the.predstav.store

Пишем bash-скрипт

TOKEN="<++>"
GROUP_ID="<++>"
URL="https://api.vk.com/method/"

count=$(curl "${URL}market.get" -F "access_token=${TOKEN}" -F "owner_id=-${GROUP_ID}" -F "count=1" -F "offset=0" -F "v=5.199" | jq -r '.response.count|tonumber')

random_id=$(( RANDOM % count ))

random_product=$(curl "${URL}market.get" -F "access_token=${TOKEN}" -F "owner_id=-${GROUP_ID}" -F "count=1" -F "extended=1" -F "offset=${random_id}" -F "v=5.199")

title=$(echo "$random_product" | jq -r '.response.items[] | .title')
price=$(echo "$random_product" | jq -r '.response.items[] | .price.text')
url=$(echo "$random_product" | jq -r '.response.items[] | .market_url')
photos=$(echo "$random_product" | jq -r '.response.items[] | .photos[] | .orig_photo.url')

photos_data=()
for my_photo in $photos; do
	tempfile="$(mktemp).jpg"
	wget -O "$tempfile" "$my_photo"

	upload=$(curl "${URL}photos.getWallUploadServer" -F "access_token=${TOKEN}" -F "group_id=${GROUP_ID}" -F "v=5.199");
	upload_url=$(echo "$upload" | jq -r '.[].upload_url')
	result=$(curl "${upload_url}" -F "photo=@${tempfile}")
	response=$(curl "${URL}photos.saveWallPhoto" -F "access_token=${TOKEN}" -F "group_id=${GROUP_ID}" -F "photo=$(echo "$result" | jq -r '.photo')" -F "server=$(echo "$result" | jq '.server')" -F "hash=$(echo "$result" | jq '.hash' )" -F "v=5.199")
	id=$(echo "$response" | jq -r '.response[] | .id')
	owner_id=$(echo "$response" | jq -r '.response[] | .owner_id')
	photos_data+=("photo${owner_id}_${id}")
	rm "$tempfile"
done

echo "$title"
echo "$price"
echo "$url"
echo "$photos"

caption="[${url}|${title}]

${price}"

curl "${URL}wall.post" -F "access_token=${TOKEN}" -F "owner_id=-${GROUP_ID}" -F "message=${caption}" -F "from_group=1" -F "attachments=$(printf '%s,' "${photos_data[@]}")" -F "v=5.199"

TOKEN – ключ доступа пользователя-администратора группы с правами wall, photos. Не знаете, где взять ключ доступа? Например, здесь.

GROUP_ID – идентификатор сообщества. Если вы не добавляли короткий адрес – идентификатор можно найти в адресной строке. Или в настройках группы.

Что делает скрипт

Вначале получим общее число товаров группы, которое содержится в поле count ответа:

count=$(curl "${URL}market.get" -F "access_token=${TOKEN}" -F "owner_id=-${GROUP_ID}" -F "count=1" -F "offset=0" -F "v=5.199" | jq -r '.response.count|tonumber')

Выберем случайное число от 0 до count-1

random_id=$(( RANDOM % count ))

Получим информацию о случайном товаре, используя ключи count=1(один товар в ответе) и offset=${random_id}(отступ):

random_product=$(curl "${URL}market.get" -F "access_token=${TOKEN}" -F "owner_id=-${GROUP_ID}" -F "count=1" -F "extended=1" -F "offset=${random_id}" -F "v=5.199")

Выделяем нужные данные – title, price, url, photos:

title=$(echo "$random_product" | jq -r '.response.items[] | .title')
price=$(echo "$random_product" | jq -r '.response.items[] | .price.text')
url=$(echo "$random_product" | jq -r '.response.items[] | .market_url')
photos=$(echo "$random_product" | jq -r '.response.items[] | .photos[] | .orig_photo.url')

В этой части кода мы вынужденно перезагружаем изображения вконтакте – так работают методы API. Насколько я смог разобраться, передать id уже загруженных изображений в метод wall.post не удастся.

photos_data=()
for my_photo in $photos; do
	...
done

Публикуем запись c message=${caption} и attachments – изображениями товара:

curl "${URL}wall.post" -F "access_token=${TOKEN}" -F "owner_id=-${GROUP_ID}" -F "message=${caption}" -F "from_group=1" -F "attachments=$(printf '%s,' "${photos_data[@]}")" -F "v=5.199"

Подробную документацию по каждому из использованных методов можно посмотреть на сайте вконтакте: market.get, photos.getWallUploadServer, photos.saveWallPhoto, wall.post.


Этот скрипт можно разместить на сервере с cronjob для ежедневного выполнения-публикации. Или сразу же создать все записи и добавить их в отложенные.

Подобный автопостинг можно настроить и для телеграм-канала.

Хотите, чтобы я это сделал за вас? Напишите мне.


Читать ещё:

⟲ на главную

Подпишись на мою рассылку!