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 перенаправления - чтобы получить код и продолжить.