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

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

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

cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Q&A

解決済

1回答

4783閲覧

curlでリクエストを送っても期待した結果が返ってこない

saba_111

総合スコア1

cURL

cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

0グッド

0クリップ

投稿2021/01/10 17:23

編集2021/01/11 05:30

はじめに

現在、TwitterのDMから画像を取得するBOTを開発しています。
Pythonでコーディングをしているのですがどうにもうまくいかず、一度試しに公式リファレンスにもあるようにCURLでのリクエストを行おうと考えました。
公式リファレンス,メディアの取得

本来であれば短縮URLが返ってくるようなのですが何も返ってこないため途方に暮れています。

※過去の質問に追記しようかと考えましたが質問の内容が異なっていると判断したため別枠を取らせていただきました。

実現したいこと

リクエストを行い新しく生成されたエンドポイントを入手したい。
あるいはこの状態がどういった状態なのか知りたい。
そもそも応答を得られていないのか、得られているが情報がないのか...。

##コード

curl

1curl --request GET https://ton.twitter.com/1.1/ton/data/dm/1346764289621729285/1346764280792666112/H5AXZKQj.jpg -H "authorization: OAuth oauth_consumer_key=\"*******\", oauth_nonce=\"TekitouNaMojiretsu\", oauth_signature=\"Izcvm5YX4iSiZoBlxJl/V0iJH80%3D\", oauth_signature_method=\"HMAC-SHA1\", oauth_timestamp=\"1610263721\", oauth_token=\"*******\", oauth_version=\"1.0\""

※"の前に\が入っているのは使用しているPCがWindowsのため。\を外してMacでも試したが同様の結果であった。
※oauth_consumer_keyとoauth_tokenは念のため意図的に隠してあります。ご了承ください。

#oauth_signatureを生成するためのコード
参考までにpythonでoauth_signature生成するまでのコード。importの記述漏れがあるかもしれませんがoauth_signatureは問題なく生成できていると思います。

python

1import urllib 2import hashlib 3import hmac 4import base64 5consumer_key='******' 6access_token='******' 7nonce = "TekitouNaMojiretsu" 8timestr = str(int(time())) 9oauth_params = { 10 'oauth_consumer_key': consumer_key, 11 'oauth_nonce': nonce, 12 'oauth_signature': None, 13 'oauth_signature_method': 'HMAC-SHA1', 14 'oauth_timestamp': timestr, 15 'oauth_version': '1.0' 16} 17q_params = {} 18[q_params.update({k: v}) for k, v in oauth_params.items() 19 if k.startswith('oauth') if v is not None] 20sig_key = consumer_key + "&" + access_token 21#urlエンコードを外部サイトで行った(後日変更予定) 22para = "oauth_nonce%3DTekitouNaMojiretsu%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D" + timestr + "%26oauth_version%3D1.0" 23url2 = "https://ton.twitter.com/1.1/ton/data/dm/1346764289621729285/1346764280792666112/H5AXZKQj.jpg" 24sig_data = "GET&" + url2 + "&" + para 25sig = hmac.new(bytes(sig_key, 'utf-8'),bytes(sig_data, 'utf-8'),hashlib.sha1) 26signature = base64.b64encode(sig.digest()).decode('utf-8') 27oauth_params['oauth_signature'] = quote(signature)

--verboseを用いてリクエストを送った際の返答

curl

1curl --verbose https://ton.twitter.com/1.1/ton/data/dm/1346764289621729285/1346764280792666112/H5AXZKQj.jpg -H 'authorization: OAuth oauth_consumer_key="********", oauth_nonce="TekitouNaMojiretsu", oauth_signature="Izcvm5YX4iSiZoBlxJl/V0iJH80%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1610263721", oauth_token="*******", oauth_version="1.0"'
* Trying 104.244.42.84... * TCP_NODELAY set * Connected to ton.twitter.com (104.244.42.84) port 443 (#0) * ALPN, offering h2 * ALPN, offering http/1.1 * Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH * successfully set certificate verify locations: * CAfile: /etc/ssl/cert.pem CApath: none * TLSv1.2 (OUT), TLS handshake, Client hello (1): * TLSv1.2 (IN), TLS handshake, Server hello (2): * TLSv1.2 (IN), TLS handshake, Certificate (11): * TLSv1.2 (IN), TLS handshake, Server key exchange (12): * TLSv1.2 (IN), TLS handshake, Server finished (14): * TLSv1.2 (OUT), TLS handshake, Client key exchange (16): * TLSv1.2 (OUT), TLS change cipher, Client hello (1): * TLSv1.2 (OUT), TLS handshake, Finished (20): * TLSv1.2 (IN), TLS change cipher, Client hello (1): * TLSv1.2 (IN), TLS handshake, Finished (20): * SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256 * ALPN, server accepted to use h2 * Server certificate: * subject: C=US; ST=California; L=San Francisco; O=Twitter, Inc.; OU=tyo3; CN=ton.twitter.com * start date: May 19 00:00:00 2020 GMT * expire date: May 17 12:00:00 2021 GMT * subjectAltName: host "ton.twitter.com" matched cert's "ton.twitter.com" * issuer: C=US; O=DigiCert Inc; OU=www.digicert.com; CN=DigiCert SHA2 High Assurance Server CA * SSL certificate verify ok. * Using HTTP2, server supports multi-use * Connection state changed (HTTP/2 confirmed) * Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0 * Using Stream ID: 1 (easy handle 0x7ff656003c00) > GET /1.1/ton/data/dm/1346764289621729285/1346764280792666112/H5AXZKQj.jpg HTTP/2 > Host: ton.twitter.com > User-Agent: curl/7.54.0 > Accept: */* > authorization: OAuth oauth_consumer_key="1Cg869czeSApuPXjryx87LQSg", oauth_nonce="TekitouNaMojiretsu", oauth_signature="Izcvm5YX4iSiZoBlxJl/V0iJH80%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1610263721", oauth_token="1341974077708271616-cyH9YrFDVzQjnQy0nTFrUU3zHNTv1H", oauth_version="1.0" > * Connection state changed (MAX_CONCURRENT_STREAMS updated)! < HTTP/2 302 < cache-control: no-cache < content-length: 0 < date: Mon, 11 Jan 2021 05:22:24 GMT < location: https://ton.twitter.com/1.1/ton/data/dm/1346764289621729285/1346764280792666112/H5AXZKQj.jpg < server: tsa_m < set-cookie: personalization_id="********"; Max-Age=63072000; Expires=Wed, 11 Jan 2023 05:22:24 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None < set-cookie: guest_id=********; Max-Age=63072000; Expires=Wed, 11 Jan 2023 05:22:24 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None < strict-transport-security: max-age=631138519 < x-connection-hash: 59ab3ccde78507075e6dca4c0af51b7c < x-content-type-options: nosniff < x-response-time: 109 < * Connection #0 to host ton.twitter.com left intact

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

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

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

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

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

otn

2021/01/11 01:04

> 何も返ってこない タイムアウトになると言うことですか? それとも空が返ってくるのですか?その場合は--verboseを付けるとどうですか?
saba_111

2021/01/11 05:37 編集

ご質問ありがとうございます。--verbaseをつけてみたところタイムアウトにはなっていないようです。 調べながらなので詳しい見方はわかりませんが、空が返ってきたと考えてよろしいのでしょうか?また、空が返ってくるとすれば原因は何が考えられるのでしょうか。 ※set-cookieの一部を念の為隠しております。
otn

2021/01/11 06:15

302なので、リダイレクトですね。 curlはデフォルトではリダイレクトを追跡しないので、-L オプションでしょうか。
saba_111

2021/01/11 06:59

返信ありがとうございます。-Lを付けたところ「curl: (47) Maximum (50) redirects followed」というエラーが発生しました。調べたところエラー内容としては「リダイレクトが上限値を超えた」という事で、Cookieを設定すれば回避できるという事らしいのですが合ってますでしょうか。
otn

2021/01/11 07:02

そうですね。送られたCookieを送り返すような指定にしないといけないと思われます。 オプションを調べて指定してください。
saba_111

2021/01/11 07:05

ご丁寧にありがとうございます。頑張って実装してみたいと思います。
guest

回答1

0

自己解決

curlそのものは解決していませんがDMから画像を取得することはできたので解決ということにさせてもらいます。

投稿2021/01/11 15:41

saba_111

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問