Blogging: Automatizando notificação ao Ping-O-Matic com o Blackmoon
- Leitores de blogs para desktop, Palm Tops e celulares;
- Distribuição de arquivos de Feed e seus formatos: Atom, RSS;
- Conversores de arquivos de Feed;
- Sites e tecnologias notificadoras de atualização de blogs;
- Autodiscovery e feeds alternativos.
Acabei por ter algumas idéias de produtos e soluções para os bloggers. Conforme for desenvolvendo essas idéais e descobrindo novas soluções, deverei escrevê-las aqui. Agora, estarei discutindo uma delas.
Hoje, vi a necessidade de criar um mecanismo que permitisse tomar uma ou mais ações todas as vezes que o Blogger realizasse a publicação de meu blog. Eu estou hospedando meu próprio website juntamente com meu blog. Neste caso, o Blogger faz a publicação via ftp. Eu estou usando uma versão freeware do excelente Blackmoon FTP Server. Caso você não o tenha, baixe-o em www.blackmoonftpserver.com.
O Blackmoon permite que se execute scripts de modo a extender a funcionalidade do servidor e realizar tarefas customizadas. Esses scripts podem ser externos ou internos. Scripts internos são ativados por eventos gerados pelo servidor ftp. Exemplos de eventos são: logon do usuário, início de uma sessão, encerramento de uma sessão, listagem de diretório, execução de um comando etc. Um completo tutorial sobre a programação com scripts pode ser encontrado na própria ajuda do Blackmoon.
Iremos criar um script que será ativado todas as vezes que o Blogger fizer a publicação no servidor ftp. Para facilitar nossa tarefa, será criado um usuário especifico para o Blogger. Esse usuário será utilizado pelo Blogger para acessar o servidor ftp. A esse usuário será atribuído o script que criaremos.
Como disse, o Blackmoon oferece diversos eventos que podem ser interceptados. Nós iremos utilizar o evento OnUploadEnd para monitorar o upload do arquivo atom.xml. Quando esse for atualizado, nós iremos notificar o website Ping-O-Matic da atualização do feed.
Por que o Ping-O-Matic? Este é um serviço útil de notificação. Fazendo um simples "ping" a este site, você notifica dezenas de outros websites que monitoram alterações em arquivos feeds. Esses websites oferecem os mais diversos tipos de serviços. Não irei comentar os diferentes tipos de serviços que são oferecidos por todos esses sites, mas ferei um breve comentário sobre o Feedburner; Este é útil para converter um feed em formato Atom para RSS, dentre outras coisas. No momento eu o estou utilizando para esse propósito, pois o Blogger cria o feed no formato Atom e infelizmente nem todos os serviços suportam esse formato, sendo o formato RSS mais comum. Quando o Blogger faz a publicação do meu blog, ele atualiza o arquivo atom.xml. Para que esse arquivo seja convertido para RSS, eu devo notificar o Feedburner para realizar a conversão. O modo como faço isso, é simplesmente pingando o Ping-O-Matic, que se encarregará de pingar uma dezena de websites, inclusive o Feedburner. Ao receber o ping do Ping-O-Matic, o Feedburner fará a conversão.
Optei por escrever o script em VBScript, mas o Blackmoon suporta várias outras linguagens de script. O script ficou bem simples. Quando um upload é completado o evento OnUploadEnd é gerado. Neste evento verificamos se o arquivo em questão é o atom.xml, se for, acionamos uma sub-rotina que se encarrega de enviar um post ao Ping-O-Matic usando o mecanismo XMLRPC descrito em http://www.xmlrpc.com/weblogsCom.
sub Client_OnUploadEnd( filePath, bytesTransferred, transferRate, _
startTime, endTime, errorCode, crc32 )
dim fso, f
set fso = CreateObject("Scripting.FileSystemObject")
set f = fso.GetFile(filePath)
if ( f.Name = "atom.xml" ) then
RunNotifier
end if
set f = nothing
set fso = nothing
end sub
A sub-rotina de notificação pode ser implementada de diferentes formas eu optei por fazer uma implementação usando o objeto Socket do Blackmoon, mas não pude testá-la pois parece que a versão freeware não disponibiliza esse objeto. Então fiz outra implementação usando o componente MSXML2.XMLHTTP. Essa última funcionou perfeitamente. É exibida uma mensagem de sucesso ou erro no console do cliente de administração do BlackMoon de acordo com a resposta à requisição que enviamos ao Ping-O-Matic.
'*********************************************************
'Rotina: Notify_PingOMatic_Using_RPC2
'
'Função: Pinga o website Ping-O-Matic usando o componente
' XMLHTTP da Microsoft.
'
sub Notify_PingOMatic_Using_RPC2(title, url)
const METHOD = "POST"
const WEBSERVER_URL = _
"http://rpc.pingomatic.com"
const FAILMSG = _
"A notificação ao Ping-O-Matic não foi possível!"
dim SUCCMSG
SUCCMSG = _
"Ping-O-Matic foi notificado da atualização do " & _
"arquivo feed."
dim ERROR_PATERN
ERROR_PATERN = _
"<member><name>flerror</name><value><boolean>(\d)" & _
"</boolean></value></member>"
dim MSG_PATERN
MSG_PATERN = _
"<member><name>message</name><value><string>(.*)" & _
"</string></value></member>"
'A notificação é feita por XMLRPC.
'Veja detalhes da especificação em:
'http://www.xmlrpc.com/weblogsCom
dim CONTENT
CONTENT = _
"<?xml version=""1.0""?>" + vbCrLf + _
"<methodCall>" + vbCrLf + _
"<methodName>weblogUpdates.ping</methodName>" + _
"<params>" + vbCrLf + _
"<param>" + vbCrLf + _
"<value>" & title & "</value>" + vbCrLf + _
"</param>" + vbCrLf + _
"<param>" + vbCrLf + _
"<value>" & url & "</value>" + vbCrLf + _
"</param>" + vbCrLf + _
"</params>" + vbCrLf + _
"</methodCall>" + vbCrLf
dim http, ok, msg
'Envia a requisição de atualização por http
set http = CreateObject("Msxml2.ServerXMLHTTP")
http.open METHOD, WEBSERVER_URL
http.setRequestHeader "Content-Type", "text/xml"
http.send CONTENT
s = http.ResponseText
'O apropriado seria usar XMLDOM para obter a resposta,
'mas usamos expressões regulares.
'Pois, eu achei que facilitaria o entendimento assim.
set rx = new RegExp
'Verifica se houve erros
rx.pattern = ERROR_PATERN
rx.IgnoreCase = true
set m = rx.Execute(s)
Ok = m(0).SubMatches(0) = 0
'Obtém a mensagem de retorno.
rx.pattern = MSG_PATERN
rx.IgnoreCase = true
set m = rx.Execute(s)
msg = m(0).SubMatches(0)
'Finaliza as variáveis de objetos
set rx = nothing
set m = nothing
set http = nothing
if ok then
msg = msg & vbCrLf & SUCCMSG
else
msg = msg & vbCrLf & FAILMSG
end if
Server.PrintStatusMessage msg
end sub
Notify_PingOMatic_Using_RPC2 "marciowb @ blog", _
"http://www.marciowb.net/blog/"
Server.PrintStatusMessage msg
Comente esta linha caso deseje rodar a função fora do Blackmoon, como no caso de você não usar o Blackmoon. Após termos criado o script, é necessário instalá-lo no Blackmoon. Para isso, siga essas etapas:- Baixe o arquivo ping-o-matic_notifier.zip que contém o script completo e em seguida descompacte-o;
- Copie o arquivo ping-o-matic_notifier.vbs que foi descompactado para o diretório Scripts. Este diretório está dentro do diretório no qual o Blackmoon foi instalado. No caso do meu computador, é: C:\Program Files\Selom Ofori\BlackMoon FTP Server\scripts;
- Agora execute o arquivo PackEditor.exe que se encontra no diretório onde o Blackmoon foi instalado. PackEditor é o utilitário que é usado para criar um arquivo XML com todas as informações que o Blackmoon necessita saber sobre o nosso script. Se você não configurar um arquivo XML, você não poderá usar seu script no Blackmoon. Portanto esta etapa é necessária. Tome como base os dados que utilizei na figura abaixo. Após preencher os dados, salve e feche o utilitário. O utilitário irá criar um arquivo de mesmo nome do arquivo de script, exceto que terá a extensão .xml ao invés de .vbs no diretório infopacks. Agora você já pode utilizar seu script no Blackmoon.
(clique na imagem para vê-la maior) - Abra o software de administração do Blackmoon, vá no menu
- Clique na tab ;
- Marque a opção Enable Scripting System.
- Selecione na lista de scripts o nosso script, no caso: Ping-O-Matic notifier;
- Certifique-se que na combo Start Type a opção Automatic está selecionada;
- Clique no botão Add/Save Changes.
Para testar basta fazer um upload de um arquivo qualquer de nome atom.xml. Uma mensagem será exibida no log do servidor indicando o sucesso ou falha da operação de notificação. A mensagem será semelhante a da imagem abaixo.
Caso um erro ocorra revise as etapas que descrevi. Se ainda tiver problemas, tente me chamar no Skype, pode ser ou não que eu ajude :)
Labels: it