以编程方式取消订阅YouTube用户C#
这是我正在制作的一个大规模退订器的代码,目前一切正常-除了退订功能。。(典型的哼) 有人知道如何解决这个问题吗?我已经试着让它工作了大约2个小时,但不管我怎么做,我仍然会遇到这个错误 当我使用fiddler查找有关连接的信息时,这是标题:以编程方式取消订阅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
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);