Задать вопрос
@BXJIAM

Как загрузить фотографию в группу Одноклассников на Python?

Есть код:

spoiler
import hashlib
import requests

# Конфигурация
ACCESS_TOKEN = 'OAuth токен из приложения'
GROUP_ID = 'ID группы, куда загружается фото'
PHOTO_PATH = 'Путь к фотографии.jpg'
APPLICATION_KEY = 'Ключ приложения"
SECRET_KEY = 'Секретный ключ приложения'

# Базовый URL API Одноклассников
BASE_URL = 'https://api.ok.ru/fb.do'


# Генерация сигнатуры
def generate_signature(params, secret_key):
    sorted_params = ''.join([f'{k}={params[k]}' for k in sorted(params)])
    signature = hashlib.md5((sorted_params + secret_key).encode('utf-8')).hexdigest()
    return signature


# Получение URL для загрузки фотографии
def get_upload_url():
    method = 'photosV2.getUploadUrl'
    params = {
        'application_key': APPLICATION_KEY,
        'format': 'json',
        'gid': GROUP_ID,
        'method': method,
        'access_token': ACCESS_TOKEN
    }
    params['sig'] = generate_signature(params, SECRET_KEY)

    response = requests.get(BASE_URL, params=params)
    data = response.json()

    if 'upload_url' in data:
        return data['upload_url']
    else:
        raise Exception(f"Ошибка при получении upload_url: {data}")


# Загрузка фотографии на сервер
def upload_photo(upload_url):
    with open(PHOTO_PATH, 'rb') as photo_file:
        files = {'file': photo_file}
        response = requests.post(upload_url, files=files)
        return response.json()


# Подтверждение загрузки фотографии
def confirm_photo(photo_id):
    method = 'photosV2.commit'
    params = {
        'application_key': APPLICATION_KEY,
        'format': 'json',
        'gid': GROUP_ID,
        'photo_id': photo_id,
        'method': method,
        'access_token': ACCESS_TOKEN
    }
    params['sig'] = generate_signature(params, SECRET_KEY)

    response = requests.get(BASE_URL, params=params)
    return response.json()


# Основная функция
def main():
    try:
        # Шаг 1: Получение URL для загрузки
        upload_url = get_upload_url()
        print("Upload URL получен:", upload_url)

        # Шаг 2: Загрузка фотографии
        upload_response = upload_photo(upload_url)
        print("Ответ после загрузки:", upload_response)

        if 'photos' in upload_response and isinstance(upload_response['photos'], dict):
            photo_key = next(iter(upload_response['photos']))
            if photo_key and 'token' in upload_response['photos'][photo_key]:
                photo_id = upload_response['photos'][photo_key]['token']
                print(f"Извлеченный token: {photo_id}")

                # Шаг 3: Подтверждение загрузки
                confirm_response = confirm_photo(photo_id)
                print("Фотография успешно загружена:", confirm_response)
            else:
                print("Токен не найден в ответе.")
        else:
            print("Не удалось загрузить фотографию.")

    except Exception as e:
        print("Произошла ошибка:", str(e))


if __name__ == '__main__':
    main()


Выдаёт ошибку:
{'error_code': 100, 'error_msg': "PARAM : Parameter 'token' must be specified", 'error_data': '1', 'error_field': 'token'}

куда копать, чтобы исправить?
  • Вопрос задан
  • 32 просмотра
Подписаться 1 Средний 4 комментария
Пригласить эксперта
Ответы на вопрос 1
phaggi
@phaggi Куратор тега Python
лужу, паяю, ЭВМы починяю
Пока что из ошибки можно вывести, что формирование параметров производится неверно. Должен быть ключ “token”, но его видимо нет в сформированных параметрах. Копайте туда.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы