3

我有一个 .net 控制台应用程序,我想使用它通过 Instasharp 包装器使用主题标签搜索来拉取 Instagram 帖子。

我广泛使用 C# .net Web 表单,对 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 ) 的文档。GitHub 的例子是基于一个 MVC 应用程序,我的不是 MVC 项目,而是一个控制台应用程序。

我觉得我很接近,也许其他人会从帮助我解决这个问题中受益。

我的具体问题...... 1)不确定OAuth方法中的'code'参数来自哪里?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");
    }
4

1 回答 1

0

我的节目有点晚了,但可能我的回答会帮助像我这样在谷歌搜索时发现这个问题的人。

您的方法的主要问题是 Instagram 正在使用 OAuth 身份验证。我建议您在 OAuth 上 google 以了解其原理,但我将尝试在下面解释它的实用点。

OAuth 方法意味着InstagramLogin上面代码片段中方法的结果不是代码。这是您需要向您发送用户的链接(是的,使用浏览器或网络视图),以便他们可以登录他们的 Instagram 帐户,然后授权您的应用程序访问他们的数据(所谓的用户同意屏幕)。

最后,在用户同意后,Instagram 会将浏览器重定向到您选择的 URL(它应该先前添加到 Instagram API 中允许的重定向 URL 列表中 -> 管理客户端(右上角)-> 创建/选择客户端管理 -> 安全选项卡)

您可以尝试设置断点并将值复制instagramLoginLink到浏览器的地址框中。您将能够看到身份验证和同意的整个流程 - 最后是最有可能在您的浏览器中产生 404 的重定向 url。

这个最终链接将包含 get 参数中的代码。就是所谓的授权码,可以让你获得一个访问令牌。此代码将从 url 中提取,然后用于您对OAuth.RequestToken) 的调用。

PS:是的,我上面所说的一切意味着您需要运行一个将用户重定向到 Instagram 的 Web 应用程序,或者一个向用户显示 Web 视图并以某种方式处理 Instagram 将用户发送回您的那一刻的客户端应用程序。重定向 url - 获取代码并继续。

于 2017-04-01T12:47:05.113 回答