Получите все подписки с помощью LINQ to Twitter

Я только что запустил приложение для Windows Phone, и мне нужно получить все подписки пользователя. Я попробовал это :

SharedState.Authorizer = pinAuth;
ITwitterAuthorizer auth = SharedState.Authorizer;
TwitterContext twitterCtx = new TwitterContext(auth);

var friendList =
    (from friend in twitterCtx.SocialGraph
        where friend.Type == SocialGraphType.Friends && friend.ScreenName == "_TDK"
        select friend)
    .SingleOrDefault();

List<String> Followings;
foreach (var id in friendList.ScreenName)
{
    Followings.Add(id.ToString());
}

Но список друзей всегда пустой, и, очевидно, foreach это не нравится, и он выдает exception.

Может ли кто-нибудь помочь мне?

Спасибо.


person TDK    schedule 05.02.2013    source источник


Ответы (2)


Я думаю, вам нужно перебрать коллекцию идентификаторов, например:

foreach (var id in friendList.IDs)
{
    Followings.Add(id.ToString());
}

Вам необходимо совершать асинхронные вызовы с приложениями на основе Silverlight, включая Windows Phone. Вот пример того, как вы можете реорганизовать запрос:

var twitterCtx = new TwitterContext(auth);

(from social in twitterCtx.SocialGraph
 where social.Type == SocialGraphType.Followers &&
       social.ScreenName == "JoeMayo"
 select social)
.MaterializedAsyncCallback(asyncResponse =>
     Dispatcher.BeginInvoke(() =>
     {
         if (asyncResponse.Status != TwitterErrorStatus.Success)
         {
              MessageBox.Show(
                  "Error during query: " + 
                  asyncResponse.Exception.Message);
              return;
         }

         SocialGraph social = asyncResponse.State.SingleOrDefault();

         SocialListBox.ItemsSource = social.IDs;
     }));

MaterializedAsyncCallback управляет обратным вызовом из Twitter. Обратите внимание, как я использую Dispatcher.BeginInvoke для маршалинга обратного вызова в поток пользовательского интерфейса, поскольку обратный вызов находится в рабочем потоке. В параметре обратного вызова asyncResponse используйте Status, чтобы увидеть, есть ли ошибка, и используйте State, чтобы получить данные, если запрос выполнен успешно.

person Joe Mayo    schedule 06.02.2013
comment
FriendList нулевой, это ничего не меняет, проблема здесь, я думаю, но я не могу найти, в чем дело... Может быть, twittercontext ? (from friend in twitterCtx.SocialGraph where friend.Type == SocialGraphType.Friends && friend.ScreenName == "_TDK" select friend) .SingleOrDefault(); - person TDK; 07.02.2013
comment
@user2877820 user2877820 Если вы хотите добавить дополнительную информацию, сделайте это в комментарии, чтобы автор сообщения мог решить, включать ее или нет. Исключением являются сообщения сообщества Wiki, которые представляют собой «анонимные» ответы/вопросы, управляемые сообществом. - person TylerH; 14.03.2018

У меня была такая же проблема, я решил так (знаю, что это не лучший способ)

public void getProfile(MyProgressBar myprogressbar)
{
    var auth = new SingleUserAuthorizer
    {
        Credentials = new InMemoryCredentials
        {
            ConsumerKey = GlobalVariables.ConsumerKey,
            ConsumerSecret = GlobalVariables.ConsumerSecret,
            AccessToken = GlobalVariables.AccessToken,
            OAuthToken = GlobalVariables.AccessTokenSecret
        }
    };

    using (var twitterCtx = new TwitterContext(auth, "https://api.twitter.com/1/", "https://search.twitter.com/"))
    {
        //Log
        twitterCtx.Log = Console.Out;

        var queryResponse = (from tweet in twitterCtx.Status
                             where tweet.Type == StatusType.User && tweet.ScreenName == GlobalVariables.ScreenName
                             select tweet);

        queryResponse.AsyncCallback(tweets =>
            Deployment.Current.Dispatcher.BeginInvoke(() =>
            {
                var publicTweets = (from tweet in tweets
                                    select tweet).FirstOrDefault();
                s.TwitterName = publicTweets.User.Name.ToString();
                s.TwitterScreenName = "@" + GlobalVariables.ScreenName;
                s.TwitterDescription = publicTweets.User.Description.ToString();
                s.TwitterStatus = publicTweets.User.StatusesCount.ToString() + " Tweets / " + publicTweets.User.FriendsCount.ToString() + " Following / " + publicTweets.User.FollowersCount.ToString() + " Followers";
                s.TwitterImage = publicTweets.User.ProfileImageUrl.ToString();

                myprogressbar.ShowProgressBar = false;

            })).SingleOrDefault();
    }
}
person PandaSharp    schedule 06.02.2013
comment
Он работает без ошибок, но publicTweets имеет значение null, и я не могу получить имя экрана и т. д. - person TDK; 08.02.2013
comment
@TDK да, экранное имя null, это своего рода ошибка твиттера linq 2, но остальные данные для меня работают ... вы определенно решили решение joe mayo? - person PandaSharp; 11.02.2013
comment
Да ! :) Спасибо за помощь! - person TDK; 18.02.2013