2012-07-01 2 views
2

Вот мой код для массы unsubscriber я делаю, в настоящее время все работает - кроме отписки особенности .. (типовая да)Программной отмена подписки пользователя C YouTube #

public void UnSubUsers() 
    { 
     string feedUrl = "http://gdata.youtube.com/feeds/api/users/" + username.Text + "/subscriptions"; 
     YouTubeQuery query = new YouTubeQuery(feedUrl); 
     subFeed = service.GetSubscriptions(query); 
     YouTubeRequestSettings yts = new YouTubeRequestSettings("Unsubscriber", DEVKEY, username.Text, password.Text); 
     YouTubeRequest request = new YouTubeRequest(yts); 
     int i = 0; 
     int x = 0; 
     x = (listBox1.Items.Count); 
     for (i=0;i<x ;i++) 
     { 
      string uname = listBox1.Items[i].ToString(); 
      uname=uname.Substring(42); 
      uname = uname.Remove(uname.LastIndexOf("/")); 
      Subscription s = new Subscription(); 
      s.Type = SubscriptionEntry.SubscriptionType.channel; 
      s.UserName = uname; 
      //MessageBox.Show(uname); //Displays the username so that we know if it is correct 
      try 
      { 
       s.AtomEntry.EditUri = "http://gdata.youtube.com/feeds/api/users/" + username.Text + "/subscriptions"; 
       s.SubscriptionEntry.EditUri = "http://gdata.youtube.com/feeds/api/users/" + username.Text + "/subscriptions"; 
       request.Delete(s); 
      } 
      catch (ArgumentNullException e) 
      { 
       MessageBox.Show(e.ToString(), "Error"); 
      } 
      catch (GDataRequestException e) 
      { 
       MessageBox.Show(e.ToString(), "Error"); 
      } 
     } 
    } 

(Также доступен на http://pastebin.com/LnKMYCJp)

Когда код «достигает» request.Delete (s) он дает мне эту ошибку:

Google.GData.Client.GDataRequestException: Execution of request failed: http://gdata.youtube.com/feeds/api/users/iWinterHD/subscriptions --->System.Net.WebException: The remote server returned an error: (400) Bad Request. 
    at System.Net.HttpWebRequest.GetResponse() 
    at Google.GData.Client.GDataRequest.Execute() 
    --- End of inner exception stack trace --- 
    at Google.GData.Client.GDataRequest.Execute() 
    at Google.GData.Client.GDataGAuthRequest.Execute(Int32 retryCounter) 
    at Google.GData.Client.GDataGAuthRequest.Execute() 
    at Google.GData.Client.Service.Delete(Uri uriTarget, String eTag) 
    at Google.GData.Client.FeedRequest1.Delete[Y](Y entry) 
    at Unsubscriber.SubForm.UnSubUsers() in C:\Users\iWinterHD\documents\visual studio 2010\Projects\Unsubscriber\Unsubscriber\SubForm.cs:line 112 

кто-нибудь знает, как это исправить, я пытался получить это горе очий около 2 часов, и я все еще получаю эту ошибку, независимо от того, что я пытаюсь

Когда я не использовал скрипач, чтобы узнать информацию о соединении это заголовок:

DELETE /feeds/api/users/iWinterHD/subscriptions HTTP/1.1 
Content-Type: application/atom+xml; charset=UTF-8 
User-Agent: G-Unsubscriber/GDataGAuthRequestFactory-CS-Version=2.1.0.0--IEnumerable 
X-GData-Key: key=DEVELOPER_KEY 
Authorization: GoogleLogin auth=DQAAAMgAAAAfAWmos6z7rpaY8JrK2RNK4Urf7Riu_putKeGgV1KFH5OEmAYA2t5w0DWXbVQJnizQiPmLSl-4D0eCozYn5jVp4DWs4Rpao3udc3eTIC9wibBGRe640m7zZjl96UnFMyf-fJDk0VrTIcAw74S7_WhwBaRDjLS77EOWfERw066NmcYO-2QB_6WZ4Y0o3Y4haVn_pRokm8ckyuTRWJf6cES1yVlZ4fP5diUySVsH7EaHLiUcAquUl7GWCMdF_JbjRVVxvgeMW1zV757JW8l841uk 
GData-Version: 2.0 
Host: gdata.youtube.com 
Connection: Keep-Alive 

Однако пример Google Developers это:

DELETE /feeds/api/users/default/subscriptions/SUBSCRIPTION_ID HTTP/1.1 
Host: gdata.youtube.com 
Content-Type: application/atom+xml 
Authorization: Bearer ACCESS_TOKEN 
GData-Version: 2 
X-GData-Key: key=DEVELOPER_KEY 

Надеется, что дает немного голов вверх :)

+0

Thankyou @Alain для редактирования кода в моем сообщении :) Он просто не работает для меня .. –

+0

Вы аутентифицированы как правильный пользователь для выполнения действий удаления в этой учетной записи? –

+0

@JamieDixon Я был зарегистрирован как сам, чтобы проверить его, если это то, что вы имеете в виду? –

ответ

1

После поиска по всем переменным около 4 часов я в конечном итоге камнем после переменной ID, которую я позже обнаружил, нужно было передать окончательному URL-адресу, чтобы удалить подписку с этим идентификатором, я протестировал ее, и она отлично работала!

 public void ListSubs() 
      { 
       string feedUrl = "http://gdata.youtube.com/feeds/api/users/" + username.Text + "/subscriptions"; 
       YouTubeQuery query = new YouTubeQuery(feedUrl); 
       try 
       { 

        subFeed = service.GetSubscriptions(query); 

        foreach (SubscriptionEntry entry in subFeed.Entries) 
        { 
         string id = entry.Id.AbsoluteUri; 
         id = id.Substring(id.LastIndexOf(":")+1); 
         listBox1.Items.Add(id); 
         string usrname = entry.Content.Src.Content; 
         usrname = usrname.Substring(42); 
         usrname = usrname.Remove(usrname.LastIndexOf("/")); 
         listBox2.Items.Add(usrname); 
        } 
       } 
       catch(GDataRequestException e) 
       { 
        MessageBox.Show(e.ToString(), "Error:"); 
       } 

      } 

    public void UnSubUsers() 
      { 
       YouTubeRequestSettings yts = new YouTubeRequestSettings("Unsubscriber", DEVELOPER_KEY, username.Text, password.Text); 
       YouTubeRequest request = new YouTubeRequest(yts); 
       int i = 0; 
       int x = 0; 
       x = (listBox1.Items.Count); 
       for (i=0;i<x ;i++) 
       { 
        string uname = listBox1.Items[i].ToString(); 
        yts = new YouTubeRequestSettings("Unsubscriber", DEVELOPER_KEY, username.Text, password.Text); 
        request = new YouTubeRequest(yts); 
        Subscription s = new Subscription(); 
        s.Type = SubscriptionEntry.SubscriptionType.channel; 
        s.UserName = uname; 
        s.Id = listBox1.Items[i].ToString() 
        try 
        { 
         s.AtomEntry.EditUri = "http://gdata.youtube.com/feeds/api/users/" + username.Text + "/subscriptions" + "/" + listBox1.Items[i].ToString(); 
         request.Delete(s); 
        } 
        catch (ArgumentNullException e) 
        { 

        } 
        catch (GDataRequestException e) 
        { 

        } 
       } 
      } 

мне пришлось добавить идентификатор подписки на URL я использовал, чтобы удалить подписку, вот мой код, чтобы добавить идентификатор подписки на ListBox я первоначально использовался для хранения имен пользователей, оказывается, вы можете» т передать имена пользователей в метод удаления, но это работает так же хорошо, потому что я добавил второй ListBox, чтобы найти имена пользователей подписных идентификаторов

string id = entry.Id.AbsoluteUri; 
    id = id.Substring(id.LastIndexOf(":")+1); 
    listBox1.Items.Add(id); 

Этот код получает идентификатор подписки из переменной ввода, вы затем добавить идентификатор подписки на переменную EditUri:

s.AtomEntry.EditUri = "http://gdata.youtube.com/feeds/api/users/" + username.Text + "/subscriptions" + "/" + listBox1.Items[i].ToString(); 
    request.Delete(s); 

Моя массовая отмена подписчика завершена!

Огромное спасибо @JamieDixon за всю его замечательную помощь!

1

После немного поэкспериментировать с API, я думаю, я нашел решение.

AtomEntry.EditUri должен быть таким же, как URI, к отдельной подписке. Как это происходит, это уже сохраняется в объекте SubscriptionEntry (который вы переписываете).

Ваш код должен выглядеть примерно так:

itemToRemove.AtomEntry.EditUri = itemToRemove.SubscriptionEntry.EditUri;

Вот код, который я использовал, чтобы проверить это:

  var subscriptionsUrl = 
      "http://gdata.youtube.com/feeds/api/users/warmthonthesoul/subscriptions"; 
      var settings = new YouTubeRequestSettings([...]); 
      var request = new YouTubeRequest(settings); 

      var query = new YouTubeQuery(subscriptionsUrl); 
      var feed = request.GetSubscriptionsFeed("warmthonthesoul").Entries; 

      var itemToRemove = feed.SingleOrDefault(x => 
             x 
             .SubscriptionEntry 
             .Title.Text.Contains("Triforcefilms")); 

      if(itemToRemove != null) 
      { 
       itemToRemove.AtomEntry.EditUri = itemToRemove 
                .SubscriptionEntry 
                .EditUri; 
       request.Delete(itemToRemove); 
       Console.WriteLine("Item removed"); 
      } 

      Console.ReadLine(); 
     } 
+0

Спасибо за этот метод, я пробовал это и свой новый метод, и я нахожу свой метод более эффективным, тем не менее, благодарю вас за всю вашу помощь, я бы не смог закончить массовый отказ от подписки без вашей помощи! :) –

+0

@ Синтетический Рад слышать, что у вас это работает! Просто, чтобы указать, код, который я предоставил, не является методом, который я рекомендую, так же, как я протестировал свою теорию. В конечном счете, все, на что я указываю, это то, что вы можете установить 'EditUri' вашего' AtomEntry' на то же значение, что и 'EditUri'' SubscriptionEntry'. Я думаю, что это более эффективно, чем повторное создание строки EditUri с нуля. Какой бы маршрут вы ни выбрали, я рад, что вы его запустили. :) –

Смежные вопросы