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

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

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

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

Twitter

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

解決済

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

saba_111
saba_111

総合スコア1

cURL

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

Twitter

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

1回答

0評価

0クリップ

1597閲覧

投稿2021/01/10 17:23

編集2021/01/11 05:30

はじめに

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

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

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

実現したいこと

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

##コード

curl

curl --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

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

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

curl

curl --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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

cURL

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

Twitter

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