我有一个.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");
}
答案 0 :(得分:0)
我在演出时有点晚了,但我的答案可能会帮助那些在谷歌搜索时找到这个问题的人,像我这样的人。
您的方法的主要问题是Instagram正在使用OAuth身份验证。我建议你在OAuth上谷歌了解这些原则,但我会尝试在下面解释它的实用要点。
OAuth方法意味着上面代码段中的InstagramLogin
方法的结果不是代码。它是链接,您需要向您发送用户(是的,使用浏览器或网络视图),以便他们可以登录自己的Instagram帐户,然后授权您的应用访问他们的数据(所谓的用户同意屏幕)。
最后,在用户同意后,Instagram会将浏览器重定向到您选择的网址(它应该先前添加到Instagram API中允许的重定向网址列表中 - &gt;管理客户端(右上角) - &gt ;创建/选择要管理的客户端 - &gt;安全选项卡)
您可以尝试设置断点并将instagramLoginLink
的值复制到浏览器的地址栏中。您将能够看到整个身份验证和同意 - 最后是重定向网址,最有可能在您的浏览器中生成404.
此最终链接将包含get参数中的代码。它是所谓的授权代码,可让您获得访问令牌。此代码将从网址中提取,然后用于您对OAuth.RequestToken
)的调用。
PS:是的,我上面说的一切意味着您需要运行的网络应用程序将用户重定向到Instagram或客户端应用程序,它将向用户显示Web视图并以某种方式处理Instagram将用户发送回您的重定向网址的时刻 - 抓取代码并继续。