こんにちは、PHPエンジニアの金箱です。
まずはじめに、Twitterは140文字ではありません!!!
嘘だと思われる方は、Twitterアカウントを持っていればツイートボックスに以下の文字を入れてみてください。
何文字とカウントされましたか?
23文字とカウントされたはずです。
実際には199文字あります。
どうしてこうなってしまったのでしょうか?
実は、Twitterは特殊な条件のとき、1文字を1文字とカウントしないように出来ています。(←これだけ読むと意味が分かりませんね。)
URLも特殊な条件のうちのひとつです。
URLがどんなに長くても、”短くても”、22or23文字です。(なぜ「or」なのかはのちほど説明します)
”短くても”の場合は、例えばgoo.glの短縮ドメインは20文字に短縮されますが、Twitterでは22文字とカウントされます。
TwitterのAPIを作りたいようなエンジニアにとっては、とても困ったことが起こります。
「テキスト入力欄に文字を入力して送信ボタンを押すとツイートする」というプログラムを作ろうと思ったとします。
Twitterは140文字だからと思って、140文字で文字数制限をかけます。
すると、もれなくTwitterの文字数カウント方式とずれが発生してしまいます。あらかじめURLを含ませるツイートをさせるときなどは困りますね。
そこそこ腕の良いエンジニアなら「URLは23文字とカウントするように文字数制限をかければ良い」と考えるでしょう。
それは正しいアプローチです。
しかし、URL以外にもTwitterは特殊な条件を用意しているかもしれないという不安は残ります。
事実、URL以外にも特殊な条件が存在します。
困った。
実はTwitterが特殊な条件を公開しているページが存在します。(こちらが今回の処方箋です)
以下のURLです。
https://dev.twitter.com/docs/api/1.1/get/help/configuration
パッと見だと意味が分からないと思うので、
コメントを付けてみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
{ "characters_reserved_per_media": 23, // メディア(画像など)は23文字とカウントする "max_media_per_upload": 1, // 投稿につきメディアは1つまでです "non_username_paths": [ // ユーザーネームになり得ない単語一覧(予約語) ※例えば「@account」とツイートしてみてください。ユーザー名になりません "about", "account", "accounts", "activity", "all", "announcements", "anywhere", "api_rules", "api_terms", "apirules", "apps", "auth", "badges", "blog", "business", "buttons", "contacts", "devices", "direct_messages", "download", "downloads", "edit_announcements", "faq", "favorites", "find_sources", "find_users", "followers", "following", "friend_request", "friendrequest", "friends", "goodies", "help", "home", "im_account", "inbox", "invitations", "invite", "jobs", "list", "login", "logo", "logout", "me", "mentions", "messages", "mockview", "newtwitter", "notifications", "nudge", "oauth", "phoenix_search", "positions", "privacy", "public_timeline", "related_tweets", "replies", "retweeted_of_mine", "retweets", "retweets_by_others", "rules", "saved_searches", "search", "sent", "settings", "share", "signup", "signin", "similar_to", "statistics", "terms", "tos", "translate", "trends", "tweetbutton", "twttr", "update_discoverability", "users", "welcome", "who_to_follow", "widgets", "zendesk_auth", "media_signup" ], "photo_size_limit": 3145728, // 写真の最大ファイルサイズ(3MB) "photo_sizes": { //写真の最大縦横 "large": { "w": 1024, "resize": "fit", "h": 2048 }, "medium": { "w": 600, "resize": "fit", "h": 1200 }, "small": { "w": 340, "resize": "fit", "h": 480 }, "thumb": { "w": 150, "resize": "crop", "h": 150 } }, "short_url_length_https": 23, // httpsのURLは23文字とカウントする "short_url_length": 22 // httpのURLは22文字とカウントする } |
どうでしょうか?
これを信じればTwitterの文字数のバリデートは完璧です。
ちなみに、このconfigurationは時々変わります。
例えば以前URLは21or22文字でした。また、ユーザー名(@user_name)は22文字とカウントするみたいな制限もありました。(だからユーザー名の予約語がリスト化されてる)
前回はAPIが1.0→1.1になってしばらくしてから変わりました。頻繁に変わるわけではありません。
ですが、安定したサービスを提供したい場合には変更に注意しましょう。
TwitterやFacebookはドラスティックに仕様変更を行ってきます。
プラットフォームに依存しているサービスにとってはかなり迷惑ですが、
一方で、仕様変更はユーザーのために行われることがほとんどです。
サービスとしては仕様変更を嫌がらずに、むしろ歓迎するぐらいの気構えが必要です。
最近ではTwitterのダイレクトメッセージでURLを含む投稿ができなくなるという仕様変更がありました。
スパムに対抗する手段だとうわさされています。
ところが、 Yahoo!やGoogleなどのメジャーなドメインのURLは問題なく投稿できます。
弊社のサービスであるモニプラのURLもダイレクトメッセージで送ることができるようになっています。
(http://monipla.com や http://monipla.jp です。)
プラットフォームに依存するサービスは、プラットフォーマーと一緒にプラットフォームを育てようという心持でいるべきです。
しいては、プラットフォーマーと良好な関係を構築することにつながり、仕様変更にへの1つの処方箋となります。
アライドアーキテクツではプラットフォーマーとともにユーザーのことを真剣に考えたいエンジニアを募集しています。
こちらのサイトへアクセスしてください。
サービスのことを考えることと、グロースを考えることが大好きです。 どんどん世の中が便利になってうれしいです。 どうぞよろしくお願いします。