Googleリンクの短縮を解除する


10

チャレンジ

有効なgoo.gl短縮リンクを指定して、元のURLを出力します。

goo.gl/qIwi3Nのようなものを与えるでしょうhttps://codegolf.stackexchange.com/。入力の場合https?://、最初にを置くか、のwww.前に置くかをgoo.gl選択できgoo.glます。また、URLの最後だけが必要な場合は、を取り除くように選択することもできます。末尾のスラッシュは、入力と出力のオプションです。したがって、入力は最終的に正規表現に一致し(https?://)?(www\.)?(goo\.gl/)?[A-Za-z0-9]+/?ます。出力のために、あなたが出力するか否かを選択することができhttps?://、出力するか否かwww.、および出力するか否か末尾にスラッシュ。ただし、I / Oフォーマットと一貫している必要があります

部分全体を含めるかどうかに一貫性がある限り、出力とhttps比較httpして一貫性を保つ必要はありません(ただし、入力について一貫性を保つ必要があります)https?://

テストケース

これらは、入力にno https://、no www.、末尾のスラッシュを付けずに記述されます。出力のyes https://、no www.、およびyes末尾のスラッシュ。

input -> output
goo.gl/HaE8Au -> https://codegolf.stackexchange.com/
goo.gl/IfZMwe -> https://stackoverflow.com/
goo.gl/JUdmxL -> https://chat.stackexchange.com/rooms/240/the-nineteenth-byte

仮定

  • 短縮リンクが別の短縮リンクを指さず、宛先サイトがステータスコード2xxorまたは4xx(リダイレクトなし)を返すと想定する場合があります。

ここにアクセスしてURLを入力すると、この逆の操作を適用できます:https : //goo.gl/


@HelkaHomba修正
Pavel

3
天気予報を出力するかどうかは違いを生みwww.ます。ほとんどの場合、それはそれが参照する同じサーバーです。たとえばhttp://pks.mpg.deを試してくださいhttp://www.pks.mpg.de。前者は解決できませんが、後者は解決できます。
Golar Ramblar 2017年

@StephenS完了、提案ありがとうございます。
HyperNeutrino 2017年

回答:


11

CJam、7バイト

lg'"/5=

テスト走行

$ alias cjam
alias cjam='java -jar ~/.local/share/cjam-0.6.5.jar'
$ cjam unshorten.cjam <<< goo.gl/HaE8Au; echo
https://codegolf.stackexchange.com/
$ cjam unshorten.cjam <<< goo.gl/IfZMwe; echo
https://stackoverflow.com/
$ cjam unshorten.cjam <<< goo.gl/JUdmxL; echo
https://chat.stackexchange.com/rooms/240/the-nineteenth-byte

使い方

lgSTDINから行を読み取り、そのURLにGET要求を出します。短縮URLは、CJamが従わない301リダイレクトを発行します。最初のテストケースでは、これは

<HTML>
<HEAD>
<TITLE>Moved Permanently</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Moved Permanently</H1>
The document has moved <A HREF="https://codegolf.stackexchange.com/">here</A>.
</BODY>
</HTML>

スタック上。最後に、'"/二重引用符で分割し5=、6番目のチャンクを取得します。出力は暗黙的です。


1
私は05AB1EとPythを試してみましたが、どちらも301に準拠しています:(
Erik the Outgolfer '13年

3

Python 2 +リクエスト、44バイト

from requests import*
print get(input()).url

requests.get(URL)指定されたURLにGETリクエストを発行します。応答オブジェクトのurlフィールドには、リダイレクト後の最終的なURLが含まれています。http://入力にはプロトコル(など)が必要であり、入力は引用符で囲まれている必要があります。


1
requestsは組み込みではないため、言語ヘッダーに追加する必要があります。
numbermaniac

1
lambda-3バイトの式を使用する
ovs

1
@numbermaniacおっと、そうです、私はそれがサードパーティのlibであることを忘れるよう要求することに慣れています。
Mego 2017年

2

バッシュ28 24バイト

curl -I $1|grep -oehtt.*

出力はWindowsスタイルの改行で終わります。これは許容できると思います。

テスト走行

$ bash unshorten.sh 2>&- goo.gl/HaE8Au
https://codegolf.stackexchange.com/
$ bash unshorten.sh 2>&- goo.gl/IfZMwe
https://stackoverflow.com/
$ bash unshorten.sh 2>&- goo.gl/JUdmxL
https://chat.stackexchange.com/rooms/240/the-nineteenth-byte

使い方

curl -IHEADリクエストを送信するため、指定されたURLのHTTPヘッダーのみをフェッチします。最初のテストケースでは、

HTTP/1.1 301 Moved Permanently
Content-Type: text/html; charset=UTF-8
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: Mon, 01 Jan 1990 00:00:00 GMT
Date: Sat, 13 May 2017 05:51:48 GMT
Location: https://codegolf.stackexchange.com/
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
Server: GSE
Transfer-Encoding: chunked
Accept-Ranges: none
Vary: Accept-Encoding

または類似。出力がにパイプされgrep -oehtt.*、指定の正規表現と一致したディスプレイ部分のみ、すなわち、ストリングHTTは、行の末尾文字の任意の量まで続きます。


これはどのように作動しますか?
アルジュン

説明を追加しました。
デニス

へへ、よく説明しました!その方法で私はすぐにbashを学びます:-D

これはワイルドカード拡張を実行するhtt.*ので、現在のディレクトリにそれと一致するファイルが存在しないと想定します。ほとんどの正規表現では、ファイルが一致する可能性は十分に小さいので、このサイトでは問題ないと思いますが、この場合、私はそうは思いません。Linuxカーネルのソースコードは、名前のファイルが含まれていますhtt.cし、htt.h例えば、。に変更してgrep -oehtt.*も、バイト数は増えませんが、問題が発生する可能性は大幅に低くなります。
hvd 2017年

@hvd通常、プログラムはそれ以外の場合は空のディレクトリで実行されると想定していますが、-oehtt.*信頼性を高めるための良い方法です。
デニス

2

PHP、36バイト

入力 https://

<?=substr(get_headers($argn)[7],10);

get_headers

Location: 最初に削除してはならない場合は25バイト

<?=get_headers($argn)[7];

GoogleがHTTPヘッダーを変更した場合、ここが安全なバージョンです

preg_match("#Location: \K.*#",join("\n",get_headers($argn)),$t);echo$t[0];

1

Python 2、43バイト

依存関係はなく、現在他のPythonの回答よりも短くなっています。肩をすくめる入力は一致する必要がありますhttps?://goo\.gl/.*?/?

lambda s:urlopen(s).url
from urllib import*

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.