Instasharp в консольном приложении

У меня есть консольное приложение.net, которое я хочу использовать для извлечения сообщений из Instagram через упаковку Instasharp с помощью поиска по хэштегу.

Я широко использую веб-формы на C# .net и не очень хорошо знаком с MVC и с тем, как использовать ключевое слово await. Пример кода ниже, кажется, работает, но никогда не дает никакого вывода.

Эта строка:

var tagInfo = await tagApi.Get("soccer");

Возвращает меня к вызывающему методу без указания полученных данных.

Может кто-нибудь дать представление о том, что я делаю здесь неправильно?

public static async void GetInstagram(String tag, InstagramConfig config)
{
    var instagramPosts = await LoadInstagramPosts(tag, config);
    dynamic dyn = JsonConvert.DeserializeObject(instagramPosts.ToString());

        foreach (var data in dyn.data)
        {
            Console.WriteLine("{0} - {1}", data.filter, data.images.standard_resolution.url);
        }
    }

    public static async Task<TagResponse> LoadInstagramPosts(String hashTagTerm, InstagramConfig config)
    {
        var tagApi = new InstaSharp.Endpoints.Tags(config);
        var tagInfo = await tagApi.Get("soccer");
 }

РЕДАКТИРОВАННЫЙ код после первого комментария, который решил мою первоначальную проблему.

Я чувствую, что я рядом, но чего-то не хватает. Смотрите конкретные вопросы ниже...

Я основал код на документации из InstaSharp GitHub ( https://github.com/InstaSharp/InstaSharp). Пример GitHubs основан на приложении MVC, мое - не проект MVC, а консольное приложение.

Я чувствую, что я очень близок, и, возможно, другим будет полезно помочь мне решить это.

Мои конкретные вопросы... 1) Не уверен, откуда происходит параметр 'code' в методе OAuth?? 2) Как выполнить необходимые обратные вызовы с Instagram??

var config = new InstaSharp.InstagramConfig(location.InstagramClientId, location.InstagramClientSecret, "http://localhost");
    string instagramLoginLink = InstagramLogin(config);
    GetInstagram("soccer", config, instagramLoginLink);
    public static async void GetInstagram(String tag, InstagramConfig config, string code)
    {
        OAuthResponse oAuthResponse = await OAuth(code, config);
        var instagramPosts = await LoadInstagramPosts(tag, config, oAuthResponse);
        if(instagramPosts.Data != null)
        { 
            dynamic dyn = JsonConvert.DeserializeObject(instagramPosts.Data.ToString());

            foreach (var data in dyn.data)
            {
                Console.WriteLine("{0} - {1}", data.filter, data.images.standard_resolution.url);
            }
        }
    }

    public static string InstagramLogin(InstagramConfig config)
    {
        var scopes = new List<OAuth.Scope>();
        scopes.Add(InstaSharp.OAuth.Scope.Likes);
        scopes.Add(InstaSharp.OAuth.Scope.Comments);

        string link = InstaSharp.OAuth.AuthLink(config.OAuthUri + "authorize", config.ClientId, config.RedirectUri, scopes, InstaSharp.OAuth.ResponseType.Code);

        return link;
    }

    public static async Task<OAuthResponse> OAuth(string code, InstagramConfig config)
    {
        // add this code to the auth object
        var auth = new OAuth(config);

        // now we have to call back to instagram and include the code they gave us
        // along with our client secret
        return await auth.RequestToken(code);
    }

    public static async Task<TagResponse> LoadInstagramPosts(String hashTagTerm, InstagramConfig config, OAuthResponse OAuth)
    {
        var tagApi = new InstaSharp.Endpoints.Tags(config, OAuth);
        return await tagApi.Get("soccer");
    }

1 ответ

Я немного опоздал на шоу, но, вероятно, мой ответ поможет кому-то, кто найдет этот вопрос при поиске, кто-то вроде меня.

Основная проблема с вашим подходом в том, что Instagram использует OAuth-аутентификацию. Я предлагаю вам заглянуть в OAuth, чтобы понять принципы, но я постараюсь объяснить практические моменты этого ниже.

Подход OAuth означает, что результат InstagramLogin Метод во фрагменте выше не является кодом. Это ссылка, по которой вам нужно отправить своего пользователя (да, с помощью браузера или веб-просмотра), чтобы они могли войти в свою учетную запись Instagram и затем авторизовать ваше приложение для доступа к своим данным (так называемый экран согласия пользователя).

В конце концов, после согласия пользователя Instagram перенаправит браузер на URL-адрес по вашему выбору (он должен быть предварительно добавлен в список разрешенных URL-адресов перенаправления в Instagram API -> Управление клиентами (в верхнем правом углу) -> Создать / Выбрать клиент Управление -> вкладка Безопасность)

Вы можете попробовать установить точку останова и скопировать значение instagramLoginLink в адресную строку вашего браузера. Вы сможете увидеть весь поток аутентификации и согласия - и, наконец, URL-адрес перенаправления, который, скорее всего, выдаст 404 в вашем браузере.

Эта последняя ссылка будет содержать код в параметре get. Это так называемый код предоставления, который позволяет вам получить токен доступа. Этот код должен быть извлечен из URL, а затем использован в вашем звонке OAuth.RequestToken).

PS: Да, все, что я говорю выше, означает, что вам нужно либо запустить веб-приложение, которое перенаправит пользователя в Instagram, либо клиентское приложение, которое покажет пользователю веб-представление и каким-то образом обработает момент, когда Instagram отправит пользователя обратно в ваш URL перенаправления - чтобы получить код и продолжить.

Другие вопросы по тегам