위키에서 페이지를 변경하거나 했을 때 트위터에도 자동으로 글이 올라가게 하는 패치를 고려하는데, 일단 /Comments매크로와 /Thread매크로, 페이지 수정에 적용된 상태.
UseModWiki소스수정/Twitter로_보내기를 참고했음.
### Twitter $TwitterID = "트위터아이디"; # $TwitterPass = "암호"; # 사용하지 않는다 $TwitterPrefix = "앞에 붙을 문자열"; ### Twitter OAuth - 발급받은 값을 따옴표 안에 각각 적어준다 $TwitterConsumerKey = ""; # consumer_key $TwitterConsumerSecret = ""; # consumer_secret $TwitterAccessToken = ""; # access_token $TwitterAccessTokenSecret = ""; # access_token_secret
# URI 모듈 1.40 이상을 쓰는 경우는 아래 주석 처리 # $msg = Encode::encode("UTF-8", $msg);
### 패치를 위해 추가된 환경설정 변수 use vars qw( $UserGotoBar $UserGotoBar2 $UserGotoBar3 $UserGotoBar4 ... $TwitterID $TwitterPass $TwitterPrefix $TwitterConsumerKey $TwitterConsumerSecret $TwitterAccessToken $TwitterAccessTokenSecret );
comment 매크로 입력창에 트위터 체크박스 추가
sub MacroComments { ... # Twitter - 이 단락 추가 my $twitter = ""; if ( UserIsAdmin() and $TwitterID ) { $twitter = $q->checkbox(-name=>'twitter_comment', -checked=>0, -label=>T('Twitter')."($TwitterID)"). "\n"; } # 여기까지 $txt = $q->startform(-name=>"comments",-method=>"POST",-action=>"$ScriptName") . &GetHiddenValue("action","comments") . &GetHiddenValue("id",$id) . &GetHiddenValue("pageid",$pageid) . &GetHiddenValue("up","$up") . &GetHiddenValue("ccode","$ccode") . (($threadindent ne '')?&GetHiddenValue("threadindent",$threadindent):"") . T('Name') . ": " . $name_field . " " . $spambot_trap . T('Comment') . ": " . $hidden_long . $comment_field . " " . # 여기 한 줄 추가 $twitter . $submit_button . $q->endform; ... }
페이지 수정 화면에 체크박스 추가
sub DoEdit { ... } else { print "<br>", $q->checkbox(-name=>'recent_edit', -label=>T('This change is a minor edit.')); } # Twitter - 이 단락 추가 if ( UserIsAdmin() and $TwitterID ) { print "<br>", $q->checkbox(-name=>'twitter_edit', -checked=>0, -label=>T('Twitter')."($TwitterID)"), "\n"; } # 여기까지 if ($EmailNotify) { print " " . ... }
페이지 저장할 때 트위터에 올리는 부분 추가
sub DoPostMain { ... &SaveDefaultText(); &SavePage(); ### 링크 목록을 별도로 관리 &SaveLinkFile($id); ### rss from usemod1.0 # &WriteRcLog($id, $summary, $isEdit, $editTime, $user, $Section{'host'}); &WriteRcLog($id, $summary, $isEdit, $editTime, $user, $Section{'host'}, $Section{'revision'}); ### # Twitter - 이 단락 추가 if ( GetParam('twitter_edit') and UserIsAdmin() and $TwitterID ) { $FullUrl = $q->url(-full=>1) if ($FullUrl eq ""); my $sum = ": $summary"; $sum = "" if $sum eq ": *"; my $url = $FullUrl . &ScriptLinkChar() . $id; PostTwitter( "$TwitterPrefix $url $id$sum" ); } # 여기까지 if ($UseCache) { UnlinkHtmlCache($id); # Old cached copy is invalid ... }
다음 함수 통채로 추가:
# Twitter # $msg - 트위터에 올릴 내용 sub PostTwitter { my $msg = shift; if ( eval "require Net::Twitter::Lite::WithAPIv1_1;" ) { my $msg_length = 140; # URL은 %인코딩한 후, t.co로 변환될때 길이가 얼마나 줄어들지(때론 늘어날지) 고려 my $shorterlink = sub { my $url = shift; my $converted = EncodeUrl( $url ); $msg_length += length($converted) - 20; return $converted; }; my $nt = Net::Twitter::Lite::WithAPIv1_1->new( consumer_key => $TwitterConsumerKey, consumer_secret => $TwitterConsumerSecret, access_token => $TwitterAccessToken, access_token_secret => $TwitterAccessTokenSecret, legacy_lists_api => 0, ssl => 1, ); # 긴 URL 줄이기 $msg =~ s/$UrlPattern/$shorterlink->($1)/ge; # 140자 제한 $msg = decode($HttpCharset, $msg); $msg = substr($msg, 0, $msg_length); # URI 모듈 1.40 이상을 쓰는 경우는 아래 주석 처리 # $msg = encode("UTF-8", $msg); my $result = eval { $nt->update($msg) }; if ( $@ ) { my ( undef, $filename, $line, $subroutine ) = caller(0); warn "twitter error [$filename:$line:$subroutine] [$@]"; } } }
/웹페이지링크쉽게올리기 패치에서 나온 북마클릿을 클릭해서 뜨는 창에도 트위터 체크박스 추가
sub action_addtopic { ... $comment_field = &GetTextArea("comment", $default_text, 7, 80); # Twitter - 이 단락 추가 my $twitter = ""; if ( UserIsAdmin() and $TwitterID ) { $twitter = $q->checkbox(-name=>'twitter_comment', -checked=>0, -label=>T('Twitter')."($TwitterID)"). "<br>\n"; } # 여기까지 # html 출력 print &GetHeader("", $header_msg, ""); ... T('Comment') . ":<br>". $comment_field . " " ."\n". # 여기 한 줄 추가 $twitter . $q->submit(-name=>"Submit",-value=>(" "x5).T("Submit").(" "x5))."\n". ... }
코멘트 입력한 걸 저장하는 시점에 트위터에도 저장하는 루틴 추가:
sub action_comments { ... # 트위터 - 여기서부터 추가 if ( GetParam('twitter_comment') and UserIsAdmin() and $TwitterID ) { PostTwitter( $newcomments ); } # 여기까지 DoPostMain($string, $id, "*", $Section{'ts'}, 0, 0, "$pageid$anchor"); return; }
ext2.13d - Net::Twitter::Lite 모듈 0.10003과 URI 모듈 1.52로 업데이트하면서 문자열 처리에 어딘가 변경이 생긴 듯. 이제는 UTF-8로 인코딩하지 않고 펄 내부 문자열 형태로 update()의 인자로 넘겨주게 함
ext2.14 - 트위터가 OAuth로만 인증이 가능하게 되었기에 관련 소스 수정
ext2.24 - 굳이 URL을 다른 서비스를 통해 줄이지 않아도 이젠 트위터가 20자 길이의 알아서 URL로 줄여준다. URL 줄이는 부분 제거
ext2.27 - 트위터 API 1.1 을 사용하도록 수정
ext2.27a - 트위터 클라이언트 생성자에 ssl => 1
파라메터 추가. (이제는 필수가 되었음)
대충 마무리 되었습니다. 이것저것 불만족스러운 부분이 많지만 더 손대려면 한도 끝도 없어서...
하루 지나보니... 내가 만들었지만 잘 만들었군요;; 횡설수설에 올리고 그대로 복사해서 트위터에 붙여넣는게 아주 귀찮았는데...
아. 바벨위키를 요새 다시 업데이트를 열심히 하다 보니 이것도 적용하고 싶은 생각이 드는 군요. 주말에 날 잡아서 한 번 해볼가 하는데 "Perl/모듈설치에 익숙하지 않은채로 하기 좀 힘들어보인다. 호스팅 업체에 요청해야 할 듯." 이 부분이 걸리는군요..