まだプログラマーですが何か?

プログラマーネタ中心。たまに作成したウェブサービス関連の話も https://twitter.com/dotnsf

タグ:twitter

マンホール蓋の位置情報付きポータルサイトであるマンホールマップは、Twitter の OAuth ログインによってユーザー認証を行い、ログイン後にマンホール画像を投稿できる機能が有効になります。が、ログインしなくても投稿済み情報を参照できるようになっています。


この参照できる情報には投稿されたマンホール画像やその位置情報(地図)だけでなく、投稿者の情報も含まれています。投稿者の名前だけでなく、Twitter アイコン(プロフィール画像)も表示されます:
2020060401



【起こった問題】
正確にはどのタイミングからだったのかわからないのですが、先日からマンホールマップにこの Twitter アイコンが表示されなくなる、という現象が起こっていました。


マンホールマップ側に変更がない状況で表示されていたものが表示されなくなった。ということは Twitter で何かあった?一時的な障害であることを祈っていたのですが1日経過しても状況は変わりませんでした。もしかして Twitter API が変更になったのかなあ、、という可能性も考えたのですが、明確なアナウンス類を見つけることができませんでした。ただ 2019 年に発表されたこの変更予告を見逃していて、もしかしたら今年の5月末くらいに実装からも外れて・・・みたいな感じで関係あったのかなあ(未確認)・・・という感じ:
https://twittercommunity.com/t/upcoming-changes-to-user-object-and-get-users-suggestions-endpoints/124732/2

2020060404



これまでのマンホールマップでの Twitter アイコン取得方法と同じ方法(後述)を解説していたこちらのページの中でも画像が表示されているべき(と思われる)箇所の画像が表示されていません。つまりマンホールマップにだけ発生している現象というわけではなく、このページでも自分と同じ現象が起こっているように感じました:
Twitter APIで取得したプロフィール画像のサイズを変更する


(↓この部分、本来は画像が表示されている??)
2020060403



ともあれ詳しい状況はわからないままですが、表示されなくなった Twitter アイコンを復活させるべく行った緊急対応の顛末を記録しておきます。結論として現時点(2020/06/04)で応急処置的にアイコンが表示されるよう復活しています。



【これまでの Twitter アイコン取得方法】
もう公式ドキュメントには記載されておらず、どこにこの方法について言及したドキュメントがあったのかも覚えてないのですが、これまでは以下のように HTTP API を2回使って Twitter アイコン画像の URL を取得していました:

(1)GET https://twitter.com/screen_name/profile_image にアクセス(screen_name 部はアイコンを表示したい人の Twitter アカウントの表示名※)
(2)(1)の結果得られる JSON オブジェクトから request.path の値を取り出す( "/12345/67890.jpg" みたいな値が取り出される)。
(3)HTML で <img src="https://pbs.twitter.com(request.path の値)"/> などのようにするとアイコン画像が表示できる


※Twitter アカウントの表示名とは、アカウントのページを開いた時のこの部分(赤枠)のことです:
2020060402



これまでのマンホールマップではこの方法で投稿者の Twitter アイコン画像を表示していました。上述の「ここでも自分と同じ現象が起こっている・・・」と書いたリンク先でも同じ手法が紹介されていますが、マンホールマップ同様に表示できなくなっているようでした。

調査した結果を記載しておくと、上述の方法で(1)と(2)は結果を得ることができているのですが、(3)で指定する URL にブラウザでアクセスすると 404 エラー(存在しない URL)となりました:
2020060402


ただ、では(1)と(2)が成功しているのかというと、どうも怪しいと思っています。(1)を実行した結果得られる(2)の値は以前は実行するまで推測できないパス名だったのですが、いま実行すると '/screen_name/profile_image' という結果となりました(つまり(1)を実行した時のパスがそのまま返ってくる)。この時点で以前のアイコンが正しく表示出来ていた頃とは結果が異なっているので、もしかすると(1)が以前のように動かなくなっていることが、アイコンが表示されない直接の原因なのかもしれない、、と推測しています。


いずれにしても、この API はもう使えなくなっちゃったのかな・・・ 結論として後述の応急手当的な対応はできたのですが、正直、今でもこの方法に戻せるなら戻して使いたいと思っています。理由も含めて後述します。


【現時点での正攻法(Twitter API を使う方法)】
上で紹介した方法以外に、(ちゃんと)Twitter API ドキュメントで紹介されている方法を使ってアイコン画像を取得する(正攻法的な)方法もあります。逆にいうと上述の方法は現在の Twitter API ドキュメントを探しても見つからない、ある種の「裏ワザ」的な方法だったりします(苦笑)。

正攻法というのは、具体的には GET /users/show API を使う方法です:
https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-users-show

2020060403


この API を実行する際のパラメータでアイコンを取得するユーザーの screen_name を指定します。すると指定したユーザーの情報を得ることができ、その中にはプロフィール画像(アイコン)の URL が含まれているので、その値を使うことでアイコン画像を表示することができる、というものです。


【正攻法(Twitter API を使う方法)では駄目な理由】
しかしこの方法はマンホールマップでの実装には向かない大きな理由があります。それはこの API はアクセストークンを使って実行する必要があるのですが、ユーザーがログインしていないとアクセストークンが取得できないのです。つまりユーザーがログインする前や、そもそもログインしないユーザーからするとアクセストークンを取得するタイミングがないので、この API を使うことが出来ず、アイコンを表示できないのでした。

マンホールマップは上述のようにログインしなくても参照できることを謳ってきていた背景もあり、Twitter 側に仕様変更があったとしても、急にマンホールマップにもログインを必須にすることに抵抗を感じてしまいました。。 そんな背景もあり、この正攻法での方法は採用していません。


【応急処置による現在の Twitter アイコン取得方法】
で、結論としてはこの方法を採用しているのですが、では改めてユーザーのログインなしにどうやって Twitter アイコンを取得しているか、を紹介します。あくまで応急手当的な内容であり、実行効率はよくない(のでできれば早く修正したい)ことを自覚している方法であることをご了承ください。

実現方法を簡単に言うと「Twitter にログイン済みの別プロセスを使って API を実行する」方法です。以下でもう少し詳しく紹介しますが、その前に twurl というコマンドラインツールを紹介します。
https://github.com/twitter/twurl

2020060404



twurl (読み方わからず・・)は Twitter 謹製の Twitter API 専用 curl といった位置づけのオープンソース製品です。各種 Twitter API を必要であればパラメータを付けてコマンドラインから実行し、その結果を標準出力に取り出すことができます。このツールも実行前に OAuth によるログインが必要ですが、ログインを1度実行しておけば、そのあとの API 実行は続けて行うことができます。標準の curl でも Twitter API を実行することは可能ですが、パラメータとして与える署名の計算が毎回面倒だったりするわけです。一方 twurl を使うとそのあたりは裏でバッチリやってくれるらしく、必要最小限のパラメータだけを渡して実行することができる、というものです。

例えば上述した正攻法による API で紹介した GET /users/show API を使ってユーザー情報を取得する場合であれば、セットアップ後にこういったコマンドを実行します(curl と同様ですが、"-X GET" は既定値なので省略可能です):
$ twurl -X GET /1.1/users/show.json?screen_name=dotnsf

これで screen_name が dotnsf(僕のアカウントです)であるユーザーの情報を取得することができます。結果は JSON で得ることができますが、この中の "profile_image_url_https" キーの値がそのユーザーの Twitter アイコン画像を表示するための URL 、ということになります:
$ twurl -X GET /1.1/users/show.json?screen_name=dotnsf
{
  "id": XXXX....,
  "id_str": "XXXX....",
    :
  "profile_image_url_https": "https://pbs.twitter.com/AAAAAAAA/BBBBB.jpg",
    :
}

この値が目的の URL 文字列です。したがって twurl コマンドを使うと目的の文字列を取得することができることがわかりました。


で、今回の API 代替方法というのは、この twurl を外部プロセスで実行して対象 Twitter ユーザーのアイコン画像の URL を取り出し、この URL を使ってアイコンを表示する、という方法です。外部プロセスを使うのがちとダサいのですが、一方でこの方法なら Node.js 実行前に twurl のセットアップを済ませておけば、Twitter API 実行のためのウェブアプリケーション側でのログインは不要となるので、参照目的のユーザーであっても(ログインしなくても)アイコンが表示される、ということが実現できるようになります。

マンホールマップのソースコードは現時点においては非公開ですが、この該当部分だけを別アプリケーションにして github で公開しています:
https://github.com/dotnsf/twurl


このアプリケーションは上述の twurl を別プロセスで動かして目的の URL を取得する、という内容を Node.js で実現するサンプルです。おそらく他のプログラミング言語であっても(外部コマンドを実行して、その結果を取得する機能があれば)実現できると思っています。

サンプルアプリの使い方ですが、まずアプリケーションを実行する前に twurl をセットアップする必要があります。詳しくは twurl の github 内にも記載されていますが、一応こちらでも(日本語で)以下に紹介します。

まず twurl は Ruby Gem を使ってインストールします。そのため Ruby(& Gem) 環境が必要です。Ruby がインストールされていない環境の場合はインストールしておきましょう。 Ubuntu 環境下であればこんな感じで:
$ sudo apt-get install ruby

Ruby Gem が導入されている環境で、以下のコマンドを実行すると twurl が導入されます:
$ sudo gem install twurl

これで(Ubuntu であれば /usr/local/bin/twurl として)twurl がインストールされました。次に twurl のセットアップが必要です。Twitter Developers にアプリを登録し、Consumer Key と Consumer Secret を取得した上で以下のコマンドを実行します:
$ twurl authorize --consumer-key (Consumer Key) --consumer-secret (Consumer Secret)

このコマンドを実行すると「この URL を開け」という指示が表示されます。その URL をブラウザで開くと認証用の文字列が表示され、それと同じ内容を実行中の twurl コマンドの入力待ちプロンプトに打ち込んで Enter キーを押します。正しい文字列が指定されていれば認証が完了し、twurl コマンドが使えるようになります。試しに上述の GET /users/show コマンドを実行するなどしてみてください:
$ twurl /users/show?screen_name=dotnsf
(screen_name が dotnsf であるユーザーのプロフィール情報が表示されます)

これで twurl を実行する準備が整いました。あとは Node.js のアプリケーションからこのコマンドを外部呼び出しで実行し、その結果を取得・解析してプロフィール画像の URL へリダイレクトさせることで目的の機能が実現できそうです。


twurl のセットアップができた所で、改めてこのサンプルアプリケーションを動かしてみます:
https://github.com/dotnsf/twurl


このサンプルアプリケーションの app.js ファイルは以下のようになっています:
//.  app.js
var express = require( 'express' ),
    app = express();
var { execSync } = require( 'child_process' );
var settings = require( './settings' );

app.get( '/', function( req, res ){
  var screen_name = req.query.screen_name;
  if( screen_name ){
    try{
      var stdout = execSync( settings.twurl_command + ' /1.1/users/show.json?screen_name=' + screen_name );
      var obj = JSON.parse( stdout.toString() );
      var profile_image_url_https = obj.profile_image_url_https;
      res.redirect( profile_image_url_https );
    }catch( e ){
      return res.status( 403 ).send( { status: false, error: e } );
    }
  }else{
    return res.status( 403 ).send( { status: false, error: 'No screen_name provided.' } );
  }
});

var port = process.env.PORT || 8080;
app.listen( port );
console.log( "server starting on " + port + " ..." );

そして別ファイルである settings.js は以下のような設定にしています:
//. settings.js
exports.twurl_command = '/usr/local/bin/twurl';


簡単に解説しておくと、GET / をハンドルする API だけが定義されています。そしてこの API では screen_name というパラメータを受け取って、
$ /usr/local/bin/twurl /users/show.json?screen_name=(パラメータの値)

を同期的に実行し(twurl のパスは settings.js 内に記載)、実行結果が stdout 変数に格納されます。そして格納された結果を JSON パースした上で "profile_image_url_https" の値を取り出して、その URL にリダイレクトする、という処理を行っています。 これによってパラメータで指定した screen_name を持つ Twitter ユーザーのプロフィールアイコン画像を表示する、という処理を実現しています。

実際にサンプルアプリケーションを動かして、ブラウザで http://localhost:8080/?screen_name=dotnsf を実行した結果がこちらです:
2020060401


http://localhost:8080/?screen_name=dotnsf にアクセスすると、twurl の実行結果に含まれる URL に転送され、screen_name パラメータで指定した Twitter ユーザー(この場合であれば @dotnsf)のプロフィールアイコン画像が表示できました。twurl のセットアップ時に consumer_key と consumer_secret を指定してはいますが、そのあとのアプリケーション実行時には Twitter の OAuth ログインなしに Twitter API を実行して結果を取得することができています。

実用上においては、Twitter アイコンを表示するたびに twurl を使うこの一連の処理を実行するのは重すぎるので、一度取得した結果をキャッシュしておくなどの対処が必要になると思っています。ただこのやりかたで一応、挙動としては最低限の目的を達成することができました。

というわけで、無事にマンホールマップで投稿者の Twitter アイコンは応急処置的に復活できています:
2020060405


以前にも似たようなものを何度か作ったことがあったのですが、その最新改良作品です。 ツイッターでのつぶやき内容を元に自分の性格を分析して、その内容が時間とともにどのように変化していくか、を視覚化するというものです。

実際に自分の3月21日時点でのツイートを元にためしてみた結果がこちらです。なお現時点でスマホで表示する場合はレイアイトが最適化されていないため画面を横にして御覧ください:
https://personality-transition.mybluemix.net/transition/6f24cd50fa6f528cdd3162aadb716b03

2020032101


画面は最上部にシェア用のアイコンが並んだ下に性格を分析した本人の twitter アイコンと名前が表示され、その下に IBM Watson Personality Insights API を使った分析結果の「性格分析」と「消費行動動向」が表示されます(「消費行動動向は初期状態では省略表示されているので、内容を表示するには三角形部分をクリック(タップ)してください)。

性格分析はビッグ5と呼ばれる5つの性格要素(知的好奇心、誠実性、外向性、協調性、感情起伏)に加え、ニーズ(共感を呼ぶ度合い)&価値(意思決定に影響を及ぼす要素)という7つのカテゴリを更に細分化した結果がレーダーチャートで表示されます:
2020032102


また消費行動動向はその性格から結びつく消費行動の度合いが表示されます(色の濃い方がその要素が高く、薄い方が低い、という意味です):
2020032103


画面最下部にはスライダーが表示されています。初期状態では一番右にセットされていて、これは時間的に一番新しい分析結果が表示されていることを意味します:
2020032104


このスライダーを左に移動していくと少しずつ前の(古い)性格分析結果や消費行動動向が表示されていきます。自分の性格が時間とともにどのように変化していったのか/変わらない要素は何か といった内容がわかるようになる、というものです:
2020032105


このページの画面右上のリンクから皆さんのツイートでも試すことができます。興味ある方はぜひ挑戦してみて、よろしければその結果を SNS でシェアしてみてください:
https://personality-transition.mybluemix.net/transition/6f24cd50fa6f528cdd3162aadb716b03



以下、このサービスを実現する上での技術要素の説明です。なおソースコードは公開していますので興味ある方はこちらも参照ください。なお IBM Cloud を使って動かす想定のコードとなっており、後述の IBM Watson やデータベース機能含めて無料のライトアカウントの範囲内でもデプロイ可能な内容となっています:
https://github.com/dotnsf/personality_transition


このサービスは Node.js で実装していますが、サービスを実現する上で利用しているライブラリは大きく3つです。1つ目は Twitter のログイン認可を実現するための OAuth 、2つ目は認可したユーザーのツイートを取得するための Twitter API 、そして3つ目は取得したツイート内容から性格分析を行う IBM Watson Personality Insights API です。

なお、ここで使っている IBM Watson Personality Insights は IBM Cloud から提供されている IBM Watson API の1つで、テキストの内容を使用単語レベルで分析し、そのテキストを記述した人の性格や、その性格毎の購買傾向を取得する、という便利な API です。日本語を含む5ヶ国語に対応しています。詳しくはこちらも参照ください:
https://www.ibm.com/watson/jp-ja/developercloud/personality-insights.html


おおまかな処理の流れとしては、まず OAuth2 で Twitter にログインしてもらうことで、そのユーザーの権限で Twitter が操作できるよう認可します。そして Twitter API でユーザーのタイムライン内容を取得します。 この時に直近の 200 ツイートを取得します。この 200 件のツイートを投稿時刻の順に 40 件ずつ5つのブロックにわけます。そして各ブロック毎のツイート内容をそれぞれまとめて IBM Watson Personality Insights API を使って性格分析を行います(つまり1回の処理で Twitter のタイムライン取得 API を1回、IBM Watson Personality Insights API を5回実行します)。このようにすることでツイートの内容を時間で区切って直近のものから少しずつ時間を遡りながら5回ぶんの性格分析を行い、その結果を上述のようにスライダーバーで時間ごとに表示/非表示を切り替えることで実現しています。

機能的にはこれだけでもできるのですが、このサービスでは「分析結果をシェア」できるようにしました。シェアするためには(シェアされた人はツイートを取得せずに分析結果を見ることができる必要があるため)分析した結果をデータベースに格納する必要があるため、データベースも併用しています(あくまで分析結果を保存するためのもので、ツイート内容は保存していません)。

また上述のような仕様であるため、仮に Twitter 上で非公開アカウントとしているアカウントに対しても(本人の権限でツイートを取得することになるので)性格分析を行ったり、その結果をシェアすることができます(公開許可されていない人や、そもそも Twitter アカウントを持っていない人でも分析結果を見ることができます)。ただしあくまで分析結果だけがシェアされるのであって、ツイート内容がシェアされるわけではない点はご安心を。


このデモサービスでは Twitter のツイートを元に性格分析を行っていますが、必ずしも分析元はツイートである必要はありません。1人の人が書いた文章であればよいので、メールなり、社内掲示板なりからテキストを取得することができるのであれば理論上は可能です。ただし1回の性格分析におけるテキストの単語数が少ないと充分な精度がでない結果となることも考えられます。ある程度の単語数が含まれるテキストを取得できる必要があります(このサービスでは上述のように 40 ツイートぶんのテキスト内容をひとまとめにして分析しています)。

また IBM Watson Personality Insights API の特徴でもあるのですが、単にテキスト内容とその単語傾向から性格を分析するだけでなく、購買行動への傾向と合わせた実行結果を得ることができます。つまりまだ何も買っていないユーザーに対してでも、その購買傾向を調べた上でレコメンドを出したり、特定興味分野の広告を出したりする、といった使い方にも応用ができるもので、特に今回のデモではその時間変化にも着目できるようにしています。応用の幅が非常に大きな API であると考えていて、その一部が伝わればいいと思っています。

 

2017年のマンホール界(?)は、マンホールサミットマンホールナイトといった、定番となったイベントだけでなく、各種メディアでの紹介やグッズの発売など、例年以上に盛り上がった・・・いや盛り下がった感があります(マンホールだけに)。

そんなマンホールの盛り下がりの様子をウェブマーケティング的に、具体的にはグーグルトレンドツイッターを使って1年間の経緯を調べてみました。なんとなく「グーグルトレンドの使い方」みたいな内容になっています(苦笑)が、まあ専門分野ではないということでご容赦ください:


まずは単純に「マンホール」が検索された回数の推移をグーグルトレンドで調べたみたらこんな感じでした:
2017122401


年末の山は 12/3 の週で、これはまさに「マツコの知らない世界」でマンホールが取り上げられたタイミングと一致しています。テレビメディアの影響の大きさを改めて感じますねー。

で、問題はその時をも上回る 4/30 週のトレンドスパイクです。このタイミングはマンホールサミットやマンホールナイトではないし、韓国ドラマ「マンホール」の放映にもまだ早い時期です。ではこのタイミングで「マンホール」が多く検索された理由は一体・・・

というわけで、この期間を更に詳しく調べてみました。5/3 にスパイクがあるのか・・・
2017122402


そして、この期間の関連キーワードを見ると「マンホール カード」となっていました:
2017122403


マンホールカードの発表や配布のタイミングではなかったはずなのですが、マンホールカードの検索回数が急上昇した日だったようです。「マンホール」と「マンホールカード」の検索トレンドを調べてもほぼ一致しているように見えます・・・:
2017122404


改めて5月3日周辺の「マンホール」または「マンホールカード」が検索された記録をツイッターなどで調べて(※)、、、やっと原因がわかりました! この日、フジテレビの「情報プレゼンター とくダネ!」で市川市のマンホールカードが配布された様子が特集された放送されたいたようです:
「情報プレゼンター とくダネ!」 2017年5月3日(水)放送内容


そしてその結果が上記の検索スパイク、となったようでした。朝の情報番組、恐るべし!


※ちなみに、ツイッターで期間を指定して検索するには、公式ページの検索ボックス内に
since:2017-04-30 until:2017-05-07 マンホールカード
のように指定して検索すると実現できます。ちなみに上記例は 2017-04-30 ~ 2017-05-06 内に「マンホールカード」がツイートされた様子を検索しています。since の日付は指定日を含み、until の日付は指定日を含まないようです。


とりあえず、こんな感じでグーグルトレンドツイッターの検索機能を使って簡単にキーワードの検索トレンドを調べることができます。年の瀬にちょっとしたウェブマーケティングの勉強も兼ねて、皆さんが興味ある物事や、出来事、イベントなどの1年間のトレンドとその背景を調べてみてはいかがでしょう?

このブログでも紹介させていただいたのですが、最近「手書きイラストから『いらすとや』のイラストを検索するアプリ」を作りました:
手書きイラストで「いらすとや」のイラストを検索する




この時の技術を応用して、「ツイッターに手書きイラストを添付してつぶやく」ことができる「イラツイ」というアプリを作って、UI/UX とかまだ全然ダメダメですがとりあえず動くようになったのと、自分が使っていて面白かった(大事)ので公開してみました:
http://iratwi.mybluemix.net/


PC のブラウザからも(マウスやタッチパッドで)使えるつもりですが、一応スマホブラウザからの利用を想定して画面を最適化しています。PC やスマホのウェブブラウザで上記の URL (http://iratwi.mybluemix.net/) にアクセスすると、こんな↓画面になります。画面左上の "t" マークをクリックして、ご自身の Twitter ID でログインしてください:
IMG_0745


↓こんな感じの画面になったら(左上が自分の Twitter アイコンになったら)ログイン成功です。画面は「イラツイ」と「一覧」という2つのタブから構成されています。デフォルトの「イラツイ」でキャンバス(画面中央の白い部分)にマウスや指などでイラストを手書きしてください。線の色や太さはキャンバスの上から選択できます:
IMG_0746


例えば試しにこんな感じのを書いてみました。このイラストをツイートするには画面下部の "Tweet" をクリックします:
IMG_0742


するとツイートメッセージを入力する画面が表示されます。ここに適当にメッセージを入力して、「ツイート」ボタンで投稿します:
IMG_0743



「一覧」タブに切り替えると、自分のツイートした内容が新しい順に表示されます。先程ツイートしたスマホのも無事投稿できたようです(この画面をもう少し有効活用したいなあ、とは思ってます):
IMG_0744


実際のツイッタークライアントからも投稿されていることが確認できます:
2017051401


と、まあこんなシンプルな感じです。小さな集まりの中で画力対決みたいな企画を開く際にも(ハッシュタグを統一しておけば)簡単に集計できるし、意外と使えるかな、、と評価しています。自分自身は「絵心ないエンジニア」ですが、落書きは嫌いじゃないので、意外と楽しんで使えそうです(自信作の「宇宙選択ヤマト」です):
2017051400


今回はツイッタークライアントとして作りましたが、実用面を考慮すると LINE とかのほうが使われる機会多そうかなあ、とか、インスタとはユーザー層が違いそうだなあ、、とか考えてます。 まだ「とりあえず動く」レベルで公開しただけなので、使っていただける皆さんからの要望などあればいただきたいです。


マンホールマップに「スマホからもっと簡単に投稿できるようにしたい」という要望に応える新機能を用意しました。具体的には Twitter から投稿可能にしました。というわけで、以下の機能を使う前提として、スマホに Twitter アプリが導入されている必要があります。


また、この機能を使うには、Twitter で @Manholemap_Bot をフォローしてください( #manhotalk_bot と似ていてややこしいですが間違えないでくださいw)。この機能のために作成した新しいボットのアカウントです:
2017030801


試しに三鷹のこのマンホールを投稿してみることにします。この画像がスマホの中に保存されているものとします:
mitaka


お持ちの各種スマホ(やPC)から、フォローした上記アカウントへのメンションでマンホール画像を送付してください。メンションとはメッセージの頭に @Manholemap_Bot (大文字小文字は区別しないので、全て小文字でもOKです)を付けて、画像を添付して投稿してください:
IMG_0365


基本的にスマホ側での作業はこれだけで投稿できます。以下はPCでの作業を想定しています。少し(最大5分)待つと、投稿した画像がマンホールマップに反映されます:
2017030802


投稿した本人(と同じ Twitter アカウントでログインした状態)がその画像ページにアクセスした場合は編集ボタンが表示され、投稿の編集が可能になります:
2017030803


位置やテキストなど、必要に応じて編集して、最後に「更新」します:
2017030804


残念ながらまだいくつかの制約事項があります:
(1) テキストを同時にツイートできない
(2) 元の画像に位置情報が含まれていても反映されない(Twitter の仕様)

色々調査しながらにはなりますが、今後のアップデートで少しずつ便利にしていくつもりです。


なお、この機能はアプリケーション開発者向けに公開しているマンホールマップ API を使って作成したものです。誰でも使えるものなので、興味をお持ちの方はこちらから仕様書をどうぞ:
http://manholemap.juge.me/dev.jsp



このページのトップヘ