Skip to content

Instantly share code, notes, and snippets.

@ziru
Created September 9, 2009 08:18
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save ziru/183573 to your computer and use it in GitHub Desktop.
Save ziru/183573 to your computer and use it in GitHub Desktop.
同时更新多个微博状态服务(Twitter/新浪微博/网易微博)
const TWEET_MAXLEN = 140;
const TWEET_SHORT_URL_MAX_LENGTH = 17;
const URL_SHORTENER_API = 'http://api.bit.ly/shorten?version=2.0.1&format=text&login=bitlyapidemo&apiKey=R_0da49e0a9118ff35f52f629d2d71bf07&longUrl=';
var MultiStatusServicesUpdater = {
registeredServices: [
{ selector: '#TWITTER', method: 'updateTwitter' },
// { selector: '#KAIXIN', method: 'updateKaixin' },
{ selector: '#SINA', method: 'updateSina' },
// { selector: '#QQ', method: 'updateQQ' },
{ selector: '#163', method: 'update163' },
{ selector: '#TEST', method: 'updateTest' },
],
getAllServices: function() {
var actions = [];
for (var i = 0; i < this.registeredServices.length; i++)
if (this.registeredServices[i].selector != '#TEST')
actions.push(this.registeredServices[i].selector);
return actions;
},
parseActions: function(finalStatusText) {
var actions = [];
for (var i = 0; i < this.registeredServices.length; i++) {
var service = this.registeredServices[i];
if (finalStatusText.indexOf(' ' + service.selector) != -1) {
finalStatusText = finalStatusText.replace(new RegExp(' ' + service.selector), '');
actions.push(service.selector);
}
}
if (actions.length == 0) actions = this.getAllServices();
return { 'status': finalStatusText, 'actions': actions };
},
updateStatus: function(finalStatusText) {
var result = this.parseActions(finalStatusText);
this.processUpdate(result.status, result.actions, '', '');
},
processUpdate: function(finalStatusText, actions, successServices, failServices) {
if (actions.length <= 0) {
var msg = '';
if (failServices != '') msg = msg + ' [FAIL]' + failServices;
if (successServices != '') msg = msg + ' [Success]' + successServices;
msg = msg + ', [Status]: ' + finalStatusText;
displayMessage(msg);
return; // no action to be processed
}
var action = actions.shift();
var thisObj = this;
var cb = function(serviceName, status) { // process the next action
if (status == 'SUCCESS')
thisObj.processUpdate(finalStatusText, actions, successServices + ' ' + serviceName, failServices);
else
thisObj.processUpdate(finalStatusText, actions, successServices, failServices + ' ' + serviceName);
};
for (var i = 0; i < this.registeredServices.length; i++) {
var service = this.registeredServices[i];
if (action == service.selector) {
this[service.method](finalStatusText, cb, service.selector);
return;
}
}
displayMessage('Unknown action: ' + action);
if (cb) cb(action, 'FAIL');
},
updateTest: function(finalStatusText, cb, serviceSelector) {
if (cb) cb(serviceSelector, 'SUCCESS');
},
updateTwitter: function(finalStatusText, cb, serviceSelector) {
var updateUrl = "https://twitter.com/statuses/update.json";
var updateParams = { source: 'Ubiquity', status: finalStatusText };
jQuery.post(updateUrl, updateParams, function() { if (cb) cb(serviceSelector, 'SUCCESS'); }, 'json');
},
update163: function(finalStatusText, cb, serviceSelector) {
var updateUrl = "http://t.163.com/statuses/update.json";
var updateParams = { source: "Ubiquity", status: finalStatusText };
jQuery.post(updateUrl, updateParams, function() { if (cb) cb(serviceSelector, 'SUCCESS'); }, 'json');
},
genericUpdate: function(serviceSelector, homeUrl, homeTitle, updateUrl, updateParams, updateDataType, callback, refererUrl) {
if (refererUrl == null) refererUrl = homeUrl;
jQuery.get(homeUrl, function(data, textStatus) {
if (data.indexOf(homeTitle) >= 0) { // home title found => already logged in
jQuery.ajax({
type: "POST",
url: updateUrl,
data: updateParams,
dataType: updateDataType,
error: function() { if (callback) callback(serviceSelector, 'FAIL'); },
success: function(data, textStatus) { if (callback) callback(serviceSelector, 'SUCCESS'); },
beforeSend: function(req) {
req.withCredentials = true;
req.setRequestHeader('Referer', refererUrl);
},
});
} else { // not yet logged in
displayMessage(serviceSelector + ': not yet logged in!');
if (callback) callback(serviceSelector, 'FAIL');
}
});
},
updateKaixin: function(finalStatusText, cb, serviceSelector) {
var homeUrl = 'http://www.kaixin001.com/home/';
var homeTitle = '<title>我的首页';
var updateUrl = 'http://www.kaixin001.com/friend/status_submit.php?rnd=' + Math.random();
var updateParams = { state: finalStatusText, };
var updateDataType = 'html';
this.genericUpdate(serviceSelector, homeUrl, homeTitle, updateUrl, updateParams, updateDataType, cb);
},
updateSina: function(finalStatusText, cb, serviceSelector) {
var homeUrl = 'http://login.sina.com.cn/cgi/login/home.php';
var homeTitle = '<div class="center_main">';
var updateUrl = "http://t.sina.com.cn/mblog/publish.php?rnd=" + Math.random();
var updateParams = { content: finalStatusText, from: 'myprofile' };
var updateDataType = 'json';
var refererUrl = 'http://t.sina.com.cn/mblog/';
this.genericUpdate(serviceSelector, homeUrl, homeTitle, updateUrl, updateParams, updateDataType, cb, refererUrl);
},
update163_deprecated: function(finalStatusText, cb, serviceSelector) {
var homeUrl = 'http://t.163.com/home';
var homeTitle = '<title>我的首页';
var updateUrl = "http://t.163.com/statuses/update.do";
var updateParams = { status: finalStatusText, in_reply_to_status_id: '' };
var updateDataType = 'json';
this.genericUpdate(serviceSelector, homeUrl, homeTitle, updateUrl, updateParams, updateDataType, cb);
},
updateQQ: function(finalStatusText, cb, serviceSelector) {
var homeUrl = 'http://www.taotao.com/v1/mydaoke';
var homeTitle = '<title>滔滔-我的叨客';
var updateUrl = "http://www.taotao.com/v1/mydaoke/post?rnd=" + Math.random() + "&synqqsign=1&content=" + encodeURIComponent(finalStatusText);
var updateParams = null;
var updateDataType = 'html';
this.genericUpdate(serviceSelector, homeUrl, homeTitle, updateUrl, updateParams, updateDataType, cb);
},
};
CmdUtils.CreateCommand({
name: ['t', 'twitter', 'tweet'],
icon: "http://assets3.twitter.com/images/favicon.ico",
arguments: [ {role: 'status', nountype: noun_arb_text, label: 'query'} ],
homepage: "http://twitter.com/ziru",
description: "发布更新至Twitter/Meme/开心网/新浪微博/腾讯滔滔.",
help: "使用此命令更新状态之前请先登录相应微博服务",
preview: function(pblock, args) {
var statusText = args.status.text;
var result = MultiStatusServicesUpdater.parseActions(statusText);
var statusLength = result.status.length;
var usesUrlShortener = statusText.indexOf('#URL') != -1;
if (usesUrlShortener) statusLength += TWEET_SHORT_URL_MAX_LENGTH - 4;
var previewData = {
status: result.status,
chars: TWEET_MAXLEN - statusLength
};
var previewTemplate = "更新微博状态为: <br /><br /><b>${status}</b><br /><br />剩余字符数: <b>${chars}</b>";
var truncateTemplate = "<br />最后<b>${truncate}</b>个字符将被移除!";
var shortenInstructionText = "<br />如需添加当前页面链接, 请在状态中加入<b>#URL</b>.";
var selectorInstructionText = "<br />如仅需更新部分微博服务, 请在状态中加入相应选择符:<b>" + MultiStatusServicesUpdater.getAllServices().join(', ') + "</b>.";
var urlWillBeShortenedText = "<br /><b>#URL</b>部分将会替换为当前页面链接(使用bit.ly服务压缩).";
var actionsTemplate = "<br /><br />状态信息将被更新到以下微博服务: <b>${services}</b>.";
var previewHTML = CmdUtils.renderTemplate(previewTemplate, previewData);
if (usesUrlShortener) previewHTML += urlWillBeShortenedText;
else previewHTML += shortenInstructionText;
previewHTML += selectorInstructionText;
if (previewData.chars < 0)
previewHTML += CmdUtils.renderTemplate(truncateTemplate, { truncate: 0 - previewData.chars });
previewHTML += CmdUtils.renderTemplate(actionsTemplate, {services: result.actions.join(', ').replace(/#/g, '')});
pblock.innerHTML = previewHTML;
},
execute: function(args) {
jQuery.ajaxSetup({
error: function(req, textStatus) {
if (req.status == 0) {
displayMessage('No network error');
} else if (req.status == 404) {
displayMessage('Requested URL not found');
} else if (req.status == 500) {
displayMessage('Internel server error');
} else if (textStatus == 'parsererror') {
displayMessage('Failed parsing JSON response');
} else if (textStatus == 'timeout') {
displayMessage('Request time out');
} else {
displayMessage('Unknow error: ' + req.responseText);
}
},
});
var statusText = args.status.text;
if(statusText.length < 1) return;
var usesUrlShortener = statusText.indexOf(' #URL') != -1;
var thisObj = this;
var postUpdate = function( shortURL ) {
var finalStatusText = statusText.replace('#URL', shortURL);
MultiStatusServicesUpdater.updateStatus(finalStatusText);
}
if (usesUrlShortener) {
var urlToShorten = Application.activeWindow.activeTab.document.location.href;
jQuery.get( URL_SHORTENER_API + encodeURIComponent(urlToShorten), null, postUpdate);
} else {
postUpdate('');
}
},
});
@heytxz
Copy link

heytxz commented Aug 26, 2017

不懂编程真是寂寞如雪

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment