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 для ежедневного выполнения-публикации. Или сразу же создать все записи и добавить их в отложенные.
Подобный автопостинг можно настроить и для телеграм-канала.
Хотите, чтобы я это сделал за вас? Напишите мне.