以编程方式取消订阅YouTube用户C#

以编程方式取消订阅YouTube用户C#,c#,.net,api,youtube,C#,.net,Api,Youtube,这是我正在制作的一个大规模退订器的代码,目前一切正常-除了退订功能。。(典型的哼) 有人知道如何解决这个问题吗?我已经试着让它工作了大约2个小时,但不管我怎么做,我仍然会遇到这个错误 当我使用fiddler查找有关连接的信息时,这是标题: DELETE /feeds/api/users/iWinterHD/subscriptions HTTP/1.1 Content-Type: application/atom+xml; charset=UTF-8 User-Agent: G-Unsubscri

这是我正在制作的一个大规模退订器的代码,目前一切正常-除了退订功能。。(典型的哼)

有人知道如何解决这个问题吗?我已经试着让它工作了大约2个小时,但不管我怎么做,我仍然会遇到这个错误

当我使用fiddler查找有关连接的信息时,这是标题:

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
然而,谷歌开发者的例子是:

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

希望这能给我们一点启发:)

在使用了一点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();
        }

在搜索了大约4个小时的所有变量后,我最终偶然发现了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)
                    {

                    }
                }
            }
此代码从entry变量获取订阅ID,然后将订阅ID添加到EditUri变量:

    s.AtomEntry.EditUri = "http://gdata.youtube.com/feeds/api/users/" + username.Text + "/subscriptions" + "/" + listBox1.Items[i].ToString();
    request.Delete(s);
我的大规模退订现已完成


非常感谢@JamieDixon对我们的帮助

感谢@Alain将代码编辑到我的帖子中:)这似乎对我不起作用..你是否被认证为对该用户帐户执行删除操作的正确用户?@JamieDixon我以自己的身份登录进行测试,如果这是你的意思?我猜你正在使用的api url会返回一个订阅的集合,你要做的是对该集合执行删除。我怀疑您需要获取订阅集合并在其中循环,或者选择要删除的单个订阅。(这纯粹是从你的代码中猜出来的)。@JamieDixon,正确-我正试图让集合填充一个列表框,然后获取上面的代码,从列表框中删除用户名并删除订阅。谢谢这个方法,我已经尝试了这个方法和我的新方法,我发现我的方法更有效,尽管如此,还是要感谢您的帮助,没有您的帮助,我不可能完成大规模退订@很高兴听到你的工作顺利!我要指出的是,我提供的代码不是我推荐的方法,而是我测试理论的方法。最后,我要指出的是,您可以将
AtomEntry
EditUri
设置为与
SubscriptionEntry
EditUri
相同的值。我认为这比从头开始重新构建
EditUri
字符串更有效。无论您选择哪条路线,我很高兴您已经启动并运行了它。:)
     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)
                    {

                    }
                }
            }
    string id = entry.Id.AbsoluteUri;
    id = id.Substring(id.LastIndexOf(":")+1);
    listBox1.Items.Add(id);
    s.AtomEntry.EditUri = "http://gdata.youtube.com/feeds/api/users/" + username.Text + "/subscriptions" + "/" + listBox1.Items[i].ToString();
    request.Delete(s);