質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

1466閲覧

pythonのコードをrubyへ修正するには

Mkato

総合スコア118

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2015/12/11 09:35

編集2022/01/12 10:55

ruby 2.1.3

Rails 4.2.3

現在あるサービスのAPIを使おうとしており、秘密の鍵などのをPostする所でエラーがでております。

エラー内容はsignatureが間違っているとの事なのですが。。。

私が書いたsignatureを含むPostです。 ※bananceを取得するコードです。

ruby

1 2#秘密の鍵など 3 hogehoge = 'xxxx' 4 public_key = 'xxxx' 5 private_key = 'xxxx' 6 7#balanceのURL 8 uri = URI.parse "https://www.aiueo.com/ccc/balance" 9 nonce = Time.now.to_i.to_s 10 md5prikey = Digest::MD5.hexdigest('private_key') 11 12#messageの部分 13 message = URI.encode() 14 15#signatureの部分 16 signature = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new("sha256"), md5prikey, message) 17 18 https = Net::HTTP.new(uri.host, uri.port) 19 https.use_ssl = true 20 21#Postの部分 22 request = Net::HTTP::Post.new(uri) 23 request.set_form_data({"hogehoge" => hogehoge, "key" => public_key, "nonce" => nonce, "signature" => signature}) 24

API先から頂いたpythonのコード。bananceを取得するコードです。(pythonしか分からないとの事。)

python

1# 秘密の鍵など 2hogehoge = 'aiueo' 3public_key = 'xxxx' 4private_key = 'xxxx' 5 6# send requests 7def request(method, params): 8 Od = OrderedDict() 9 Od['hogehoge'] = hogehoge 10 Od['key'] = public_key 11 Od['nonce'] = long(time.time()) 12 13 for i in params: 14 Od[i] = params[i] 15 16 Od['signature'] = signature(Od) 17 response = requests.post('https://www.aiueo.com/ccc/'+method,data=Od) 18 if response.status_code == 200: 19 print(response.text) 20 21 22# create signature 23def signature(params): 24 message = urllib.urlencode(params) 25 md5prikey = hashlib.md5(private_key).hexdigest() 26 sign = urllib.quote(hmac.new(md5prikey, message, digestmod=hashlib.sha256).hexdigest()) 27 return sign 28 29# get balance 30def balance(): 31 request('balance',{}) 32

プログラム初心者なのでどこが間違っているのか判断出来ていないのですが、

  1. 私(ruby)のmassageの方法が違うのかなーと考えますが如何でしょうか?

修正点など御座いましたらご指摘頂けると幸いです。

python

1message = urllib.urlencode(params)

↑の(params)がよく分かっていません。

python

1# get balance 2def balance(): 3 request('balance',{}) 4

↑def balanceではmethod に balanceが入り、paramsには何も値が入っていないと考えますが。。。

for i in params: Od[i] = params[i]

↑ここで i が代入されているのでしょうか?

rubyで書くと

ruby

1message = URI.encode("i")

の様な感じですかね?

又は

python

1Od['signature'] = signature(Od)

↑ここで↓以下のものが全てdef signature(params):に渡って処理されているのでしょうか?

python

1#これらの値も全てsignatureのparams? 2Od = OrderedDict() 3 Od['hogehoge'] = hogehoge 4 Od['key'] = public_key 5 Od['nonce'] = long(time.time()) 6 7 for i in params: 8 Od[i] = params[i] 9
  1. 他にも修正点又は良い書き方など御座いましたらご指摘頂けると助かります。

宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

クライアント側で、送信前の変数を表示して確認することは可能ですか?
可能であれば、python 側なら、
message = urllib.urlencode(params) の直後に print message
sign = ... の後に pirnt sign
とすることで、message や sign の内容を表示できますので、
それらと対応する Ruby側の変数の値が同じか?を調べてみるのはいかがでしょうか?

あと、md5prikey = Digest::MD5.hexdigest('private_key') は
md5prikey = Digest::MD5.hexdigest(private_key)ではないでしょか?

あと、paramについては、「↑ここで↓以下のものが全てdef signature(params):に渡って処理されているのでしょうか?」が正解だと思われます。

投稿2015/12/11 13:16

hiro-k

総合スコア902

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Mkato

2015/12/11 15:04

ご回答有難う御座います。 pythonを実行出来ればいいのですが、今まで一度も利用環境を構築した事がないので。。。 今何とかPostに成功しbalanceを確認する事が出来ました。これからようやく値を投稿出来る段階に入れそうです。 md5prikey = Digest::MD5.hexdigest('private_key')のご指摘有難う御座います。 おっしゃるとおりですね。お恥ずかしい。 併せてdef signature(params)の回答を頂いだ事により自信をもって設定出来ました。 本当に有難う御座いました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問