torinaブログ

DjangoとBootstrap4で作成したブログ
Python, Django, Kivy, Bootstrap, Apache等のメモです
ソースコード

下位20%のダメなエンジニアにだけ解けないパズル?

Python PythonHTTP
2016年1月6日11:18
http://tango-ruby.hatenablog.com/entry/2015/12/28/212010
http://challenge-your-limits2.herokuapp.com/

今回もPython3+requestsモジュールでやっていきます
ネタバレ控えてねってかかれてたけど、自分用のメモとして使います。すみません
決して、グーグルアナリティクスで前回の記事だけアクセス多かったからとか、そういう訳ではございません

Hack Me If You Can
call/my/APIs
とあるので、さっそくやっていきます。

>>> import requests
>>> url = "http://challenge-your-limits2.herokuapp.com/call/my/APIs"
>>> res = requests.get(url)
>>> res.text
'{"error":"Ok. Let\'s get started! End Point is correct. But HTTP Method should be..."}'
>>>


URLはあってるけど、メソッドが違うようです。GETじゃあ、ない
前回GETかPOSTが主です、って書きました。POSTでやってみましょう


>>> res = requests.post(url)
>>> res.text
'{"error":"Nope. Keep trying. End Point is correct"}'



あれ、POSTも違うっぽい。
メソッドの一覧は
http://www.cresc.co.jp/tech/java/Servlet_Tutorial/Att_02.htm
なんかで見てみましょう
requestsは大体対応してます


PUTがどうも惜しいようです。はじめて使いました
>>> res = requests.put(url)
>>> res.text
'{"error":"Very close. Keep trying. As I said, End Point is correct"}'



正解はDELETEでした
Surprised?ええ、びっくりりました
>>> res = requests.delete(url)
>>> res.text
'{"message":"Well done! haha! Surprised? Yeah, the answer was DELETE. Ok. Next === /c2_users/:id/hacker_apply"}'



/c2_users/:id/hacker_apply
と見たとき、:idにはそれぞれのidが入りそうなのは直感的にわかりますね
とりあえず、素直にそのまま入力しましょう
>>> url = "http://challenge-your-limits2.herokuapp.com/c2_users/:id/hacker_apply"
>>> res = requests.get(url)
>>> res.text
'{"error":"Please authenticate using Basic Auth with your username and password. You want a clue? Shout out \'help/me/out\'"}'



Basic認証で来い、といっていますね
手がかりがほしければhelp/me/out、ともいっています
さっそくいきましょう
>>> url = "http://challenge-your-limits2.herokuapp.com/help/me/out"
>>> res = requests.get(url)
>>> res.text
'{"message":"By the way, Have you already registered? This is the clue only for REGISTERED user. You should have your id befor
e you check the clue. If you don\'t, go to /c2_users/ and register. Hey, Registered users! Here you go. === bit.ly/1T8gVdG ===
 You don\'t know about \'bit.ly\'? Google it!"}'




前は/c2_users/にアクセスしろなんていうヒントはなかったんじゃないかなぁ。クレームでもあったんでしょうか

他にヒントがないときには
/c2_users/1/hacker_apply
/c2_users/hacker_apply
/c2_users
なんていうのも試してみていいかなと思います


>>> url = "http://challenge-your-limits2.herokuapp.com/c2_users"
>>> res = requests.get(url)
>>> res.text
'{"error":"GET? No. No."}'



これはもう見飽きたメッセージですね。POSTも試しましょう
:usernameは空白にするなといわれます。ははーん、これは前回のパティーンですね
>>> res = requests.post(url)
>>> res.text
'{"error":"Validation Error - [:username, \"can\'t be blank\"]"}'



結果、以下のようになりました
>>> d = {
...     "username":"torinasan",
...     "email":"toritoritorina@gmail.com",
... }
>>> res = requests.post(url,data=d)
>>> res.text
'{"id":1232,"username":"torinasan","email":"toritoritorina@gmail.com","password":"yp2Ce1W1rxwNTBW1","comment":null,"created_at
":"2016-01-22T20:34:11.233Z","updated_at":"2016-01-22T20:34:11.233Z"}'



こいつを使って、さっそくさっきのURLへいきましょう
>>> url = "http://challenge-your-limits2.herokuapp.com/c2_users/1232/hacker_apply"
>>> res = requests.get(url)
>>> res.text
'{"error":"Please authenticate using Basic Auth with your username and password. You want a clue? Shout out \'help/me/out\'"}'



Basic認証でしたね。わすれてました
では、requestsでBasic認証の方法です。非常に単純です
>>> res = requests.get(url, auth=("torinasan","yp2Ce1W1rxwNTBW1"))
>>> res.text
'{"message":"Awesome! Can you come over here? === R29vZCBqb2IhISBQbGVhc2UgYWNjZXNzIHRvIHRoZSB1cmwgZnJvbSB5b3VyIHdlYiBicm93c2Vy
LiA9PT0gaHR0cDovL2NoYWxsZW5nZS15b3VyLWxpbWl0czIuaGVyb2t1YXBwLmNvbS93aW5uZXJfY29tbWVudHMvUTBOc1pFcjVkaVJEcFlxMg==   You want a
clue? Shout out \'give me a clue\'"}'



書き方は
requests.get(url, auth=(id, pw))

となります。シンプルですね

Can you come over hereのあとに、不思議な文字列がありますね
手がかりをもらいましょう
>>> url = "http://challenge-your-limits2.herokuapp.com/give/me/a/clue"
>>> res = requests.get(url)
>>> res.text
'{"error":"Don\'t forget to say \'please\'"}'
>>> url = "http://challenge-your-limits2.herokuapp.com/please/give/me/a/clue"
>>> res = requests.get(url)
>>> res.text
'{"message":"Here you go === bit.ly/1MWLnZr === You don\'t know about \'bit.ly\'? Google it!"}'



http://bit.ly/1MWLnZr
ページはbase64についてでした
不思議な文字列はbase64エンコードされていて、デコードが必要なのですね
PythonでもBase64デコードは非常に簡単にできます、やってみましょう

まず不思議な文字列を取り出します
インタラクティブシェルなので、もたもたしております
>>> url = "http://challenge-your-limits2.herokuapp.com/c2_users/1232/hacker_apply"
>>> res = requests.get(url, auth=("torinasan","yp2Ce1W1rxwNTBW1"))
>>> res.text
'{"message":"Awesome! Can you come over here? === R29vZCBqb2IhISBQbGVhc2UgYWNjZXNzIHRvIHRoZSB1cmwgZnJvbSB5b3VyIHdlYiBicm93c2Vy
LiA9PT0gaHR0cDovL2NoYWxsZW5nZS15b3VyLWxpbWl0czIuaGVyb2t1YXBwLmNvbS93aW5uZXJfY29tbWVudHMvUTBOc1pFcjVkaVJEcFlxMg==   You want a
clue? Shout out \'give me a clue\'"}'
>>> import json
>>> data = json.loads(res.text)
>>> data
{'message': "Awesome! Can you come over here? === R29vZCBqb2IhISBQbGVhc2UgYWNjZXNzIHRvIHRoZSB1cmwgZnJvbSB5b3VyIHdlYiBicm93c2Vy
LiA9PT0gaHR0cDovL2NoYWxsZW5nZS15b3VyLWxpbWl0czIuaGVyb2t1YXBwLmNvbS93aW5uZXJfY29tbWVudHMvUTBOc1pFcjVkaVJEcFlxMg==   You want a
clue? Shout out 'give me a clue'"}
>>> data["message"]
"Awesome! Can you come over here? === R29vZCBqb2IhISBQbGVhc2UgYWNjZXNzIHRvIHRoZSB1cmwgZnJvbSB5b3VyIHdlYiBicm93c2VyLiA9PT0gaHR0
cDovL2NoYWxsZW5nZS15b3VyLWxpbWl0czIuaGVyb2t1YXBwLmNvbS93aW5uZXJfY29tbWVudHMvUTBOc1pFcjVkaVJEcFlxMg==   You want a clue? Shout
out 'give me a clue'"
>>> base64data = data["message"].split()
>>> base64data
['Awesome!', 'Can', 'you', 'come', 'over', 'here?', '===', 'R29vZCBqb2IhISBQbGVhc2UgYWNjZXNzIHRvIHRoZSB1cmwgZnJvbSB5b3VyIHdlYi
Bicm93c2VyLiA9PT0gaHR0cDovL2NoYWxsZW5nZS15b3VyLWxpbWl0czIuaGVyb2t1YXBwLmNvbS93aW5uZXJfY29tbWVudHMvUTBOc1pFcjVkaVJEcFlxMg==', '
You', 'want', 'a', 'clue?', 'Shout', 'out', "'give", 'me', 'a', "clue'"]
>>> base64data[7]
'R29vZCBqb2IhISBQbGVhc2UgYWNjZXNzIHRvIHRoZSB1cmwgZnJvbSB5b3VyIHdlYiBicm93c2VyLiA9PT0gaHR0cDovL2NoYWxsZW5nZS15b3VyLWxpbWl0czIua
GVyb2t1YXBwLmNvbS93aW5uZXJfY29tbWVudHMvUTBOc1pFcjVkaVJEcFlxMg=='




デコードは以下のように
>>> import base64
>>> encode_data = base64data[7]
>>> decode_data = base64.b64decode(encode_data)
>>> decode_data
b'Good job!! Please access to the url from your web browser. === http://challenge-your-limits2.herokuapp.com/winner_comments/Q
0NsZEr5diRDpYq2'



これで終了です、たのしかった