-
- 1. Twitter 연동
-
-
- 1.1. 사용법
-
-
- 1.1.1. comments, longcomments, threads, 횡설수설 링크 올리기
-
- 1.1.2. 페이지 수정
-
- 1.1.3. 설정
-
1.2. OAuth 인증을 하기 위한 키 발급받기
-
- 1.3. 주의사항 및 부작용
-
- 1.4. wiki.pl 수정
-
- 1.5. action/addtopic.pl 수정
-
- 1.6. action/comments.pl 수정
-
- 1.7. 추가 업데이트 내역
-
- 1.8. 사용자 의견
-
1. Twitter 연동
위키에서 페이지를 변경하거나 했을 때 트위터에도 자동으로 글이 올라가게 하는 패치를 고려하는데, 일단 /Comments매크로와 /Thread매크로, 페이지 수정에 적용된 상태.
UseModWiki소스수정/Twitter로_보내기를 참고했음.
- 필수 요구 사항:
- 트위터 인터페이스를 제공하는 Net::Twitter::Lite 모듈이 필요한데, 의존성이 복잡하게 걸려 있어서 Perl/모듈설치에 익숙하지 않은채로 하기 좀 힘들어보인다. 호스팅 업체에 요청해야 할 듯.
- 2010년 9월부터 트위터API를 쓰기 위해서는 OAuth 방식으로 인증해야 한다. Net::Twitter::Lite 에서 Net::OAuth 를 사용하게 되어 있으므로 이 모듈도 있어야 한다.
- /EncodeUrl함수
- "OAuth 인증을 하기 위한 키 발급받기" 항목을 참조하여 키와 토큰을 발급받아야 함
1.1.1. comments, longcomments, threads, 횡설수설 링크 올리기
(thread 매크로의 경우)
- 체크한 경우 텍스트박스 안에 있는 내용을 다음과 같이 가공하고
- 올리기 전에 26글자보다 긴 URL은 [TinyURL]을 사용하여 짧게 줄임
- URL 변환 후에 남은 텍스트가 140자보다 길 경우 140자에서 자름
- config 파일에 있는 아이디와 암호를 이용하여 트위터에 올린다.
- 예:
(횡설수설에 올린 내용이 트위터에도 그대로 올라간 모습)
- 페이지 수정
- 마찬가지로 관리자 권한이 있는 아이디로 로그인했고, /Configuration 파일에 트위터 아이디와 패스가 적혀 있을때,
- 페이지 저장 버튼 위에 트위터에도 올릴 것인지를 체크하는 박스가 뜬다.
(페이지 수정의 경우)
- 체크한 경우,
- <TwitterPrefix 변수에 저장된 내용> <페이지URL> <페이지이름>: <변경사항요약> 형태로 메시지를 만든 후에
- URL 은 TinyURL을 사용하여 짧게 줄이고
- 140자보다 긴 부분은 자른 후
- 트위터에 올린다.
- 예:
(이 페이지를 수정하고 저장할 때 트위터에 올라간 모습)
- 트위터 아이디와 암호, prefix는 config.pl 파일에서 다음과 같이 적어준다:
- (OAuth 인증을 하게 되었으므로 기존의 TwitterPass와 TwitterID는 둘 다 필요가 없는데, 소스를 최소한으로 수정하려고 하니 ID는 계속 사용하게 되었다 -_-; 큰 의미는 없으므로 빈문자열이 아닌 아무 값이나 줘도 상관없다)
$TwitterID = "트위터아이디";
$TwitterPrefix = "앞에 붙을 문자열";
$TwitterConsumerKey = "";
$TwitterConsumerSecret = "";
$TwitterAccessToken = "";
$TwitterAccessTokenSecret = "";
1.2. OAuth 인증을 하기 위한 키 발급받기
- [dev.twitter.com]에 간다. 자기가 사용할 계정으로 로그인한다.
- "2 Register an app"를 클릭하여 자기가 사용할 위키를 등록한다.
- Application Name: - 적당히 지어준다. 여기 적은 이름이 트위터 홈페이지에서 "via 클라이언트이름" 자리에 나오니 너무 엉망으로 짓진 말자 :-)
- Description: - 주인장의 경우 적당히 "I'm using my own Perl script to post to my twitter account."라고 적어주었다. 설마 이거 애매하게 적으면 잘리거나 하진 않겠지;
- Application Website: - 딱히 적을 말이 없는데 필수 항목이라서 할 수 없이 내 홈페이지 주소를 적었다. 이 주소가 "via 클라이언트이름" 자리에 링크가 걸린다.
- Organizaion: - 적당히
- Application Type: - "Client" 선택
- Default Access type: - "Read & Write" 선택
- 마지막에 CAPTCHA 적는 곳을 채워준 후 하단 "Register application" 버튼 클릭
- 방금 등록한 애플리케이션의 정보가 나오는데, 여기에서 "Consumer key"와 "Consumer secret"값을 메모해둔다.
- 우측에 "My Access Token" 클릭
- 이 화면에서 "access token"과 "access token secret" 값을 메모해둔다.
1.3. 주의사항 및 부작용
- 일단, 트위터암호가 그대로 설정 파일에 적혀 있는게 좀 기분이 안 좋다.
- 특정한 트위터 계정 하나를 지정하게 되어 있는 것이라서, 아래와 같은 문제가 있다
- 위키를 다수가 편집하면서 사용하는 경우에 다수가 각자의 트위터를 쓴다던가 하는 게 불가능
- 타인이 맘대로 그 계정으로 트위터에 올리면 곤란하기 때문에 관리자 권한이 있는 사람만 사용할 수 있는 것도 한계점
- 코멘트 매크로 입력폼 옆에 트위터아이디와 암호를 넣는 필드를 만들어서, 자기가 원하는 아이디와 암호를 그때그때 적을 수 있게 할까 생각도 했는데, 딱히 https 전송을 지원하는 것도 아니면서 그렇게 넣는 게 더 불안할 것 같아서 망설이고 있는 상태
- 시스템에 설치된 Net::Twitter::Lite 모듈과 URI 모듈의 버전에 따라서 소스가 좀 달라져야 한다. (정확히 어느 버전부터 어떻게 되는지 파악을 못 하겠음)
- wiki.pl 의 PostTwitter 서브루틴에서 다음 라인을 주석처리
- 만일 한글이 깨져서 나온다면 주석을 해제해 주어야 함
1.4. wiki.pl 수정
트위터아이디와 암호를 저장하는 환경변수 추가
use vars qw(
$UserGotoBar $UserGotoBar2 $UserGotoBar3 $UserGotoBar4
...
$TwitterID $TwitterPass $TwitterPrefix
$TwitterConsumerKey $TwitterConsumerSecret $TwitterAccessToken $TwitterAccessTokenSecret
);
comment 매크로 입력창에 트위터 체크박스 추가
sub MacroComments {
...
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.'));
}
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);
&WriteRcLog($id, $summary, $isEdit, $editTime, $user, $Section{'host'}, $Section{'revision'});
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);
...
}
다음 함수 통채로 추가:
sub PostTwitter {
my $msg = shift;
if ( eval "require Net::Twitter::Lite::WithAPIv1_1;" ) {
my $msg_length = 140;
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,
);
$msg =~ s/$UrlPattern/$shorterlink->($1)/ge;
$msg = decode($HttpCharset, $msg);
$msg = substr($msg, 0, $msg_length);
my $result = eval { $nt->update($msg) };
if ( $@ ) {
my ( undef, $filename, $line, $subroutine ) = caller(0);
warn "twitter error [$filename:$line:$subroutine] [$@]";
}
}
}
1.5. action/addtopic.pl 수정
/웹페이지링크쉽게올리기 패치에서 나온 북마클릿을 클릭해서 뜨는 창에도 트위터 체크박스 추가
sub action_addtopic {
...
$comment_field = &GetTextArea("comment", $default_text, 7, 80);
my $twitter = "";
if ( UserIsAdmin() and $TwitterID ) {
$twitter = $q->checkbox(-name=>'twitter_comment', -checked=>0, -label=>T('Twitter')."($TwitterID)"). "<br>\n";
}
print &GetHeader("", $header_msg, "");
...
T('Comment') . ":<br>".
$comment_field . " " ."\n".
$twitter .
$q->submit(-name=>"Submit",-value=>(" "x5).T("Submit").(" "x5))."\n".
...
}
1.6. action/comments.pl 수정
코멘트 입력한 걸 저장하는 시점에 트위터에도 저장하는 루틴 추가:
sub action_comments {
...
if ( GetParam('twitter_comment') and UserIsAdmin() and $TwitterID ) {
PostTwitter( $newcomments );
}
DoPostMain($string, $id, "*", $Section{'ts'}, 0, 0, "$pageid$anchor");
return;
}
1.7. 추가 업데이트 내역
ext2.13c - 확인하기 편하도록, 트위터 체크박스에 트위터 아이디를 같이 출력하게 함
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/모듈설치에 익숙하지 않은채로 하기 좀 힘들어보인다. 호스팅 업체에 요청해야 할 듯." 이 부분이 걸리는군요..
- 그러게요. 기억은 잘 안 나는데 저 모듈이 은근히 의존성이 걸린 모듈이 많았던 걸로.
- 그렇군요.. 언제 날 잡아서 시도하든가 해야지, 섣불리하진 못하겠군요..갑사합니다.
- 아니 뭐 모듈이 없어도 소스 업데이트하는 데는 문제 없습니다. TwitterID 설정변수 값을 주지만 않으면 그냥 예전처럼 동작할 겁니다.
위키위키분류