控制台应用程序中的Instasharp

时间:2016-08-09 22:16:58

标签: c# .net console-application instagram instasharp

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

我广泛使用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");
 }

第一条评论后的EDITED代码解决了我的初始问题。

我觉得我很亲密,但仍然缺少某些东西。 请参阅以下具体问题......

我的代码来自InstaSharp GitHub(https://github.com/InstaSharp/InstaSharp)的文档。 GitHubs示例基于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");
    }

1 个答案:

答案 0 :(得分:0)

我在演出时有点晚了,但我的答案可能会帮助那些在谷歌搜索时找到这个问题的人,像我这样的人。

您的方法的主要问题是Instagram正在使用OAuth身份验证。我建议你在OAuth上谷歌了解这些原则,但我会尝试在下面解释它的实用要点。

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

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

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

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

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