Твитты за сегодня
photo
[info]neptunix

  • 15:22 Сегодня дома будем смотреть каникулы строгого режима! Во второй раз уже) #


Твитты за сегодня
photo
[info]neptunix
  • 08:39 8.38 - Всем доброго утро! Сегодня я веду лабы в институте, ха-ха! #
  • 08:48 RT @_f_wind: У кого утро, а кто уже и пообедал :) #
  • 11:43 Все - отправляюсь вести лабы :) #

Твитты за сегодня
photo
[info]neptunix
  • 09:29 О как, Twitterfon превратился в Echofon. Внешних изменений не замечаю #
  • 09:37 В твиттерфоне, то есть эхофоне, висит реклама на сайт по ремонту айфонов. Только сайт с айфона не открыватся :) #
  • 14:19 Сегодня у меня нет с собой обеда. Пойду развлекаться в Ереван плазу! #ru_obed #
  • 14:50 Все, ушел обедать! #ru_obed #
  • 15:06 Сегодня мой выбор пал на крошку картошку. Жду свою очередь... #ru_obed #
  • 15:11 Откровение дня для меня: где в айфоне твердый знак????? #
  • 15:56 С чувством выполненного долга вернулся с обеда :) Можно и поработать) #
  • 16:17 Посоветуйте пож прошу для менеджмента файлов и чтения PDF на не джейлбрейкнутом #iPhone ? #
  • 16:45 Наконец-то фотошоп научится делать достаточно простые и удобные вещи RT @Tanyushka: вот так дааа, photoshop cs5 bit.ly/19BXVU #
  • 16:55 На сегодня хватит - пора домой отдыхать! Всем хорошего остатка дня) #

Твитты за сегодня
photo
[info]neptunix
  • 10:04 Вчера перестала работать спамооборона-1024. Просто сервер @yandex рвет соединение сразу после коннекта. Отписал в поддержку #
  • 10:20 Мегафон и вправду очень плохо работает с твиттером. Сплошные таймауты :( #
  • 13:32 Обед! Курица с картошкой и RT @1chameleon: Обед! Пончики с компотом =) #
  • 14:41 Ок, теперь когда идем на обед, пишем тег #ru_obed :) RT @1chameleon: согласен. Остановимся на твоём варианте. :) #
  • 15:02 Послушал ваш первый подкаст, понравилось, спасибо! Ждем еще! @viteker, @lajbo4ka #
  • 20:47 Кто-нибудь кроме меня любит смотреть "Папины дочки"? :) #

Твитты за сегодня
photo
[info]neptunix
  • 09:38 Вам тоже доброе утро :) @omally13 @DiorShine @skorr @lajbo4ka и всем остальным! #
  • 10:44 Мое утро на работе twitpic.com/hou8z #
  • 10:57 У Moby все-таки отличные песенки! Сейчас слушаю "Honey" #
  • 12:31 Кто-нибудь уже нашел свою машину на Street View от яндекса? :) #
  • 13:57 RT artrudenko: Нужен шрифт Meta Normal C срочно #
  • 13:57 Давайте адресом вконтакта обмениваться: vkontakte.ru/id346321 #

Твитты за сегодня
photo
[info]neptunix
  • 14:12 Доброго дня всем друзьям! Сегодня воскресенье - еще можно отдыхать :) #
  • 21:06 Нашел среди улицы бесплатный wifi спот МГТС-а. Гуляю с собакой и смотрю YouTube #

Твитты за сегодня
photo
[info]neptunix
  • 18:25 А мне нравится постить в твиттер с айфона. Правда пока не привык :-) #
  • 23:30 Посмотрели Идеальный побег. Моя оценка 4 из 5 #

Твитты за сегодня
photo
[info]neptunix
  • 11:15 Выложил свои скрипты кросспостинга twitter->vkontakte и blogger->lj
    bit.ly/CXmvj #
  • 11:38 RT @ekozlov: Нашел где можно прокатнуться на реактивном самолете - bit.ly/4CypGE Надо добавить в вишлист ;)) #
  • 11:55 А у нас @yandex на своем Street View номера машин не затирает! #
  • 22:58 Подскажите прикольные free игры для iPhone? :) #

Мои скрипты blogger2lj и twitter2vkontakte
photo
[info]neptunix
Решил выложить свои скрипты для кросспостинга, а то многие просят.

Сперва Кросспостринг из твиттера на вконтакте. В настройках укажите логин/пароль от сервисов. Также понадодобятся модули Net::Twitter, WWW::Curl::Easy, WWW::Curl::Share, Text::Iconv,
У меня скрипт запускается по крону каждые 10 минут

twi2vk.pl

#!/usr/bin/perl
use strict;
use warnings;
use Net::Twitter;
use WWW::Curl::Easy;
use WWW::Curl::Share;
use URI::Escape;
use Text::Iconv;
use CGI;
use CGI qw /unescapeHTML/;

my $c = Text::Iconv->new('utf-8','utf-8');
my $q = new CGI;

my $twlogin = 'neptunix';
my $twpass = '';
my $vklogin = '';
my $vkpass = '';
my $debug = 0;
my $add = '';
#my $add = ' « http://twitter.com/neptunix »'; # Что добавить в конец сообщения


my $nt = Net::Twitter->new(
traints => [qw/API::REST/],
username => $twlogin,
password => $twpass
);

my $twitterStatus;
eval {
my $statuses = $nt->user_timeline({count => 20});
for my $status (@$statuses){
if ($status->{text} !~ m/^\@/){ # Убираем реплаи
$twitterStatus = "$status->{text}";
last;
}
}
};

if (my $err = $@) {
die $@ unless $err && $err->isa('Net::Twitter::Error');

warn "HTTP Response Code: ", $err->code, "\n",
"HTTP Message: ", $err->message, "\n",
"Twitter error: ", $err->error, "\n";
}

# Vkontakte

my $curlsh = new WWW::Curl::Share;
$curlsh->setopt(CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
$curlsh->setopt(CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);

# Setting the options
my $curl = new WWW::Curl::Easy;
$curl->setopt(CURLOPT_HEADER,1);
$curl->setopt(CURLOPT_URL, 'http://pda.vkontakte.ru/login?pda=index&acknowledge=0');
my $response_body = '';
open (my $fileb, ">", \$response_body);
$curl->setopt(CURLOPT_WRITEDATA,$fileb);
$curl->setopt(CURLOPT_SHARE, $curlsh);
$curl->setopt(CURLOPT_POST, 1);
$curl->setopt(CURLOPT_POSTFIELDS, "email=$vklogin&pass=$vkpass");

# Starts the actual request
my $retcode = $curl->perform;
# Looking at the results...
if ($retcode == 0) {
print("Transfer went ok\n") if($debug==1);
my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE);
# judge result and next action based on $response_code
print("Received response: $response_body\n") if($debug==1);
} else {
print("An error happened: ".$curl->strerror($retcode)." ($retcode)\n");
exit 0;
}

# Request status edit form
$curl->setopt(CURLOPT_URL, 'http://pda.vkontakte.ru/status');
$curl->setopt(CURLOPT_POST, 0);
# Starts the actual request
$retcode = $curl->perform;
# Looking at the results...
if ($retcode == 0) {
print("Transfer went ok\n") if($debug==1);
my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE);
# judge result and next action based on $response_code
print("Received response: $response_body\n") if($debug==1);
} else {
print("An error happened: ".$curl->strerror($retcode)." ($retcode)\n");
exit 0;
}

my $activityhash = '';
if($response_body =~ /name="activityhash" value="(\w+)"/){
$activityhash = $1;
} else {
print "An error happened: no activityhash found\n";
exit 0;
}

my $status = '';
if($response_body =~ /class="pad">\s+(.*)<br\/>/){
$status = $1;
} else {
print "An error happened: no status found\n";
exit 0;
}

if($status !~ /\.\.$/) {$status =~ s/(.*)\.$/$1/;}
$status =~ s/\S+\s+\S+\s+\S+\s+(.*)/$1/;
$status = unescapeHTML($status);

$twitterStatus = $c->convert($twitterStatus);

$twitterStatus .= $add;

if ($status eq $twitterStatus) {
if($debug) {print "Same status: $status\n";}
}

else {
if($debug) {
print "$status\n";
print "$twitterStatus\n";
}

## Update status
$curl->setopt(CURLOPT_URL, 'http://pda.vkontakte.ru/setstatus?pda=1');
$curl->setopt(CURLOPT_POST, 1);
$curl->setopt(CURLOPT_POSTFIELDS, 'activityhash=' . $activityhash . '&setactivity=' . uri_escape($twitterStatus));

# Starts the actual request
$retcode = $curl->perform;
if ($retcode == 0) {
print("Transfer went ok\n") if($debug==1);
my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE);
# judge result and next action based on $response_code
print("Received response: $response_body\n") if($debug==1);
} else {
print("An error happened: ".$curl->strerror($retcode)." ($retcode)\n");
}

}



Постинг из Blogger в LiveJournal
Для работы нужно создать файл lastid.txt в той же директории (или прописать путь к нему), что и скрипт с правами на запись: touch lastid.txt;
chown user:user lastid.txt (user - пользователь от которого запускается скрипт)
У меня постинг работает по крону раз в сутки ночью
Здесь используются модули LJ::Simple, XML::FeedPP, Time::ParseDate

blogger2lj.pl

#!/usr/bin/perl
use strict; # Silly not to be
use POSIX; # For strftime()
use LJ::Simple;
use XML::FeedPP; # Parse Atom feed
use Time::ParseDate; # Parse date from feed

## Lj posting code taken from from ljpost

my $source = 'http://blogger.feed.source';
my $idfile = "lastid.txt";
my $user='lj-login';
my $pass='lj-pass';
my $post;
my $autoformat=0;
my $allowcomments=1;
my $add_to_post; # Эта переменная добавляется к посту. Определена ниже.

##
## Получаем фид и берем ID из файла
##
my $feed = XML::FeedPP->new( $source );

my $lastid; # Последний id

if(open(FILE, "$idfile")){
$lastid = readline(FILE);
chomp($lastid);
close(FILE);
}

# Просмотр списка на наличие ID и ищем его в файле


my @add; # Массив для добавления постов

foreach my $item ( $feed->get_item() ) {
my $id = $item->guid(); $id =~ s/.*post-(\d+)/$1/;
if ($id != $lastid) {
# Если новый id не соответствует старому - добавить в очередь на постинг (в массив $add)
push @add, $id;
}
else { last; }
}


##
## Начало цикла постинга в ЖЖ
##

my $last_good_id;
$|=1;
($LJ::Simple::VERSION<0.07) && ($LJ::Simple::timeout = 300);
my $lj = new LJ::Simple({ user=>$user,pass=>$pass });
(defined $lj) || die "$0: Failed to log into LJ - $LJ::Simple::error\n";


for(my $i=$#add; $i>=0; $i--){
foreach my $item ( $feed->get_item() ) {
my $id = $item->guid(); $id =~ s/.*post-(\d+)/$1/;
if($id == $add[$i]) { # Мы нашли наш пост. Будем его обрабатывать

my %Event=();
$lj->NewEntry(\%Event) || die "$0: Failed to prepare event - $LJ::Simple::error\n";

my $time = parsedate( $item->pubDate );
my(undef,$mins,$hrs,$dy,$mn,$yr,undef,undef,$l8)=localtime($time);

my $goodtime = mktime(0,$mins,$hrs,$dy,$mn,$yr,0,0,$l8);
$lj->SetDate(\%Event,$goodtime);

my $subject = $item->title();
($subject ne "") && $lj->SetSubject(\%Event,$subject);

my $tags;
if(ref($item->category())){
$tags = join (",", @{$item->category()});
}
else {
$tags = $item->category();
}
($tags ne "") && $lj->Setprop_taglist(\%Event,split(/,\s*/,$tags));

if ($autoformat) {
print "Autoformat: yes\n";
$lj->Setprop_preformatted(\%Event,1) ||
die "$0: Failed to set entry as preformatted - $LJ::Simple::error\n";
}

my $link = $item->link();
$add_to_post = <<END;
<br/>
<div style="position: relative; background-color: #b8daee; border: #98c6e2 1px dotted; padding: 5px; margin: 2px; text-align: center; clear:both">Запись опубликована в блоге blog.brigadirov.com. Лучше оставляйте свои комментарии <a href="$link">там</a>. Но можно и тут.</div>
END

my $post = $item->description();
$post .= $add_to_post;
$lj->SetEntry(\%Event,$post) ||
die "$0: Failed to set entry - $LJ::Simple::error\n";

if($allowcomments==0){
$lj->Setprop_nocomments(\%Event,1) ||
die "$0: Failed to set property - $LJ::Simple::error\n";
}
my ($item_id,$anum,$html_id)=$lj->PostEntry(\%Event);

if (defined $item_id) {$last_good_id = $id;}

(defined $item_id) ||
die "$0: Failed to post entry - $LJ::Simple::error\n";

}
}
}

if(defined $last_good_id) {
if(open(FILE, ">$idfile")){
print FILE $last_good_id;
close(FILE);
}
}


Запись опубликована в блоге blog.brigadirov.com. Лучше оставляйте свои комментарии там. Но можно и тут.

Твитты за сегодня
photo
[info]neptunix
  • 09:16 Доброе утро, твиплы! Помогите пожалуйста с голосованием :) bit.ly/3cK0CO #
  • 09:53 Написал вкратце об основных новинках вчерашнего Apple Event: bit.ly/ieaFN #
  • 10:04 Поставил iTunes 9. Экспорт на last.fm не нашел #
  • 15:27 Офигеть! Чего я не ожидал - так это Street View от Яндекса. Пускай и работает пока как-то не очень. Но прогресс на лицо! bit.ly/22S1s #
  • 16:36 RT @maxmoriss: Обходите стороной тур-оператора АМИГО-С Запороли нам шенген, собрали неполный пакет документов! В итоге ни визы ни денег! #
  • 16:58 Никогда не оставляйте дома полную бутылку с квасом на солнце. Поставил, забыл, а через неделю взорвалась :( yfrog.com/0tnlfxj #
  • 19:31 Заехал на мойку, а то уже машина уже превратилась в матово-серую! #