Скрипт для загрузки картинки на Imgur

Как правильно задавать вопросы Правильно сформулированный вопрос и его грамотное оформление способствует высокой вероятности получения достаточно содержательного и по существу ответа. Общая рекомендация по составлению тем: 1. Для начала воспользуйтесь поиском форума. 2. Укажите версию ОС вместе с разрядностью. Пример: LM 19.3 x64, LM Sarah x32 3. DE. Если вопрос касается двух, то через запятую. (xfce, KDE, cinnamon, mate) 4. Какое железо. (достаточно вывод inxi -Fxz в спойлере (как пользоваться спойлером смотрим здесь)) или же дать ссылку на hw-probe 5. Суть. Желательно с выводом консоли, логами. 6. Скрин. Просьба указывать 2, 3 и 4 независимо от того, имеет ли это отношение к вопросу или нет. Так же не забываем об общих правилах Как пример вот
Аватара пользователя

Автор темы
rogoznik
Сообщения: 10075
Зарегистрирован: 27 июн 2017, 13:36
Решено: 131
Откуда: Нижний Тагил
Благодарил (а): 777 раз
Поблагодарили: 1965 раз
Контактная информация:

Скрипт для загрузки картинки на Imgur

#1

07 сен 2023, 19:22

Для загрузки потребуется аккаунт на Imgur.
Аккаунт требуется даже если хотим загружать картинки как anonymous.
Аккаунт есть, теперь идем на страницу создания(добавления) приложения.
Screenshot_20230907_205104.png
Заполняем поле Application name.
Следующее поле Authorization type заполняется в зависимости от того как мы хотим загружать картинки. Как пользователь с авторизацией(тут можно загружать картинки в выбранный альбом в свой аккаунт) или без авторизации(тут даже не знаю куда они загружаются).

Сначала разберемся с более простым вариантом - загрузкой картинок без авторизации.
Выбираем тип Anonymous usage without user authorization и заполняем поле Email.
Заполняем капчу и нажимаем кнопку submit.
Тут столкнемся с ошибкой что необходимо заполнить поле Authorization callback URL - это баг на форме.
Нужно выбрать тип OAuth 2 authorization without a callback URL, а затем снова наш тип Anonymous usage without user authorization.
После это можно нажимать кнопку submit.
После этого увидим 2 поля Client ID и Client secret.
Нам понадобиться только Client ID
Теперь можем написать такой скрипт

Код: Выделить всё

#!/bin/bash

client_id=123abc
file=@$1

response=$(curl -s -H "Authorization: Client-ID $client_id" -H "Expect: " -F "type=file" -F "image=$file" https://api.imgur.com/3/image)

status=$(echo $response | jq -r '.status') #получаем статус ответа

if [[ $status -eq 200 ]]
then
    echo $response | jq -r '.data.link' | xclip -selection clipboard #копируем ссылку в буфер обмена
    url=$(echo $response | jq -r '.data.link')
    notify-send "Отправка в Imgur" "Картинка загружена на Imgur<br>Ссылка скопирована в буфер обмена<br><a href=\"$url\">$url</a>" #показывает сообщение о том что картинку удачно загружена и что ссылка скопирована в буфер обмена
else
    error=echo $response | jq -r '.error'
    notify-send -u critical "Отправка в Imgur" "Отправка не удалась<br>$error" #показываем сообщение об ошибке
fi
Установка заголовка Expect честно взял тут
Для работы скрипта необходимо установить xclip и notify-send
client_id заменить на свой

Скрипт подготовлен чтоб его использовать для действия в ФМ. Я делал действие Dolphin(KDE)

Теперь разберемся как загружать картинки в альбом своего аккаунта
Тут нам понадобиться Postmanдокументации советуют его, только интерфейс поменялся)

Выбираем тип OAuth 2 authorization with a callback URL, заполняем поле Email.
Поле Authorization callback URL заполняем такой ссылкой https://www.getpostman.com/oauth2/callback
Заполняем капчу и нажимаем кнопку submit.
После этого увидим 2 поля Client ID и Client secret.
Тут нам нужны оба поля

Теперь открываем Postman(он требует залогиниться, вроде, без этого им не воспользоваться, хз, у меня просто есть аккаунт)
Создаем новый http-запрос
Screenshot_20230907_213509.png
Переходим на вкладку Authorization
Выбираем Type OAuth 2.0
Далее заполняем поля
Grant Type Authorization Code
Callback URL https://www.getpostman.com/oauth2/callback
Auth URL https://api.imgur.com/oauth2/authorize
Access Token URL https://api.imgur.com/oauth2/token
Client ID 123abc - заменить на свое
Client Secret 123abc - заменить на свое
И нажимаем кнопку Get New Access Token
Появится окно где необходимо ввести логин/пароль Imgur. Окно закроется.
Нужно подождать и появится еще окно с данными от Imgur.
Оттуда нам понадобится 2 поля: access_token и refresh_token

Теперь можем написать такой скрипт
А перед этим получим id альбома

Код: Выделить всё

curl -s -H "Authorization: Client-ID 123abc" https://api.imgur.com/3/account/login/albums 
Client-ID и login подставить свои
В полученной портянке(json) найти нужный альбом и посмотреть его ID

Код: Выделить всё

#!/bin/bash

client_id=123abc
client_secret=123abc
access_token=123abc
album_hash=123abc
file=@$1

response=$(curl -s -H "Authorization: Bearer $access_token" -H "Expect: " -F "type=file" -F "image=$file" -F "album=$album_hash" https://api.imgur.com/3/image)

status=$(echo $response | jq -r '.status')

if [[ $status -eq 200 ]]
then
    echo $response | jq -r '.data.link' | xclip -selection clipboard
    url=$(echo $response | jq -r '.data.link')
    notify-send "Отправка в Imgur" "Картинка загружена на Imgur<br>Ссылка скопирована в буфер обмена<br><a href=\"$url\">$url</a>"
else
    error=echo $response | jq -r '.error'
    notify-send -u critical "Отправка в Imgur" "Отправка не удалась<br>$error"
fi
Установка заголовка Expect честно взял тут
Для работы скрипта необходимо установить xclip и notify-send
client_id заменить на свой
client_secret заменить на свой
access_token заменить на свой
album_hash заменить на свой

Скрипт подготовлен чтоб его использовать для действия в ФМ. Я делал действие Dolphin(KDE)

Важно
access_token выдается на время, это время можно увидеть в Postman, когда получили данные от Imgur поле expires(не помню точно). Если правильно помню там было 3600. В каких единицах хз, подозреваю что в секундах.
Когда закончится срок действия access_token нужно получить новый.
Я делаю таким скриптом

Код: Выделить всё

#!/bin/bash

client_id=123abc
client_secret=123abc
refresh_token=123abc

responce=$(curl -s -F "refresh_token=$refresh_token" -F "client_id=$client_id" -F "client_secret=$client_secret" -F "grant_type=refresh_token" https://api.imgur.com/oauth2/token)

new_access_token=$(echo $responce | jq -r '.access_token')
new_refresh_token=$(echo $responce | jq -r '.refresh_token')

if [[ -z "$new_access_token" ]]
then
    echo $response
else
    echo "new_access_token: $new_access_token"
    echo "new_refresh_token: $new_refresh_token"
fi
В ответ придет json в нем будут поля access_token и refresh_token.
Полей в ответе будет больше, но нам нужны только эти.
Теперь заменяем старые токены новыми.
И тут в ответе будет поле expires_in со значением 315360000(если в секундах - то это 10 лет) :hoho:

И еще - если потеряли refresh_token то нужно будет снова через Postman делать авторизацию
ИзображениеИзображение

Ответить

Вернуться в «Программирование, скриптинг, виртуализация»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей