Struggling to Implement Imgur Image Upload in C# - Need Assistance

46 Views Asked by At
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;

namespace AGC_Management.Services
{
    public class ImgurUploadService
    {
        public async Task<string> UploadImage(Byte[] imageData)
        {

            string base64Image = Convert.ToBase64String(imageData);
            var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://api.imgur.com/3/upload");
            httpWebRequest.Headers.Add("Authorization", "Client-ID " + BotConfig.GetConfig()["ImgurAPI"]["ImgurClientID"]);
            httpWebRequest.Method = "POST";

            await using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
            {
                //string json = "{\"image\":\"" + base64Image + "\"}";
                string json = "{\"image\":\"" + base64Image + "\",\"type\":\"base64\"}";
                streamWriter.Write(json);
                streamWriter.Flush();
                streamWriter.Close();
            }

            var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
            
            using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
            {
                var responseText = streamReader.ReadToEnd();
                return JObject.Parse(responseText)["data"]["id"].ToString();
            }
        }


        public async Task<string> CreateAlbum(List<string> imageIds)
        {
            var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://api.imgur.com/3/album");
            httpWebRequest.Headers.Add("Authorization", "Client-ID " + BotConfig.GetConfig()["ImgurAPI"]["ImgurClientID"]);
            httpWebRequest.Method = "POST";

            await using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
            {
                string json = "{\" ids\":" + JsonConvert.SerializeObject(imageIds) + "}";
                streamWriter.Write(json);
                streamWriter.Flush();
                streamWriter.Close();
            }

            var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
            using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
            {
                var responseText = streamReader.ReadToEnd();
                return JObject.Parse(responseText)["data"]["id"].ToString();
            }
        }
    }
}


    [Command("imgurtest")]
    public async Task ImgurTest(CommandContext ctx, string reason)
    {
        var imgExtensions = new[] { ".jpg", ".jpeg", ".png", ".gif", ".bmp" };
        var imgAttachments = ctx.Message.Attachments
            .Where(att => imgExtensions.Contains(Path.GetExtension(att.FileName).ToLower()))
            .ToList();
        string imgurUrl = "";
        if (imgAttachments.Count > 0)
        {
            List<string> imageIds = new();
            var uploader = new ImgurUploadService();
            foreach (var item in imgAttachments)
            {
                byte[] imageBytes;
                using (var webClient = new HttpClient())
                {
                    imageBytes = await webClient.GetByteArrayAsync(item.Url);
                }
                String imageId = await uploader.UploadImage(imageBytes);
                imageIds.Add(imageId);
            }
            var album = await uploader.CreateAlbum(imageIds);
            imgurUrl = $" http://imgur.com/a/{album}";
        }
        await ctx.RespondAsync($"{reason}{imgurUrl}");
    }

I try to upload things to Imgur via a Discord Command written in C# I only get 400 Bad Request from Imgur

Here's what I've tried so far:

Registered my application on the Imgur website and obtained the client ID and client secret. Used the Imgur API endpoint (https://api.imgur.com/3/image) along with the necessary parameters and headers in my C# code. Attempted different HTTP libraries (e.g., HttpClient, WebClient) to perform the POST request to upload an image, but no luck.

The Client ID is also corrent

I expect that the upload gives me a Image ID back that i can add to an album

0

There are 0 best solutions below