2012-07-01 2 views
2

여기 내가 만드는 중이 unsubscriber 질량에 대한 내 코드 인 유튜브 사용자의 C#을 취소, 현재 모든 작품 - 수신 거부 기능 이외의 ... (일반 허) (http://pastebin.com/LnKMYCJp에서 또한 가능)프로그래밍 방식

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"); 
      } 
     } 
    } 

코드가 request.Delete (들)은 나에게이 오류 준다 "도달"

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 시간 동안 rking 나는 여전히이 오류를 얻고, 아무리 내가

을하려고 내가이 헤더이었다 연결에 대한 정보를 알아 피들러를 사용하지 않는 경우 :

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 개발자 예를 내가 해결책을 찾았 생각 API와 함께 장난을 조금 후 :

+0

내 게시물에 코드를 편집 해 주셔서 감사합니다 ^^ 그냥 저에게 효과가있는 것 같지 않습니다 .. –

+0

해당 사용자 계정에서 삭제 작업을 수행하기위한 올바른 사용자로 인증 받았습니까? –

+0

@JamieDixon 그게 무슨 뜻인지 알기 위해 테스트에 나 자신으로 로그인했습니다. –

답변

1

:

여기 itemToRemove.AtomEntry.EditUri = itemToRemove.SubscriptionEntry.EditUri;

내가 이것을 테스트하는 데 사용되는 코드입니다 :

코드는 같이 보일 것이다 해당 ID로 구독을 제거하기 위해 최종 URL로 전달해야 할 필요가 있음을 나중에 발견 한 ID 변수에 대해 테스트를 거쳤으며 완벽하게 작동했습니다.

 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에 가입 ID를 추가했다, 여기 내가 원래 사용자 이름을 저장하는 데 사용되는 목록 상자에 가입 ID를 추가하려면 코드, 그것은 '당신이 할 수있는 밝혀 내가이 코드는 입력 변수에서 구독 ID를 가져옵니다

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

가입 ID의 사용자 이름을 찾기 위해 두 번째 목록 상자를 추가하기 때문에 다음 추가, t는 삭제 방법에 사용자 이름을 통과, 그러나 이것은 단지뿐만 아니라 작동 EditUri 변수의 구독 ID :

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

대량 학살 구독자가 이제 완료되었습니다!

많은 도움을 주신 @JamieDixon에게 많은 감사를드립니다!

1

조금 머리를 제공

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 

희망이있다.

AtomEntry.EditUri은 개별 구독의 URI와 같아야합니다. 이런 일이 발생하면 이미 덮어 쓰기중인 SubscriptionEntry 개체에 이미 저장되어 있습니다. 내가 보았 결국 약 4 시간 동안 모든 변수를 검색 한 후

  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

@ 합성 당신이 듣고있어 기쁘다. 단지 제가 지적한 코드는 내가 추천하는 방법이 아니라 내 이론을 테스트 한 방식입니다. 궁극적으로는'AtomEntry'의'EditUri'를'SubscriptionEntry'의'EditUri'와 같은 값으로 설정할 수 있다는 것입니다. 나는 이것이 처음부터'EditUri' 문자열을 다시 만드는 것보다 더 효율적이라고 생각합니다. 어느 길을 선택하든 내가 네가 잘 운영하고있어 기뻐요. :) –