【问题标题】:Programmatically unsubscribe a YouTube user C#以编程方式取消订阅 YouTube 用户 C#
【发布时间】:2012-07-02 05:58:33
【问题描述】:

这是我正在制作的大规模取消订阅者的代码,目前一切正常 - 除了取消订阅功能..(典型的哈)

   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 个小时,但无论我尝试什么,我仍然遇到这个错误

当我使用 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

但是 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

希望这会引起一些注意:)

【问题讨论】:

  • 感谢 @Alain 将代码编辑到我的帖子中 :) 它似乎对我不起作用..
  • 您是否被认证为对该用户帐户执行删除操作的正确用户?
  • @JamieDixon 我以自己的身份登录来测试它,如果你是这个意思?
  • 我的猜测是您使用的 api url 返回一个订阅集合,而您要做的是对该集合执行删除操作。我怀疑您需要获取订阅集合并循环遍历它,或者选择要删除的单个订阅。 (这纯粹是通过查看您的代码的猜测)。
  • @JamieDixon,正确 - 我正在尝试让集合填充列表框,然后获取上面的代码以从列表框中删除用户名并删除订阅

标签: c# .net api youtube


【解决方案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();
        }

【讨论】:

  • 谢谢你的这个方法,我试过这个和我的新方法,我发现我的方法更有效,不过感谢你的帮助,我无法完成批量退订没有你的帮助! :)
  • @Synthetic 很高兴听到您成功了!需要指出的是,我提供的代码不是我推荐的方法,只是我测试我的理论的方式。最终我要指出的是,您可以将AtomEntryEditUri 设置为与SubscriptionEntryEditUri 相同的值。我认为这比从头开始重新构建EditUri 字符串更有效。您选择哪条路线我很高兴您已经启动并运行它。 :)
【解决方案2】:

在搜索所有变量大约 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)
                    {

                    }
                }
            }

我必须将订阅 ID 添加到我用来删除订阅的 URL,这是我将订阅 ID 添加到我最初用于存储用户名的列表框的代码,结果你不能将用户名传递给Delete 方法,但这同样有效,因为我添加了第二个列表框来查找订阅 ID 的用户名

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

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

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

我的大规模取消订阅现已完成!

非常感谢@JamieDixon 提供的所有出色帮助!

【讨论】:

    猜你喜欢
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    相关资源
    最近更新 更多