PostTweetプラグイン バージョン2

はじめに

コンテンツのタイトルや画像とパーマリンクの短縮URLをTwitterに投稿するプラグインです。

動作条件

本プラグインはMovable Type 7.1以上にて動作します。

インストール

本パッケージに含まれる「plugins」ディレクトリ内の「PostTweet」ディレクトリを、Movable Typeインストールディレクトリの「plugins」ディレクトリの下にコピーしてください。

なお、Movable TypeをPSGI/Plack環境で実行している場合、プラグインのインストールを認識させるためにアプリケーションのリロードが必要になる場合があります。

インストール後、次のような構成になります(一部省略しています)。

    mt (Movable Typeインストールディレクトリ)
    `-- plugins
        `-- PostTweet
            |-- extlib
            |   |-- Digest
            |   `-- Net
            |-- lib
            |   `-- PostTweet
            |       |-- OAuth
            |       |-- L10N
            |       `-- L10N.pm
            |-- tmpl
            |   |-- asset_insert.tmpl
            |   |-- blog_config_mt7.tmpl
            |   |-- message_format.tmpl
            |   |-- oauth_complete_mt7.tmpl
            |   `-- oauth_start_mt7.tmpl
            `-- posttweet.pl

作業後、Movable Typeにログインするとデータベースのアップグレードが必要になる場合がありますので「アップグレード開始」をクリックし、アップグレードを完了させてください。

アップグレード開始

次に、Movable Type のプラグイン設定画面を表示し、プラグインの一覧に「PostTweet」が表示されていることを確認してください。これでインストール完了です。

注意:不足しているモジュールは、プラグインインストール後にサイトのプラグイン設定画面より確認することができます。確認方法は「アカウントの登録」を参照してください。不足モジュールがある限りTwitterへの認証を行うことができませんのでご注意ください。

アカウントの登録

Twitterへの投稿を行うためには、当プラグインがお使いのTwitterのアカウントを利用できるようTwitterのサイトにて認証を行う必要があります。

  1. サイトのプラグイン設定画面(注意:システムのプラグイン設定画面ではありません)で PostTweet の設定を表示します。
    プラグイン設定画面

    注意:PostTweetの設定画面の「認証」部分にエラーメッセージが表示されていないか確認してください。表示されている場合にはTwitterの認証・投稿を行うためのPerlモジュールに不足があります。表示されているモジュールのインストールを行ってください。

    プラグインエラー
  2. 「OAuthによる認証」をクリックします。ダイアログが開きます。
    プラグイン設定画面2
  3. このダイアログではTwitterから提供されるPIN番号を入力する必要があります。
    「PIN番号を取得する」をクリックすると新たにTwitterのサイトが開きます。
    プラグイン設定画面3
  4. Twitterのサイトでは、PostTweetからのアクセス許可についての確認が行われます。
    ここで表示されているアカウントが投稿に利用されますのでアカウントを確認した後「連携アプリを認証」をクリックします。
    Twitter承認画面1
  5. PIN番号が表示されますのでこれを記憶します。このウインドウは認証完了後に閉じてください。
    Twitter承認画面2
  6. 元のダイアログにPIN番号を入力し「実行」をクリックしてください。認証を開始します。
    プラグイン設定画面4
  7. 認証成功を確認して「閉じる」をクリックします。
    プラグイン設定画面5
  8. プラグインの設定画面に戻りますので、設定を確認後「変更を保存」をクリックします。
    これでこのサイトからTwitterに投稿できるようになります。

使い方

  1. コンテンツ(記事/ウェブページ/コンテンツデータ)を編集し、公開することでTwitterに投稿されます。保存後、編集画面上部に投稿の成否が表示されます。失敗した場合はシステムログにエラー内容が記録されます。
    成功時の表示

    成功時の表示

    失敗時の表示

    失敗時の表示

  2. Twitterへ投稿するメッセージの内容を編集画面右下部で確認(プレビュー)することができます。ここに表示される短縮URLはダミーですが、Twitterへ投稿する前に実際のURLに置換えられます。またこの画面でコンテンツ単位でメッセージ投稿タイミングを指定することができます。
    プレビュー
  3. コンテンツ編集画面右下部の再投稿ボタンで再度投稿することが可能です。
    再投稿

オプション設定

プラグインの有効化

初期設定では、Twitterへの投稿機能が有効となっています。PostTweetの動作を一時的に無効化したい場合にこの設定を変更します。

  1. 「有効」設定のチェックをはずします。
    プラグイン設定画面6
  2. 「変更を保存」をクリックします。これでPostTweetの動作が無効化されました。

投稿タイミング

初期設定では、コンテンツを編集し保存する度にTwitterへ投稿しますが、このタイミングを変更することができます。なおこの投稿タイミングは、コンテンツ新規作成時の初期値であり、それぞれの編集画面において個別に変更することが可能です。

  1. 「投稿」設定をチェックします。
    プラグイン設定画面7
  2. 投稿タイミングを選択します。選択できる投稿タイミングは次の通りです。
    投稿しない
    投稿しません。
    最初の公開時のみ投稿する
    コンテンツの状態を未公開(下書き)から公開に変更し、保存した場合にのみ投稿します。
    常に投稿する
    コンテンツの状態が公開であれば、保存のたびに投稿します。
  3. 「変更を保存」をクリックします。

DataAPI

初期設定では、DataAPIを用いてコンテンツを保存した場合、Twitterへの投稿機能が動作しないようになっています。DataAPIを用いてコンテンツを保存した場合にもTwitterへ投稿したい場合には、この設定を変更します。

  1. 「DataAPIを用いた公開時にも投稿する」設定をチェックします。
    プラグイン設定画面12
  2. 「変更を保存」をクリックします。これでDataAPIでの保存時にもTwitterへ投稿します。

URL短縮サービス

Twitterへ投稿する際、コンテンツのパーマリンクを短縮するサービスを選択することができます。

  1. URL短縮サービスを選択します。初期設定では「TinyURL」が選択されています。
    プラグイン設定画面4
  2. 「bit.ly」「j.mp」を選択した場合、bit.ly APIログイン名/APIキーを指定します。
    プラグイン設定画面5
  3. 「変更を保存」をクリックします。

フォーマットテンプレート名

Twitterへ投稿するメッセージのフォーマットを定義したテンプレートモジュールの名前を指定することができます。

デフォルトでは「PostTweet Message Format」という名前が設定されています。ここで指定した名前のテンプレートモジュールをサイトのテンプレート、グローバルテンプレートの順に検索し、最初に見つかったものを使用します。

指定したテンプレートモジュールが見つからない場合、プラグインと一緒にインストールされる「message_format.tmpl」という名前のテンプレートファイルを使用します。

  1. 「フォーマットテンプレート名」を変更し、
    プラグイン設定画面11
  2. 「変更を保存」をクリックします。

高度な設定

Twitterへ投稿するアプリケーションを変更することができます。デフォルトでは「PostTweet」として投稿するように設定されています。

Twitterのアプリケーションはこちらから登録することができます。登録は次の手順で行います。

  1. 「新しいアプリケーションを追加(Register a new application)」をクリックします。
  2. 登録画面が開きますのでアプリケーションの情報を入力します。
  3. 「アプリケーションのアイコン(Application Icon)」「アプリケーション名(Application Name)」「アプリケーションの説明(Description)」「アプリケーションのウェブサイトURL(Application Website)」「所属会社/団体(Organization)」「サイト(Website)」はアプリケーションの情報として任意の情報を入力してください。(この情報は後からでも変更可能です)
  4. 「アプリケーションの種類(Application Type)」には「クライアントアプリケーション(Client)」を、「Default Access type」には「Read & Write」を指定してください。
    また「Twitterでログインする(Use Twitter for login)」のチェックははずしてください。
  5. CAPTCHA画像の文字を入力した後、「保存する(Save)」をクリックすることでアプリケーションが作成されます。
  6. 次に表示される「Consumer key」ならびに「Consumer secret」を保管します。(この情報は後からでも確認可能です)

作成したアプリケーションを次の手順でプラグインに登録します。

  1. 保管しておいた「Consumer key」ならびに「Consumer secret」を同名のフィールドに入力します。
  2. 「変更を保存」をクリックします。
  3. 一度Twitterのアカウントの登録が行われている場合でも再度認証と登録を行う必要がありますので、PostTweetのプラグイン設定画面に戻ります。
  4. アカウントの登録」に従って再度アカウントの登録を行ってください。

テンプレートタグ

PostTweetでは、メッセージフォーマットを定義するテンプレートモジュール内でのみ以下のタグが使用できます。

MTEntryShortenedPermalink
プラグイン設定で指定された短縮URLサービスを使用して記事のパーマリンクを変換した短縮URLを表示します。プレビューで使用される場合はダミーのURL(例、http://tinyurl.com/xxxxxx)を出力し、短縮URLサービスへアクセスしません。
短縮前のパーマリンクに対してMTEntryPermalinkタグと同じモディファイアが使用できるほか、次の追加のモディファイアを使用できます。
add_query="variable_foo"
短縮するパーマリンクにクエリ文字列を追加します。クエリはテンプレートの変数もしくはハッシュ変数で記述し、その変数名を指定します。
MTPageShortenedPermalink
同様にウェブぺージのパーマリンクを表示するタグです。機能はMTEntryShortenedPermalinkタグと同一です。
MTContentShortenedPermalink
同様にコンテンツデータのパーマリンクを表示するタグです。機能はMTEntryShortenedPermalinkタグと同一です。

メッセージフォーマットの定義

テンプレートモジュールを作成することで、Twitterへ投稿するメッセージをカスタマイズすることができます。例えば、サイト名やユーザ名を含めたり、カスタムフィールドに入力されたデータを含めたり、データの順序、リンクのURLを変更したりすることが可能になります。

メッセージフォーマットを定義する際には、テンプレートで生成されるメッセージの長さに注意してください。Twitterが受け付ける最大の文字数を越えないようテンプレートタグを用いて調整する必要があります。

例えば、デフォルトのメッセージフォーマットは、「タイトル - 短縮されたパーマリンク」という形式で定義されていますが、記事データのテンプレートタグで表すと、

<MTEntryTitle> - <MTEntryShortenedPermalink>

となります。メッセージフォーマットを定義したテンプレートモジュールは、保存するコンテンツ(記事/ウェブページ/コンテンツデータ)のコンテキスト内として処理されますので、記事を保存した場合には、記事の関連タグを直接記述することが可能です。

デフォルトのメッセージフォーマットでは、タイトルが長すぎた場合にリンクが削除されることがないよう、タイトルの文字列をカットして全体で140文字以内となるよう記述しています。

<mt:setvar name="title_len" value="140" />
<mt:if name="posttweet_entry">
<mt:setvarblock name="title"><mt:entrytitle remove_html="1" /></mt:setvarblock>
<mt:setvarblock name="link"><mt:entryshortenedpermalink /></mt:setvarblock>
<mt:else>
<mt:setvarblock name="title"><mt:contentlabel remove_html="1" /></mt:setvarblock>
<mt:setvarblock name="link"><mt:contentshortenedpermalink /></mt:setvarblock>
</mt:if>
<mt:setvarblock name="link_len"><mt:var name="link" count_characters="1" /></mt:setvarblock>
<mt:setvar name="title_len" op="-" value="$link_len" /><mt:if name="link"><mt:setvar name="title_len" op="-" value="3" /></mt:if>
<mt:var name="title" trim_to="$title_len" /><mt:if name="link"> - <mt:var name="link" /></mt:if>

最初の行から順に見て行きますと、

  1. 変数title_lenはタイトル部分の長さを表し、初期値としてメッセージの最大長140文字を設定します。
  2. 変数titleはタイトルを格納します。これが切り捨てられてもよい部分になります。
  3. 変数linkは短縮されたパーマリンクを格納します。これが切り捨てられては困る部分になります。
  4. 変数link_lenは変数linkの文字数を格納します。count_characterモディファイアはタグが出力する文字数を数え表示します。
  5. 変数title_lenから変数link_lenを引き、その結果を再度変数title_lenに格納します。これがタイトルとして表示可能な最大文字数となり、これを越える分については切り捨てられるということになります。
  6. 変数titleの内容をtrim_toモディファイアを使って先頭から変数title_lenの長さ分だけ表示し、さらに変数linkが存在する場合にはその内容を表示します。

このような処理にすることで、短縮されたパーマリンクが切り捨てられないようになっています。

サイト名入りのメッセージフォーマット

簡単なカスタマイズの例として、デフォルトのメッセージフォーマットにサイト名を入れ、「[サイト名] タイトル - 短縮されたパーマリンク」という形式にしてみます。

<mt:setvar name="title_len" value="140" />
<mt:if name="posttweet_entry">
<mt:setvarblock name="title">[<mt:sitename remove_html="1" />] <mt:entrytitle remove_html="1" /></mt:setvarblock>
<mt:setvarblock name="link"><mt:entryshortenedpermalink /></mt:setvarblock>
<mt:else>
<mt:setvarblock name="title">[<mt:sitename remove_html="1" />] <mt:contentlabel remove_html="1" /></mt:setvarblock>
<mt:setvarblock name="link"><mt:contentshortenedpermalink /></mt:setvarblock>
</mt:if>
<mt:setvarblock name="link_len"><mt:var name="link" count_characters="1" /></mt:setvarblock>
<mt:setvar name="title_len" op="-" value="$link_len" /><mt:if name="link"><mt:setvar name="title_len" op="-" value="3" /></mt:if>
<mt:var name="title" trim_to="$title_len" /><mt:if name="link"> - <mt:var name="link" /></mt:if>

変数titleに大括弧([])で括ったサイト名を追加しています。この変数に格納した文字列は後半が切り捨てられる可能性がありますので、サイト名の長さによってはタイトルが短くなるだけでなく、サイト名自体も切り捨てられる場合もあります。

ハッシュタグ入りメッセージフォーマット

次の例として、切り捨てられては困る部分に、記事/ウェブページに設定したタグをTwitterのハッシュタグとして入れ、「タイトル #hashtag - 短縮されたパーマリンク」という形式にしてみます。

<mt:setvar name="title_len" value="140" />
<mt:if name="posttweet_entry">
<mt:setvarblock name="title"><mt:entrytitle remove_html="1" /></mt:setvarblock>
<mt:setvarblock name="link"><mt:entryshortenedpermalink /></mt:setvarblock>
<mt:setvarblock name="hashtag"><mt:entrytags> #<mt:tagname></mt:entrytags></mt:setvarblock>
<mt:else>
<mt:setvarblock name="title"><mt:contentlabel remove_html="1" /></mt:setvarblock>
<mt:setvarblock name="link"><mt:contentshortenedpermalink /></mt:setvarblock>
<mt:setvarblock name="hashtag"></mt:setvarblock>
</mt:if>
<mt:setvarblock name="link_len"><mt:var name="link" count_characters="1" /></mt:setvarblock>
<mt:setvarblock name="hashtag_len"><mt:var name="hashtag" count_characters="1" /></mt:setvarblock>
<mt:setvar name="title_len" op="-" value="$link_len" /><mt:if name="link"><mt:setvar name="title_len" op="-" value="3" /></mt:if><mt:setvar name="title_len" op="-" value="$hashtag_len" />
<mt:var name="title" trim_to="$title_len" /><mt:var name="hashtag" /><mt:if name="link"> - <mt:var name="link" /></mt:if>

変数hashtagとして、それぞれのタグの先頭に#(ハッシュマーク)を付け、空白でつないだ文字列を格納しています。この文字列が切り捨てられることがないよう、変数link同様に変数title_lenを調節しています。( なおコンテンツデータでのハッシュタグの記述はここでは省略しています)

Google Analytics向けのパーマリンクを使用する

この例では短縮前のパーマリンクにクエリ文字列を追加するadd_queryモディファイアを使い、Google Analytics用のトラッキング変数を付与した短縮URLを生成します。

<mt:setvar name="title_len" value="140" />
<mt:sethashvar name="query">
<mt:setvar name="utm_source" value="sample" />
<mt:setvar name="utm_media" value="twitter" />
<mt:setvar name="utm_content" value="posttweet" />
</mt:sethashvar>
<mt:if name="posttweet_entry">
<mt:setvarblock name="title"><mt:entrytitle remove_html="1" /></mt:setvarblock>
<mt:setvarblock name="link"><mt:entryshortenedpermalink add_query="query" /></mt:setvarblock>
<mt:else>
<mt:setvarblock name="title"><mt:contentlabel remove_html="1" /></mt:setvarblock>
<mt:setvarblock name="link"><mt:contentshortenedpermalink add_query="query" /></mt:setvarblock>
</mt:if>
<mt:setvarblock name="link_len"><mt:var name="link" count_characters="1" /></mt:setvarblock>
<mt:setvar name="title_len" op="-" value="$link_len" /><mt:if name="link"><mt:setvar name="title_len" op="-" value="3" /></mt:if>
<mt:var name="title" trim_to="$title_len" /><mt:if name="link"> - <mt:var name="link" /></mt:if>

2行目から6行目で追加するクエリの内容となるハッシュ変数を定義しています。その後、MTEntryShortenedPermalinkタグにadd_queryモディファイアを用いて、短縮前のパーマリンクにクエリを追加しています。

トラブルシューティング

Twitterへの投稿が失敗する場合

Twitterへの投稿が失敗した場合、Movable Typeのシステムログを確認することで原因がわかることがあります。主要なログについてここで説明します。

PostTweet: 認証エラー
Twitterの認証に失敗しました。「アカウントの登録」を参照して、アカウントの設定をやり直してください。
PostTweet: Twitterへの投稿に失敗しました。(Status is a duplicate.(187) )
Twitterでは、一定時間の間に同一内容のツイートを投稿できないようになっています。このエラーがでている場合には直近で同一内容のツイートがないか確認してください。

ectoから投稿すると、異なるURLが連続投稿されてしまう

現象
ectoからブログ記事を投稿すると、Twitterに連続して2つのブログ記事が投稿され、1つ目に投稿されるブログ記事には正しくないURLが含まれてしまう。
原因

ブログ設定でパーマリンクがカテゴリーを含むように設定されている状況で、ectoからブログ記事を投稿すると発生します。現象が発生するとき、ectoとMovable Typeとの間では次のようなXML-RPCのやり取りが行われています。

  1. newPostメソッドでブログ記事を作成するが、公開(パブリッシュ)しない。
  2. setPostCategoriesメソッドでブログ記事にカテゴリーを設定する。
  3. editPostメソッドでブログ記事を公開(パブリッシュ)する。

プラグインでは、「公開(パブリッシュ)する/しない」という情報を取得できないため、1.および3.の時点でTwitterへ投稿します。1.の時点ではまだブログ記事に対してカテゴリーが設定されていないため、カテゴリーを含まないパーマリンクを短縮URLにして投稿します。3.の時点では既にカテゴリーが設定されていますので、カテゴリーを含んだパーマリンクを短縮URLにして投稿します。その結果、異なるURLを持つ2つのブログ記事としてTwitterへ現れてしまいます。

なお、パーマリンクにカテゴリーを含まず、日付を使用している場合には、この問題は発生しません。上記1.および3.の時点でTwitterへ2度投稿することに変わりありませんが、同一の内容を連続投稿してもTwitter側では無視されるようです。

回避策
次の手順に従って、newPostメソッドでTwitterへ投稿しないように設定します。
  1. ブログ/サイトのプラグイン設定画面(注意:システムのプラグイン設定画面ではありません)で PostTweet の設定を表示します。
    プラグイン設定画面1
  2. 「投稿」のチェックをはずし、「実験的なオプション」をチェックします。
    プラグイン設定画面10
  3. 「変更を保存」をクリックします。

ブログクライアントから投稿すると正しいURLが表示されない

現象
ブログクライアント(BlogWrite, ubicast Blogger等)からブログ記事を投稿すると、Twitterに正しいURLが表示されない。
原因

ブログ設定でパーマリンクがカテゴリーを含むように設定されている状況で、ブログクライアントの実装によって発生する場合があります。現象が発生する時、ブログクライアントとMovable Typeとの間では次のようなXML-RPCのやり取りが行われています。

  1. newPostメソッドでブログ記事を作成し、公開(パブリッシュ)する。
  2. setPostCategoriesメソッドでブログ記事にカテゴリーを設定する。
  3. publishPostメソッドでブログ記事を公開(パブリッシュ)する。

プラグインは、1.の時点でTwitterへ投稿しますが、まだブログ記事に対してカテゴリーが設定されていないため、カテゴリーを含まないパーマリンクを短縮URLにして投稿します。その後、2.および3.のメソッドが実行されたことをプラグイン側で知ることができないため、正しいURLをTwitterに投稿することができません。

なお、パーマリンクにカテゴリーを含まず、日付を使用している場合には、この問題は発生しません。上記1.および3.の時点でTwitterへ2度投稿することに変わりありませんが、同一の内容を連続投稿した場合、Twitter側では2回目以降の投稿をエラーとして扱うようです。

回避策
ectoから投稿すると、異なるURLが連続投稿されてしまう」の手順に従って、newPostメソッドでTwitterへ投稿しないように設定しておき、ブログクライアントから新規に投稿した後、再度同じブログ記事を編集、保存する、という手順と踏む以外に今のところ回避方法がありません。

更新履歴

ライセンス

本プラグインは、GNU GENERAL PUBLIC LICENSE Version 2と独自ライセンスのデュアルライセンスにて公開されます。

MTで使用する場合
無償で利用できます。ただし、著作権者の許可なく本プラグインを改変、再配布することはできません。
MTOSで使用する場合
GNU GENERAL PUBLIC LICENSE Version 2に従います。

連絡先

作者:M-Logic, Inc.