私は個人使用のための小さな Node.js アプリを作成しています。これは、匿名 API を使用して自分の Twitter アカウント (pic.twitter.com リンク) にアップロードされた写真をサイドロードし、pic.twitter.com リンクを新しく取得した imgur に置き換えます。ツイートをリンクしてディスクに保存します。これを行うコードは次のとおりです。
var
jsdom = require( 'jsdom' )
, request = require( 'request' )
, t_pic = /http:\/\/pic.twitter.com\/([a-z0-9]+)/gi;
function rehostImage( match ) {
request( match, function( e, r, b ) {
if ( e ) throw e;
jsdom.env(
{
html: b,
scripts: ['http://code.jquery.com/jquery-1.7.2.min.js']
},
function( err, window ) {
var $ = window.jQuery;
request.post(
'http://api.imgur.com/2/upload.json',
{
key: 'gh10z9DFZ009876E342dfsfd34234dszSD65XRV5',
image:$( '.twimg' ).find( 'img' ).attr( 'src' )
},
function( data ) {
return data.upload.links.original;
});
});
});
}
var tweets = [], i = 0;
/* code to GET twitter page using "request" goes here similar to rehostImage */
/* same jsdom boilerplate as in rehostImage function goes here to get
the jQuery handle on the page DOM. Once we get "$"... */
$( '.tweet-text' ).each( function() {
i++;
tweets[ i ] = $( this ).html();
if( tweets[i].match( t_pic ) ) { tweets[i].replace( t_pic, rehostImage ); }
});
コードがやろうとしていることは単純です。
- 私のツイッターページを取得します
- pic.twitter.com リンクの各ツイートを解析します。
- そのページを取得し、DOM をトラバースし、画像の URL を見つけて、anon API を介して imgur にアップロードします
問題は、regex replace heretweets[i].replace( t_pic, rehostImage )
です。replace
戻り値が一致した文字列を置き換えるために使用される 2 番目のパラメーターとして関数を受け取ります。この場合、アップロード後の最終的な imgur URLdata.upload.links.original
は、私のツイートの pic.twitter.com URL を置き換えてから、ローカル ディスクに保存します。
すべてがコールバックを介して非同期で行われている場合、正規表現の置換にrehostImage
戻るにはどうすればよいですか? data.upload.links.original
通常のアプローチは、最後の操作である正規表現の置き換えを実行し、後で実行できるコールバックとして渡すことですがdata.upload.links.original
、正規表現の置き換えがインラインで行われるため、ここでそのアプローチを適用する方法がわかりません。
ポインタはありますか?