与video we made in 2010一样,我们今年再次播放新年快乐视频,其中包含我们所有Facebook和非Facebook朋友的名字。
2010年,我们有一个自定义应用程序,用于在我们每个朋友的墙上张贴一条定制的消息,例如“亲爱的XXX,祝你新年快乐,这个视频在1分24秒内出现。 “
我们今年也希望这样做,即发布自定义消息以向我们的每个朋友显示特定信息,但我们注意到Facebook有限制在墙上和私人消息上发布。
http://www.facebook.com/help/326534794098501/
我们可能会使用GreaseMonkey / Javascript和Dialog API脚本来使用我们的应用程序,但我们仍然担心收到一些安全警告。
这个项目可行吗?我们的朋友喜欢我们每年都在播放的视频。
答案 0 :(得分:1)
一个确认:尝试仅通过直接Send Dialog API潜在客户(发送大约60封邮件后)向Facebook服务器端发送错误(错误500,甚至空白页面)。
实现这一目标的工作方式是
在所有情况下,对话URL都必须有redirect_uri
参数,该参数必须指向应用程序拥有的URL。所以app_id
也是强制性的。
通过这种方式,您不会发送太多“正常”消息,因为没有很多人挡住他们的墙,因此您不会被阻止。
以下是GreaseMonkey / TamperMonkey代码示例:
// ==UserScript==
// @name NameOfYourScript
// @namespace NamespaceOfYourScript
// @version VersionOfYourScript
// @description enter something useful
// @match https://*/*
// @copyright 2012+, You
// @require https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_openInTab
// ==/UserScript==
var baseapppage = "<URL of a page owned by your application>";
var baseapppagehost = "apps.facebook.com"; var baseapppagepath = "<path to your app>";
//Call baseapppage+"?startfbscript=0" to launch the script
//0 is the index at which you want to start
var appid = "<APP ID of the application>";
var titleofvideo ="<title of video>";
var facebook_ids = [
//put the list of the people to contact here
{"id":"<facebook id of one person>","":"<other arguments for the message>"},
//...
];
var video_url = "<URL of the video to share>";
var message = "<Template of the message to share, with <placeholders> for the person objects>"+
"\n\nLink of video:"+
"\n"+video_url+
"";
//"feed" or "send" (note that "send" only will block you...)
var default_mode = "feed";
//if you lower this, it will be quicker, but may lead to an error
var temporisation = 5*1000;
//updating placeholders in message
function updatemessage(o) {
var str = message;
for (var p in o) {
str = str.replace(new RegExp("<"+p+">","ig"),o[p])
}
return str;
}
var automatic = true;
//http://stackoverflow.com/questions/2090551/parse-query-string-in-javascript
function getQueryVariable(variable) {
var query = document.location.search.substring(1);
var vars = query.split('&');
for (var i = 0; i < vars.length; i++) {
var pair = vars[i].split('=');
if (decodeURIComponent(pair[0]) == variable) {
return decodeURIComponent(pair[1]);
}
}
console.log('Query variable %s not found', variable);
}
//creating URLs
function createURL(baseurl,data) {
var datastr = "";
for (var k in data) {
if (datastr.length) datastr += "&";
datastr += encodeURIComponent(k)+"="+ encodeURIComponent(data[k]);
}
var separator = baseurl.lastIndexOf("?") >= 0 ? "&" : "?";
return baseurl + separator + datastr;
}
//arguments for feed page
var feed_arguments = {
"app_id":appid,
"name":titleofvideo,
"link":video_url,
"redirect_uri":createURL(baseapppage,{"currentfbscript":"1"}),
//"":"", //caption, description...
};
//arguments for send page
var send_arguments = {
"app_id":appid,
"name":titleofvideo,
"link":video_url,
"redirect_uri":createURL(baseapppage,{"currentfbscript":"1"}),
//"":"",
};
//function to open direct dialog API, in mode "feed" or "send", directed to some facebook id
function relocateto(mode, to) {
var arguments = mode == "feed" ? feed_arguments : send_arguments;
var baseurl = mode == "feed" ? "https://www.facebook.com/dialog/feed" : "https://www.facebook.com/dialog/send";
arguments['to'] = to;
var new_url = createURL(baseurl,arguments);
if (parseInt(""+GM_getValue("indice",-1)) % 20 == 0) {
//note : fake reload in other tab because of Chrome memory "leak".
//Close finished tags to keep memory low.
console.log("run 'fake reload'...");
function fake_reload() {
console.log("...now");
GM_openInTab(new_url, {active: false, insert: true});
// close the current window some ms later to allow the insert magic to detect this' tab position
//note that it unfortunately doesn't work
window.setTimeout(window.close, 1);
}
window.setTimeout(fake_reload, 3000);
} else {
document.location = new_url;
}
}
//wall post page
if (document.location.host == "www.facebook.com" && document.location.pathname == "/dialog/feed") {
GM_setValue("mode","feed");
var indice = parseInt(""+GM_getValue("indice",-1));
if (indice < 0 || indice >= facebook_ids.length) return;
if (jQuery("input[name=publish]").length) {
var mes = updatemessage(facebook_ids[indice]);
setTimeout(function() {
jQuery("textarea#feedform_user_message").html(mes).val(mes);
if (automatic) jQuery("input[name=publish]").click();
},temporisation);
} else {
//impossible to send wall message -> send dialog
relocateto("send", getQueryVariable("to"));
}
}
//send post page
if (document.location.host == "www.facebook.com" && document.location.pathname == "/dialog/send") {
GM_setValue("mode","send");
var indice = parseInt(""+GM_getValue("indice",-1));
if (indice < 0 || indice >= facebook_ids.length) return;
if (jQuery("input[name=publish]").length) {
var mes = updatemessage(facebook_ids[indice]);
setTimeout(function() {
jQuery("textarea#feedform_user_message").html(mes).val(mes);
if (automatic) jQuery("input[name=publish]").click();
},temporisation);
} else {
//impossible to send normal message -> dialogue
alert("Impossible to send message... index="+indice+" for "+getQueryVariable("to")+"-"+facebook_ids[indice].id);
}
}
//start or end page
if (document.location.host == baseapppagehost && document.location.pathname == baseapppagepath) {
if (getQueryVariable("startfbscript")) {
GM_setValue("mode",default_mode);
var i = getQueryVariable("startfbscript")
GM_setValue("indice",i)
relocateto(default_mode, facebook_ids[i].id);
} else if (getQueryVariable("currentfbscript") && GM_getValue("mode","feed") == "feed" && document.location.search.indexOf("post_id") < 0) {
//it didn't work -> sending normal message
relocateto("send", GM_getValue("lastname",facebook_ids[0].id));
} else if (getQueryVariable("currentfbscript") && (
(GM_getValue("mode","feed") == "feed" && getQueryVariable("post_id"))
|| (GM_getValue("mode","feed") == "send" && getQueryVariable("success")))) {
//it worked -> next name !
var indice = parseInt(""+GM_getValue("indice",0));
indice++;
GM_setValue("indice",indice)
if (indice >= facebook_ids.length) {
jQuery("#pagelet_iframe_canvas_content").html("<br/><br/>Finished!");
return;
} else {
console.log("Next id to send to: "+facebook_ids[indice].id);
jQuery("#pagelet_iframe_canvas_content").html("<br><br/> Running script : "
+ indice +"/"+facebook_ids.length
+"<br> Next : "
+facebook_ids[indice].id);
}
var nextname = facebook_ids[indice].id;
//next post
setTimeout (function (){
relocateto(default_mode, nextname);
}, temporisation);
} else {
//why are we here if the script is running ? Problem with facebook...
if (parseInt(""+GM_getValue("indice",0)) < facebook_ids.length) {
alert("Impossible to post message. Current index = "+GM_getValue("indice",0)+" for "+facebook_ids[parseInt(""+GM_getValue("indice",0))].id);
}
}
}