はじめに
yukiと申します。DMMWEBCAMP にお世話になって、今は WEB エンジニアとして勤務しつつ、自分で仲間を集めてサービス開発したり、プログラミングの家庭教師したり毎日エンジニアライフをエンジョイしています。
未経験から目指している方向けのサポートやエラー質問なども引き受けておりますので、気になった方は DM へお願いします。
前提と問題
RailsをAPIとして活用していて、gem twitter
を使って画像収集をしていた際に問題が起こりました。
twitter APIが取得してくる画像のURIがhttp
から始まっており、せっかくhttps通信ができているサイトに「安全ではありません」の警告が出てしまいました。
ちなみに、その時コンソールにはこんなエラーが出ていました。
Mixed Content: The page at 'https://hogehoge.com' was loaded over HTTPS, but requested an insecure image 'http://hogehoge.net/hoge.jpg. This content should also be served over HTTPS.
mixed contentとか言うらしいです。
最初は今回まとめる方法が思いつかず、フロントの方で何とかしていましたが、本来バックでやるべきなので修正しました。
対策
def show
client = Authorization.init # 独自クラスです。クライアントの情報を入れています。
@data = client.search("#収集したいハッシュタグ", result_type: "recent").take(4).collect do |tweet|
{
"image": "#{tweet.user.profile_image_url.to_s.sub('http', 'https')}",
"name": "#{tweet.user.name}",
"text": "#{tweet.full_text}",
"tweet_link": "#{tweet.uri}"
}
end
render json: {tweet: @data}
end
何をしているか一応ご説明すると、特定のハッシュタグのついたツイートを4件収集し、jsonデータとして返しています。
今回重要なのは"image": "#{tweet.user.profile_image_url.to_s.sub('http', 'https')}",
の部分です。
これは他のエンジニアの方に教えていただいたのですが、rails consoleでuser.profile_image_url
を見てみると、ちょっとよくわからないデータの形(?)で結果が返りますが、to_sすることで綺麗なURLになりました。
そこに、subメソッドを当てて変換している感じです。
注意としてはgsubではなくsubを使っていることです。
理由としては、万が一画像のURLの一部(先頭以外)に"http"と言う文字列があった場合に誤変換して、画像が表示されなくなってしまうからです。
誰かの参考になれば幸いです。